{"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.12.8"},"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":[{"id":"82f4fc7b-f15e-4f1e-a0d2-0b08708ea14a","cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport warnings\nwarnings.filterwarnings('ignore')\n","metadata":{},"outputs":[],"execution_count":null},{"id":"3aa9ddd8-4b99-4628-acb2-64f5559b94c5","cell_type":"code","source":"train = pd.read_csv('train.csv')\nprint(train.shape)\ntrain.head()","metadata":{},"outputs":[],"execution_count":null},{"id":"39a22741-5ed0-48f4-a91a-c7419e97f1e1","cell_type":"code","source":"test = pd.read_csv('test.csv')\nprint(test.shape)\ntest.head()","metadata":{},"outputs":[],"execution_count":null},{"id":"752882f0-d1fb-4f89-ae36-8eb14b59ab48","cell_type":"code","source":"# concating test and train for EDA\ndf = pd.concat([train,test],ignore_index=True)","metadata":{},"outputs":[],"execution_count":null},{"id":"1654dc7e-cf1d-4d9c-824c-b44f2de9bb44","cell_type":"code","source":"pd.set_option(\"display.max_columns\",None)\npd.set_option(\"display.max_rows\",None)\npd.set_option(\"display.width\",None)","metadata":{},"outputs":[],"execution_count":null},{"id":"38fcb3ff-c5dc-4c98-b287-3fe84bb7cb69","cell_type":"code","source":"df.head()","metadata":{},"outputs":[],"execution_count":null},{"id":"c74d9007-9b3d-46d8-aceb-6be64a840e21","cell_type":"code","source":"print(train.shape)\nprint(test.shape)\nprint(df.shape)","metadata":{},"outputs":[],"execution_count":null},{"id":"8540df7f-c921-4f3b-baea-1b51fbf777aa","cell_type":"code","source":"test.head()","metadata":{},"outputs":[],"execution_count":null},{"id":"e5fcfcda-bbb9-4fe1-9519-4aacb5bb8637","cell_type":"code","source":"df.iloc[1200000:].head()","metadata":{},"outputs":[],"execution_count":null},{"id":"1aab0f9f-0b65-425e-8801-8ce02bc3a709","cell_type":"code","source":"# Test set doesnt have saleprice col, since we concated train and test sale price would be null, so imputed with zero\ndf.loc[1200000:,'Premium Amount'] = int(0)","metadata":{},"outputs":[],"execution_count":null},{"id":"d979c111-b3ce-4d11-a699-08f954fb618b","cell_type":"code","source":"# filtering columns with null values greater than 20% \nnull= df.isnull().sum()\nnull_20perc = null[(null/df.shape[0] * 100)>20]/df.shape[0]\nprint(null_20perc) \ncols_to_drop = null_20perc.index.to_list()\ncols_to_drop","metadata":{},"outputs":[],"execution_count":null},{"id":"50fe4f19-f3cf-491e-a536-c83b65b12644","cell_type":"code","source":"others = null[(null.values>0)]\nother_null_cols = others.index.to_list()\nprint(other_null_cols)","metadata":{},"outputs":[],"execution_count":null},{"id":"2b9acc85-23ab-431a-ac79-6328a94d62c9","cell_type":"code","source":"# Impute with median and mode for other null columns\nfor col in other_null_cols:\n    if np.issubdtype(df[col].dtype,np.number):\n        df[col].fillna(df[col].median(),inplace=True)\n    else:\n        df[col].fillna(df[col].mode()[0],inplace=True)","metadata":{},"outputs":[],"execution_count":null},{"id":"50c45894-34fd-476f-89d4-932cb6a223c3","cell_type":"code","source":"df.isnull().sum()","metadata":{},"outputs":[],"execution_count":null},{"id":"1e013c6e-e52d-4fcd-a0c8-2e6e7a01b35f","cell_type":"code","source":"df.info()","metadata":{},"outputs":[],"execution_count":null},{"id":"15d2bcda-5a7f-459d-8207-5e7e21419f30","cell_type":"code","source":"def date_time_conversion(df,date):\n    df[date]=pd.to_datetime(df[date])\n    #date parsings\n    df['year']=df[date].dt.year\n    df['month']=df[date].dt.month\n\n    return df\n\ndf = date_time_conversion(df,'Policy Start Date')","metadata":{},"outputs":[],"execution_count":null},{"id":"3cd1e397-c3e7-45ee-b536-665da5aa968f","cell_type":"code","source":"df = df.drop(columns=['Policy Start Date'],axis=1)\ndf.head()","metadata":{},"outputs":[],"execution_count":null},{"id":"1aee91d9-5905-4919-87e7-d6105bc6d8b6","cell_type":"code","source":"num_cols = df.select_dtypes(include=np.number).columns.to_list()\nnum_cols.remove('id')\nnum_cols","metadata":{},"outputs":[],"execution_count":null},{"id":"5b7779f0-eef6-4942-9b3a-aef0408db2df","cell_type":"code","source":"cat_cols=df.select_dtypes(exclude=np.number).columns.to_list()\ncat_cols","metadata":{},"outputs":[],"execution_count":null},{"id":"8e6e5bce-70fd-44ea-ace0-8a9539f65df7","cell_type":"code","source":"import category_encoders as ce\n\nfreq_code = []\ndummy_code = []\nfor col in cat_cols:\n    length=len(df[col].value_counts().index)\n    if length>4:\n        freq_code.append(col)\n    else:\n        dummy_code.append(col)","metadata":{},"outputs":[],"execution_count":null},{"id":"7f6481d8-9bb1-4ba6-b39e-ee04e27f7295","cell_type":"code","source":"dummy_code","metadata":{},"outputs":[],"execution_count":null},{"id":"aab3aa94-8e48-4b4c-8882-5aff2ab99527","cell_type":"code","source":"freq_code","metadata":{},"outputs":[],"execution_count":null},{"id":"52c293f4-c1be-4034-bc45-e2de1807c05e","cell_type":"code","source":"dummy = ce.OneHotEncoder(cols=dummy_code)\n#freq = ce.CountEncoder(cols=freq_code)\n#targ = ce.TargetEncoder()\ndf_new = df.copy()\ndf_new = df_new.drop(columns=cat_cols,axis=1)\ndf_dummy = dummy.fit_transform(df[dummy_code])\ndf_new = pd.concat([df_new,df_dummy],axis=1)\ndf_new.head()","metadata":{},"outputs":[],"execution_count":null},{"id":"298fc074-962c-4c42-829e-b555c8d9108c","cell_type":"code","source":"targ = ce.TargetEncoder(cols=dummy_code)\ndf_targ = df.copy()\ndf_targ = df_targ.drop(columns=cat_cols,axis=1)\ndf_t = targ.fit_transform(df[dummy_code],df['Premium Amount'])\ndf_targ = pd.concat([df_targ,df_t],axis=1)\ndf_targ.head()","metadata":{},"outputs":[],"execution_count":null},{"id":"ed23e2e2-78fa-4053-a416-cf967b4b7e22","cell_type":"code","source":"print(train.shape)\nprint(test.shape)","metadata":{},"outputs":[],"execution_count":null},{"id":"4edece62-9748-468e-a9ec-fd952b4b2855","cell_type":"code","source":"train_df = df_new.iloc[0:1200000]\ntest_df = df_new.iloc[1200000:]\ntest_df = test_df.drop(columns='Premium Amount',axis=1)","metadata":{},"outputs":[],"execution_count":null},{"id":"315fc2b6-a22a-44b8-9ec1-ee008fe32ae5","cell_type":"code","source":"test_df.reset_index(inplace=True,drop=True)","metadata":{},"outputs":[],"execution_count":null},{"id":"02c24afd-9219-40d0-835d-a08bcdcd320b","cell_type":"code","source":"print(train_df.shape)\nprint(test_df.shape)","metadata":{},"outputs":[],"execution_count":null},{"id":"9c1df75a-eb56-4a5a-8eb6-4a6a27d30045","cell_type":"code","source":"from sklearn.model_selection import cross_val_predict, RandomizedSearchCV, GridSearchCV\nfrom scipy.stats import randint,uniform\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.metrics import mean_squared_error as mse\nfrom xgboost import XGBRegressor \nfrom sklearn.metrics import make_scorer\n","metadata":{},"outputs":[],"execution_count":null},{"id":"62074986-d14b-43a9-959b-7e471d92b62a","cell_type":"code","source":"def rmsle(y_true, y_pred):\n    return np.sqrt(np.mean((np.log1p(y_pred) - np.log1p(y_true)) ** 2))\n    ","metadata":{},"outputs":[],"execution_count":null},{"id":"7ea94332-1388-462c-ab62-bde2642bc639","cell_type":"code","source":"xtrain = train_df.drop(columns=['id','Premium Amount'],axis=1)\nytrain = train_df['Premium Amount']","metadata":{},"outputs":[],"execution_count":null},{"id":"5d86bd37-f4cf-4c84-8dbc-5823b6970987","cell_type":"code","source":"xgb = XGBRegressor(objective='reg:squarederror', n_estimators=100)\n\nxgb.fit(xtrain,ytrain)","metadata":{},"outputs":[],"execution_count":null},{"id":"bb2c00b8-8c2e-454d-b9b5-a68d0f8d0335","cell_type":"code","source":"ypred=cross_val_predict(xgb,xtrain,ytrain,cv=5)\nprint('cross-validation-rmse of XGB',np.sqrt(mse(ytrain,ypred)))","metadata":{},"outputs":[],"execution_count":null},{"id":"f3a8a70f-58a7-4121-8ef0-dbb60e59fe0a","cell_type":"code","source":"y_pred = cross_val_predict(xgb, xtrain, ytrain, cv=5)\n\nscore = rmsle(ytrain, y_pred)\nprint(f'RMSLE: {score}')\n","metadata":{},"outputs":[],"execution_count":null},{"id":"bb468f3c-4cfe-4ed3-a554-f68fec1882ad","cell_type":"code","source":"xgb = XGBRegressor()\n\nxgb_param_grid = {\n    'n_estimators':[100,200],\n    'max_depth':randint(3,10),\n    'learning_rate':uniform(0.01,0.3),\n    'subsample': uniform(0.7,0.9)\n}\n\nxgb_search = RandomizedSearchCV(estimator=xgb,param_distributions=xgb_param_grid,\n                                scoring='neg_mean_squared_error',cv=3,\n                               n_iter=50,random_state=11,verbose=1)\n\nxgb_search.fit(xtrain,ytrain)","metadata":{},"outputs":[],"execution_count":null},{"id":"d958094f-34b0-4309-99bf-814d04a952e5","cell_type":"code","source":"best_xgb_model = xgb_search.best_estimator_\nbest_ypred=cross_val_predict(best_xgb_model,xtrain,ytrain,cv=5)\nprint('cross-validation-rmse of Tuned XGB ',np.sqrt(mse(ytrain,best_ypred)))","metadata":{},"outputs":[],"execution_count":null},{"id":"9131fb51-5513-4e23-93d8-3aa5f811b48c","cell_type":"code","source":"y_pred = cross_val_predict(best_xgb_model, xtrain, ytrain, cv=5)\n\nscore = rmsle(ytrain, y_pred)\nprint(f'RMSLE: {score}')\n","metadata":{},"outputs":[],"execution_count":null},{"id":"c8cfd5f9-956b-4aed-9dc4-89825581558c","cell_type":"markdown","source":"## Submission","metadata":{}},{"id":"50b660e7-7a4e-4333-8022-1bc5f9ab6f7b","cell_type":"code","source":"test.head()","metadata":{},"outputs":[],"execution_count":null},{"id":"0951e562-086b-4aa5-87f9-6fce727b1a76","cell_type":"code","source":"test_df.head()","metadata":{},"outputs":[],"execution_count":null},{"id":"5761c392-ea20-43d9-bcf9-c2af0301b56f","cell_type":"code","source":"preds = best_xgb_model.predict(test_df.drop(columns='id',axis=1))\npreds","metadata":{},"outputs":[],"execution_count":null},{"id":"ebaacdce-aafa-4d86-a8a1-d450c5bb543d","cell_type":"code","source":"submission = pd.concat([test_df['id'],pd.Series(preds)],axis=1,ignore_index=True)\nsubmission.columns = ['id','Premium Amount']\nsubmission.head()","metadata":{},"outputs":[],"execution_count":null},{"id":"f5760de1-d259-4ccc-b08b-659f9f171af0","cell_type":"code","source":"submission.shape","metadata":{},"outputs":[],"execution_count":null},{"id":"3c869b5c-580d-4576-a3dc-7c63a9c191ba","cell_type":"code","source":"submission.to_csv('submission3.csv',index=False)","metadata":{},"outputs":[],"execution_count":null},{"id":"32a6f7bb-ea81-4fa6-b495-3972325e5683","cell_type":"markdown","source":"## XGB with Randomized Hyper parameter tuning was the best model in my case.","metadata":{}},{"id":"dea6ba01-6a5c-4c21-8a42-08fe12ea3b48","cell_type":"markdown","source":"## Further Enhancements-\nFeature Engineering - Create combined polynomial features to improve the model complexity","metadata":{}}]}