{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"}],"dockerImageVersionId":30822,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch, numpy as np, pandas as pd, matplotlib.pyplot as plt\nfrom pathlib import Path\nfrom fastai.tabular.all import *","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings('ignore')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"path = Path('/kaggle/input/playground-series-s4e12')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = pd.read_csv(path/'train.csv')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def extract_features(df):\n    df.columns = df.columns.str.replace(' ', '_')\n    df['Policy_Start_Date'] = pd.to_datetime(df.Policy_Start_Date)\n    date = df.Policy_Start_Date.dt\n    df.drop(['Policy_Start_Date'], axis=1)\n    \n    df['Year'] = date.year.astype(float)\n    df['Month'] = date.month.astype(float)\n    df['Day'] = date.day.astype(float)\n    df['Week']  = date.isocalendar().week.astype(float)\n    df['Weekday'] = date.weekday.astype(float)\n    df['Epoch'] = df.Policy_Start_Date.astype(np.int64) / 10**9\n    \n    df['Year_sin'] = np.sin(2 * np.pi * df.Year)\n    df['Year_cos'] = np.cos(2 * np.pi * df.Year)\n    df['Month_sin'] = np.sin(2 * np.pi * df.Month / 12) \n    df['Month_cos'] = np.cos(2 * np.pi * df.Month / 12)\n    \n    df['Income_Age_Ratio'] = df.Annual_Income / df.Age\n    return df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def fill_null(df):\n    for col in df:\n        if df[col].isna().sum() > 0: df[col + '_na'] = df[col].isna().astype(float)\n    df = df.fillna(df.mode().iloc[0])\n    return df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def split_indeps_deps(df, log=False):\n    indeps = df\n    deps = None\n    if 'id' in df.columns: indeps = df.drop(['id'], axis=1)\n    if 'Premium_Amount' in df.columns:\n        indeps = indeps.drop('Premium_Amount', axis=1)\n        deps = df.Premium_Amount\n        if log: deps = np.log1p(deps)\n    return indeps,deps","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def proc_data(df, log=False):\n    df = extract_features(df)\n    df = fill_null(df)\n    indeps,deps = split_indeps_deps(df, log=log)\n    return indeps,deps","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"indeps,deps = proc_data(df, encode=True)\ndeps_log = np.log1p(deps)\nindeps.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from fastai.data.transforms import RandomSplitter\ntrain_split,valid_split = RandomSplitter(valid_pct=0.2)(df)\ntrain_indeps,train_deps = indeps.iloc[train_split],deps.iloc[train_split]\nvalid_indeps,valid_deps = indeps.iloc[valid_split],deps.iloc[valid_split]","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import mean_squared_log_error\ndef rmsle(preds, targs):\n    preds = np.maximum(0, preds)\n    targs = np.maximum(0, targs)\n    return np.sqrt(mean_squared_log_error(targs, preds))","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"conts,cats = cont_cat_split(df)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dls = TabularDataLoaders.from_df(df, procs=[Categorify, FillMissing, Normalize], cat_names=cats, cont_names=conts,\n                                 y_names='Premium Amount', splits=RandomSplitter(valid_pct=0.2)(range_of(df)), bs=512)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"learn = tabular_learner(dls, metrics=rmse)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"learn.lr_find()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"learn.fit_one_cycle(5)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df = pd.read_csv(path/'test.csv')\nsubmit_df = pd.read_csv(path/'sample_submission.csv')\ntest_indeps,_ = proc_data(test_df, encode=True)\npreds = np.expm1(model.predict(test_indeps))\nsubmit_df['Premium Amount'] = preds\nsubmit_df.to_csv('insurance_v12.csv', index=False)","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}