{"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 numpy as np\nimport pandas as pd\nimport matplotlib as mp\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport warnings\nwarnings.filterwarnings(action=\"ignore\", message=\"^internal gelsd\")\nwarnings.filterwarnings(\"ignore\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:17.980692Z","iopub.execute_input":"2024-12-31T10:53:17.981092Z","iopub.status.idle":"2024-12-31T10:53:19.187475Z","shell.execute_reply.started":"2024-12-31T10:53:17.981048Z","shell.execute_reply":"2024-12-31T10:53:19.186414Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataset_path = \"/kaggle/input/playground-series-s4e12/\"\n\n\ntrain_db = pd.read_csv(dataset_path +'train.csv')\ntest_db = pd.read_csv(dataset_path +'test.csv')\n\n\nsample_db = pd.read_csv(dataset_path + \"sample_submission.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:19.188659Z","iopub.execute_input":"2024-12-31T10:53:19.189084Z","iopub.status.idle":"2024-12-31T10:53:29.835132Z","shell.execute_reply.started":"2024-12-31T10:53:19.189022Z","shell.execute_reply":"2024-12-31T10:53:29.834141Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Train Data Shape: \", train_db.shape)\n\nprint(\"Test Data Shape: \", test_db.shape)\n\nprint(\"Sample Data Shape: \", sample_db.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:29.837551Z","iopub.execute_input":"2024-12-31T10:53:29.838086Z","iopub.status.idle":"2024-12-31T10:53:29.84533Z","shell.execute_reply.started":"2024-12-31T10:53:29.838017Z","shell.execute_reply":"2024-12-31T10:53:29.844161Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_db.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:29.846723Z","iopub.execute_input":"2024-12-31T10:53:29.847548Z","iopub.status.idle":"2024-12-31T10:53:29.896309Z","shell.execute_reply.started":"2024-12-31T10:53:29.847521Z","shell.execute_reply":"2024-12-31T10:53:29.895374Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_db.columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:29.896991Z","iopub.execute_input":"2024-12-31T10:53:29.897332Z","iopub.status.idle":"2024-12-31T10:53:29.904666Z","shell.execute_reply.started":"2024-12-31T10:53:29.897296Z","shell.execute_reply":"2024-12-31T10:53:29.903524Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Key Factors for Premium are:\n\n1. Age\n2. Gender\n3. Annual Income\n4. Marital Status\n5. Number of Dependents\n6. Health Score\n7. Location\n8. Policy Type\n9. Previous Claims\n10. Insurance Duration\n11. Policy Start Date\n12. Smoking Status\n13. Exercise Frequency","metadata":{}},{"cell_type":"code","source":"columns = ['Age', 'Gender', 'Annual Income', 'Marital Status',\n       'Number of Dependents', 'Health Score',\n       'Location', 'Policy Type', 'Previous Claims', \n        'Insurance Duration', 'Policy Start Date',\n       'Smoking Status', 'Exercise Frequency',\n        'Premium Amount']\n\ntrain_db = train_db[columns]\n\ntrain_db.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:29.905781Z","iopub.execute_input":"2024-12-31T10:53:29.906059Z","iopub.status.idle":"2024-12-31T10:53:30.046324Z","shell.execute_reply.started":"2024-12-31T10:53:29.906006Z","shell.execute_reply":"2024-12-31T10:53:30.045368Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_db.tail()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:30.047234Z","iopub.execute_input":"2024-12-31T10:53:30.047463Z","iopub.status.idle":"2024-12-31T10:53:30.063737Z","shell.execute_reply.started":"2024-12-31T10:53:30.047442Z","shell.execute_reply":"2024-12-31T10:53:30.062581Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_db.isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:30.066835Z","iopub.execute_input":"2024-12-31T10:53:30.067148Z","iopub.status.idle":"2024-12-31T10:53:30.472585Z","shell.execute_reply.started":"2024-12-31T10:53:30.067122Z","shell.execute_reply":"2024-12-31T10:53:30.471578Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# percent data which is null\n\n(train_db.isna().sum()/train_db.shape[0])*100","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:30.474007Z","iopub.execute_input":"2024-12-31T10:53:30.474264Z","iopub.status.idle":"2024-12-31T10:53:30.966279Z","shell.execute_reply.started":"2024-12-31T10:53:30.474242Z","shell.execute_reply":"2024-12-31T10:53:30.965175Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Since previous claim missing value is more than 30%, we can remove it\n\ntrain_db.drop(\"Previous Claims\", axis=1, inplace=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:30.967305Z","iopub.execute_input":"2024-12-31T10:53:30.967625Z","iopub.status.idle":"2024-12-31T10:53:31.094224Z","shell.execute_reply.started":"2024-12-31T10:53:30.967595Z","shell.execute_reply":"2024-12-31T10:53:31.093162Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"temp_df = train_db.dropna(axis=0)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:31.095351Z","iopub.execute_input":"2024-12-31T10:53:31.095664Z","iopub.status.idle":"2024-12-31T10:53:31.662611Z","shell.execute_reply.started":"2024-12-31T10:53:31.095633Z","shell.execute_reply":"2024-12-31T10:53:31.661473Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"temp_df.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:31.663751Z","iopub.execute_input":"2024-12-31T10:53:31.664142Z","iopub.status.idle":"2024-12-31T10:53:31.671221Z","shell.execute_reply.started":"2024-12-31T10:53:31.6641Z","shell.execute_reply":"2024-12-31T10:53:31.670172Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"temp_df.columns","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:31.672045Z","iopub.execute_input":"2024-12-31T10:53:31.673088Z","iopub.status.idle":"2024-12-31T10:53:31.687504Z","shell.execute_reply.started":"2024-12-31T10:53:31.673013Z","shell.execute_reply":"2024-12-31T10:53:31.686667Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"categorical_cols = ['Gender', 'Marital Status', 'Location', 'Policy Type', 'Smoking Status', 'Exercise Frequency']\nnumerical_cols = ['Age', 'Annual Income', 'Number of Dependents', 'Health Score', 'Insurance Duration', 'Premium Amount']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:31.688816Z","iopub.execute_input":"2024-12-31T10:53:31.689352Z","iopub.status.idle":"2024-12-31T10:53:31.699815Z","shell.execute_reply.started":"2024-12-31T10:53:31.689314Z","shell.execute_reply":"2024-12-31T10:53:31.698758Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cat_data = temp_df[categorical_cols]\nnum_data = temp_df.drop(categorical_cols, axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:31.700722Z","iopub.execute_input":"2024-12-31T10:53:31.701097Z","iopub.status.idle":"2024-12-31T10:53:31.81377Z","shell.execute_reply.started":"2024-12-31T10:53:31.701055Z","shell.execute_reply":"2024-12-31T10:53:31.812369Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cat_data","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:31.815108Z","iopub.execute_input":"2024-12-31T10:53:31.815505Z","iopub.status.idle":"2024-12-31T10:53:31.830227Z","shell.execute_reply.started":"2024-12-31T10:53:31.815464Z","shell.execute_reply":"2024-12-31T10:53:31.828643Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import OneHotEncoder","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:31.831526Z","iopub.execute_input":"2024-12-31T10:53:31.8328Z","iopub.status.idle":"2024-12-31T10:53:31.91175Z","shell.execute_reply.started":"2024-12-31T10:53:31.83276Z","shell.execute_reply":"2024-12-31T10:53:31.910642Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ohe = OneHotEncoder(drop='first')\ncat_enc = ohe.fit_transform(cat_data)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:31.912885Z","iopub.execute_input":"2024-12-31T10:53:31.913349Z","iopub.status.idle":"2024-12-31T10:53:33.862136Z","shell.execute_reply.started":"2024-12-31T10:53:31.913266Z","shell.execute_reply":"2024-12-31T10:53:33.860919Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cat_data = pd.DataFrame(cat_enc.toarray(), columns=list(ohe.get_feature_names_out(categorical_cols)))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:33.863282Z","iopub.execute_input":"2024-12-31T10:53:33.863552Z","iopub.status.idle":"2024-12-31T10:53:34.030608Z","shell.execute_reply.started":"2024-12-31T10:53:33.863528Z","shell.execute_reply":"2024-12-31T10:53:34.029576Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cat_data.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:34.03161Z","iopub.execute_input":"2024-12-31T10:53:34.031872Z","iopub.status.idle":"2024-12-31T10:53:34.049842Z","shell.execute_reply.started":"2024-12-31T10:53:34.031849Z","shell.execute_reply":"2024-12-31T10:53:34.048455Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Numerical Data\nnum_data.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:34.050942Z","iopub.execute_input":"2024-12-31T10:53:34.05132Z","iopub.status.idle":"2024-12-31T10:53:34.078528Z","shell.execute_reply.started":"2024-12-31T10:53:34.051284Z","shell.execute_reply":"2024-12-31T10:53:34.07736Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"num_data.drop(\"Policy Start Date\", axis=1, inplace=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:34.07971Z","iopub.execute_input":"2024-12-31T10:53:34.080128Z","iopub.status.idle":"2024-12-31T10:53:34.114233Z","shell.execute_reply.started":"2024-12-31T10:53:34.080092Z","shell.execute_reply":"2024-12-31T10:53:34.113196Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sns.heatmap(num_data.corr(), annot=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:34.118632Z","iopub.execute_input":"2024-12-31T10:53:34.118917Z","iopub.status.idle":"2024-12-31T10:53:34.685959Z","shell.execute_reply.started":"2024-12-31T10:53:34.118893Z","shell.execute_reply":"2024-12-31T10:53:34.684749Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sns.pairplot(num_data)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:53:34.687697Z","iopub.execute_input":"2024-12-31T10:53:34.687957Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"target_data = num_data[\"Premium Amount\"]\nnum_data.drop(\"Premium Amount\", axis=1, inplace=True)\nnum_data.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:55:33.197353Z","iopub.execute_input":"2024-12-31T10:55:33.197805Z","iopub.status.idle":"2024-12-31T10:55:33.236377Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"- health score and insurance duration is directly affecting premium amount.\n- Age is likely an important factor in predicting Premium Amount, as age often correlates with health risks and insurance policies' pricing.\n  ","metadata":{}},{"cell_type":"markdown","source":"We need to transform the numerical data to a common scale","metadata":{}},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:55:33.237806Z","iopub.execute_input":"2024-12-31T10:55:33.238214Z","iopub.status.idle":"2024-12-31T10:55:33.242505Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sc = StandardScaler()\nnum_scaled_data = sc.fit_transform(num_data)\nnum_scaled_data = pd.DataFrame(num_scaled_data, columns=num_data.columns)\nnum_scaled_data.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:55:33.243615Z","iopub.execute_input":"2024-12-31T10:55:33.244001Z","iopub.status.idle":"2024-12-31T10:55:33.3382Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Combining the data\nnew_data = pd.concat([num_scaled_data, cat_data], axis=1)\nnew_data.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:55:33.339511Z","iopub.execute_input":"2024-12-31T10:55:33.339942Z","iopub.status.idle":"2024-12-31T10:55:33.47967Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(12, 8))\nsns.heatmap(new_data.corr(), annot=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:55:33.480643Z","iopub.execute_input":"2024-12-31T10:55:33.480933Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ntrain_x, test_x, train_y, test_y = train_test_split(new_data, target_data, test_size=0.25)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:55:35.386821Z","iopub.execute_input":"2024-12-31T10:55:35.38713Z","iopub.status.idle":"2024-12-31T10:55:35.684629Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import  GridSearchCV\nfrom sklearn.linear_model import LinearRegression, Ridge, Lasso\nfrom sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor\nfrom sklearn.svm import SVR\nfrom sklearn.metrics import make_scorer, r2_score\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.pipeline import Pipeline\n\n# Custom RMSLE function\ndef rmsle(y_true, y_pred):\n    return np.sqrt(np.mean((np.log1p(y_pred) - np.log1p(y_true)) ** 2))\n    \n# Define models and hyperparameter grids\nmodels_and_parameters = {\n    'Linear Regression': {\n        'model': LinearRegression(),\n        'params': {}\n    },\n    'Ridge Regression': {\n        'model': Ridge(),\n        'params': {'alpha': [0.1, 1.0, 10.0, 100.0]}\n    },\n    'Lasso Regression': {\n        'model': Lasso(),\n        'params': {'alpha': [0.01, 0.1, 1.0, 10.0]}\n    },\n    # 'Random Forest': {\n    #     'model': RandomForestRegressor(),\n    #     'params': {'n_estimators': [50, 100, 200],\n    #                'max_depth': [None, 10, 20],\n    #                'min_samples_split': [2, 5]}\n    # },\n    # 'Gradient Boosting': {\n    #     'model': GradientBoostingRegressor(),\n    #     'params': {'n_estimators': [50, 100, 200],\n    #                'learning_rate': [0.01, 0.1, 0.2],\n    #                'max_depth': [3, 5, 10]}\n    # },\n    # 'Support Vector Regression': {\n    #     'model': SVR(),\n    #     'params': {'kernel': ['linear', 'rbf'],\n    #                'C': [0.1, 1.0, 10.0],\n    #                'gamma': ['scale', 'auto']}\n    # }\n}\n\n# Perform hyperparameter tuning\nresults = []\nfor name, config in models_and_parameters.items():\n    print(f\"Tuning {name}...\")\n    \n    # Add verbose=2 to GridSearchCV for detailed output\n    grid = GridSearchCV(config['model'], config['params'], scoring=make_scorer(rmsle, greater_is_better=False), \n                        cv=5, n_jobs=-1, verbose=2)\n    grid.fit(train_x, train_y)\n    \n    best_model = grid.best_estimator_\n    y_pred = best_model.predict(test_x)\n    \n    # Evaluate RMSLE and R²\n    rmsle_value = rmsle(test_y, y_pred)\n    r2_value = r2_score(test_y, y_pred)\n    \n    print(f\"Best Parameters for {name}: {grid.best_params_}\")\n    print(f\"RMSLE for {name}: {rmsle_value}\")\n    print(f\"R² for {name}: {r2_value}\")\n    \n    results.append({\n        'Model Name': name,\n        'Model': best_model,\n        'Best Params': grid.best_params_,\n        'RMSLE': -rmsle_value,  # Negating to align with sklearn's scoring convention\n        'R²': r2_value\n    })\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:55:35.694537Z","iopub.execute_input":"2024-12-31T10:55:35.694956Z","iopub.status.idle":"2024-12-31T10:55:47.56857Z","shell.execute_reply.started":"2024-12-31T10:55:35.694919Z","shell.execute_reply":"2024-12-31T10:55:47.567168Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Select the best model based on lowest RMSLE\nbest_model_name = None\nbest_model = None\nbest_params = None\nlowest_rmsle = float('inf')\n\nfor result in results:\n    if abs(result['RMSLE']) < lowest_rmsle:\n        lowest_rmsle = abs(result['RMSLE'])\n        best_model_name = result['Model Name']\n        best_params = result['Best Params']\n        best_model = result['Model']\n\nprint(f\"Best Model: {best_model_name}\")\nprint(f\"Best Parameters: {best_params}\")\nprint(f\"Lowest RMSLE: {lowest_rmsle}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:55:47.569867Z","iopub.execute_input":"2024-12-31T10:55:47.570338Z","iopub.status.idle":"2024-12-31T10:55:47.597122Z","shell.execute_reply.started":"2024-12-31T10:55:47.570291Z","shell.execute_reply":"2024-12-31T10:55:47.595714Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def test_pipeline(test_data):\n    test_cat = test_db[categorical_cols]\n    test_num = test_db[numerical_cols[:-1]]\n    \n    for col in test_cat.columns:  # Iterate over categorical columns\n        most_frequent = test_cat[col].mode()[0]\n        test_cat[col].fillna(most_frequent, inplace=True)\n    \n    # Fill missing values in numerical columns with their mean\n    for col in test_num.columns:  # Select numerical columns\n        mean_value = test_num[col].mean()  # Calculate mean\n        test_num[col].fillna(mean_value, inplace=True)\n    \n    # onehot encoding\n    test_cat_enc = ohe.transform(test_cat)\n    test_cat_enc_data = pd.DataFrame(test_cat_enc.toarray(), columns=list(ohe.get_feature_names_out(categorical_cols)))\n    \n    # scaling numerical data\n    test_num_scaled = sc.transform(test_num)\n    test_num_scaled = pd.DataFrame(test_num_scaled, columns=test_num.columns)\n    \n    test_new_data = pd.concat([test_num_scaled, test_cat_enc_data], axis=1)\n    test_pred = best_model.predict(test_new_data)\n    test_data['Predicted Premium'] = test_pred\n    return test_data[['id','Predicted Premium']]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:58:36.246361Z","iopub.execute_input":"2024-12-31T10:58:36.246724Z","iopub.status.idle":"2024-12-31T10:58:36.253447Z","shell.execute_reply.started":"2024-12-31T10:58:36.246695Z","shell.execute_reply":"2024-12-31T10:58:36.252382Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_pipeline(test_db)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-31T10:58:37.463195Z","iopub.execute_input":"2024-12-31T10:58:37.463502Z","iopub.status.idle":"2024-12-31T10:58:39.877452Z","shell.execute_reply.started":"2024-12-31T10:58:37.463478Z","shell.execute_reply":"2024-12-31T10:58:39.876121Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}