{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"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"},"colab":{"provenance":[{"file_id":"1fNBZFwnSVWWpBEDmT_oJ1Ek3HSeuf1e1","timestamp":1735137418478}],"collapsed_sections":["4sH969AvpHTe","sx19BlrJtCUY","9mQtOHRlsTBs","SCpr21cIiiKv","Iyufy5XPWGv6","HRBwecr7tNk3","9qDYoZA_fuc1"],"authorship_tag":"ABX9TyPulO9pmuI71gPf2nxc5hh0"},"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":"markdown","source":"# Feedback is highly appreciated","metadata":{}},{"cell_type":"markdown","source":"# Importing data","metadata":{"id":"4sH969AvpHTe"}},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:12.383748Z","iopub.execute_input":"2024-12-25T16:36:12.384087Z","iopub.status.idle":"2024-12-25T16:36:12.393329Z","shell.execute_reply.started":"2024-12-25T16:36:12.38406Z","shell.execute_reply":"2024-12-25T16:36:12.392138Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# IMPORTING LIBRARIES","metadata":{"id":"sx19BlrJtCUY"}},{"cell_type":"code","source":"!pip install catboost","metadata":{"id":"yLXV4149FXKb","executionInfo":{"status":"ok","timestamp":1734964974931,"user_tz":-330,"elapsed":5775,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"bbdd8622-b9fd-4f84-ecd1-28e875b96edc","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:12.39494Z","iopub.execute_input":"2024-12-25T16:36:12.395434Z","iopub.status.idle":"2024-12-25T16:36:18.611626Z","shell.execute_reply.started":"2024-12-25T16:36:12.395328Z","shell.execute_reply":"2024-12-25T16:36:18.610418Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install optuna","metadata":{"id":"ieleEuFLadOs","executionInfo":{"status":"ok","timestamp":1734964978359,"user_tz":-330,"elapsed":3434,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"000c4b76-e6aa-43d2-8e11-211f7aa7eec4","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:18.613901Z","iopub.execute_input":"2024-12-25T16:36:18.614221Z","iopub.status.idle":"2024-12-25T16:36:22.69954Z","shell.execute_reply.started":"2024-12-25T16:36:18.614194Z","shell.execute_reply":"2024-12-25T16:36:22.698305Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nfrom sklearn.impute import KNNImputer, SimpleImputer\nfrom sklearn.experimental import enable_iterative_imputer\nfrom sklearn.impute import IterativeImputer\nfrom scipy.stats import boxcox\nfrom sklearn.preprocessing import StandardScaler, LabelEncoder, OrdinalEncoder\n\n\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"id":"Q1-_ZJv8tG3q","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:22.701287Z","iopub.execute_input":"2024-12-25T16:36:22.701632Z","iopub.status.idle":"2024-12-25T16:36:23.17797Z","shell.execute_reply.started":"2024-12-25T16:36:22.701589Z","shell.execute_reply":"2024-12-25T16:36:23.177014Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from scipy.stats import boxcox","metadata":{"id":"4KTjUmvEfP-5","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:23.179254Z","iopub.execute_input":"2024-12-25T16:36:23.179695Z","iopub.status.idle":"2024-12-25T16:36:23.183994Z","shell.execute_reply.started":"2024-12-25T16:36:23.179664Z","shell.execute_reply":"2024-12-25T16:36:23.182698Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split, cross_val_score, KFold\nfrom sklearn.metrics import mean_squared_log_error, mean_squared_error, mean_absolute_error, r2_score\n\nfrom xgboost import XGBRegressor\nfrom catboost import CatBoostRegressor\nfrom lightgbm import LGBMRegressor\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.ensemble import GradientBoostingRegressor","metadata":{"id":"Ya9Gn2w2-MK9","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:23.185179Z","iopub.execute_input":"2024-12-25T16:36:23.185577Z","iopub.status.idle":"2024-12-25T16:36:26.386765Z","shell.execute_reply.started":"2024-12-25T16:36:23.185512Z","shell.execute_reply":"2024-12-25T16:36:26.385724Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# EDA","metadata":{"id":"9mQtOHRlsTBs"}},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/playground-series-s4e12/train.csv')\ntest = pd.read_csv('/kaggle/input/playground-series-s4e12/test.csv')\nsample_submission = pd.read_csv('/kaggle/input/playground-series-s4e12/sample_submission.csv')","metadata":{"id":"4o24nJwkr2if","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:26.389252Z","iopub.execute_input":"2024-12-25T16:36:26.389905Z","iopub.status.idle":"2024-12-25T16:36:38.016669Z","shell.execute_reply.started":"2024-12-25T16:36:26.389872Z","shell.execute_reply":"2024-12-25T16:36:38.015675Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.drop('id',axis=1,inplace=True)\ntest.drop('id',axis=1,inplace=True)","metadata":{"id":"j4FL1hYYs--C","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:38.0182Z","iopub.execute_input":"2024-12-25T16:36:38.018596Z","iopub.status.idle":"2024-12-25T16:36:38.388154Z","shell.execute_reply.started":"2024-12-25T16:36:38.018564Z","shell.execute_reply":"2024-12-25T16:36:38.386979Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pd.set_option('display.max_columns',None)\ntrain.head(8)","metadata":{"id":"gj1X1duHt06S","executionInfo":{"status":"ok","timestamp":1734965001814,"user_tz":-330,"elapsed":743,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"9debc241-9c7b-4c1c-f418-5b08d3be4625","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:38.389371Z","iopub.execute_input":"2024-12-25T16:36:38.38981Z","iopub.status.idle":"2024-12-25T16:36:38.420835Z","shell.execute_reply.started":"2024-12-25T16:36:38.389766Z","shell.execute_reply":"2024-12-25T16:36:38.419761Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f'Number of features: {train.shape[1]}')\nprint(f'Number of rows in training: {train.shape[0]}')\nprint(f'Number of rows in testing: {test.shape[0]}')","metadata":{"id":"Ovivgbr7tbUH","executionInfo":{"status":"ok","timestamp":1734965001815,"user_tz":-330,"elapsed":5,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"09e52ee7-3759-4480-e716-79625bac8dea","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:38.42204Z","iopub.execute_input":"2024-12-25T16:36:38.422442Z","iopub.status.idle":"2024-12-25T16:36:38.428293Z","shell.execute_reply.started":"2024-12-25T16:36:38.422404Z","shell.execute_reply":"2024-12-25T16:36:38.427161Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.info()","metadata":{"id":"V8jUjfqWtrSu","executionInfo":{"status":"ok","timestamp":1734965003821,"user_tz":-330,"elapsed":2011,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"3653fdb4-0ed7-4b5b-aa94-7322ff19b205","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:38.429513Z","iopub.execute_input":"2024-12-25T16:36:38.429872Z","iopub.status.idle":"2024-12-25T16:36:39.092841Z","shell.execute_reply.started":"2024-12-25T16:36:38.429845Z","shell.execute_reply":"2024-12-25T16:36:39.091525Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test.info()","metadata":{"id":"zdIsKmSv6SYN","executionInfo":{"status":"ok","timestamp":1734965006662,"user_tz":-330,"elapsed":2844,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"0c222ee9-27c3-4d30-c50c-7fd14fd0847e","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:39.093879Z","iopub.execute_input":"2024-12-25T16:36:39.094182Z","iopub.status.idle":"2024-12-25T16:36:39.516961Z","shell.execute_reply.started":"2024-12-25T16:36:39.094142Z","shell.execute_reply":"2024-12-25T16:36:39.515762Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#There is a datetime feature so lets handle it separately first\ntrain['Policy Start Date'] = pd.to_datetime(train['Policy Start Date'])\ntrain['Policy Start Day'] = train['Policy Start Date'].dt.day\ntrain['Policy Start Month'] = train['Policy Start Date'].dt.month\ntrain['Policy Start Year'] = train['Policy Start Date'].dt.year\n\n#since days and months are cyclic we should have a feature representing them as such\ntrain['Policy Start Date (sin)']=np.sin(2*np.pi*train['Policy Start Day']/31)\ntrain['Policy Start Month (sin)']=np.sin(2*np.pi*train['Policy Start Month']/12)\n\ntrain.drop('Policy Start Date',axis=1,inplace=True)\ntrain.head(5)","metadata":{"id":"lyekmvf3xttE","executionInfo":{"status":"ok","timestamp":1734965011368,"user_tz":-330,"elapsed":4708,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"2ef1a9d5-3deb-4e6c-d2c3-396532c38bc9","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:39.518184Z","iopub.execute_input":"2024-12-25T16:36:39.518622Z","iopub.status.idle":"2024-12-25T16:36:40.420894Z","shell.execute_reply.started":"2024-12-25T16:36:39.518579Z","shell.execute_reply":"2024-12-25T16:36:40.419775Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#There is a datetime feature so lets handle it separately first\ntest['Policy Start Date'] = pd.to_datetime(test['Policy Start Date'])\ntest['Policy Start Day'] = test['Policy Start Date'].dt.day\ntest['Policy Start Month'] = test['Policy Start Date'].dt.month\ntest['Policy Start Year'] = test['Policy Start Date'].dt.year\n\n#since days and months are cyclic we should have a feature representing them as such\ntest['Policy Start Date (sin)']=np.sin(2*np.pi*test['Policy Start Day']/31)\ntest['Policy Start Month (sin)']=np.sin(2*np.pi*test['Policy Start Month']/12)\n\ntest.drop('Policy Start Date',axis=1,inplace=True)\ntest.head(5)","metadata":{"id":"Kj5vPBZc6W5D","executionInfo":{"status":"ok","timestamp":1734965013311,"user_tz":-330,"elapsed":1946,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"4090262b-deb5-4920-b755-fca03e19d329","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:40.422066Z","iopub.execute_input":"2024-12-25T16:36:40.422386Z","iopub.status.idle":"2024-12-25T16:36:41.085172Z","shell.execute_reply.started":"2024-12-25T16:36:40.422345Z","shell.execute_reply":"2024-12-25T16:36:41.08381Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.isna().sum()","metadata":{"id":"SoiYvGhwu4vc","executionInfo":{"status":"ok","timestamp":1734965014868,"user_tz":-330,"elapsed":1562,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"fbfc98e5-4ca9-43de-e82d-08aaa8507c01","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:41.086458Z","iopub.execute_input":"2024-12-25T16:36:41.086919Z","iopub.status.idle":"2024-12-25T16:36:41.652681Z","shell.execute_reply.started":"2024-12-25T16:36:41.086886Z","shell.execute_reply":"2024-12-25T16:36:41.651445Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test.isna().sum()","metadata":{"id":"18w6sfcU6nkG","executionInfo":{"status":"ok","timestamp":1734965016366,"user_tz":-330,"elapsed":1500,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"39801c6b-d772-4de0-a994-3894369a5ed6","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:41.653899Z","iopub.execute_input":"2024-12-25T16:36:41.654294Z","iopub.status.idle":"2024-12-25T16:36:42.035141Z","shell.execute_reply.started":"2024-12-25T16:36:41.654253Z","shell.execute_reply":"2024-12-25T16:36:42.033803Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.describe().round(3)","metadata":{"id":"hJrGWSoYvGLU","executionInfo":{"status":"ok","timestamp":1734965018230,"user_tz":-330,"elapsed":1866,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"77f87e1d-d35b-4e72-c323-4abda574a29a","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:42.036257Z","iopub.execute_input":"2024-12-25T16:36:42.036679Z","iopub.status.idle":"2024-12-25T16:36:43.054125Z","shell.execute_reply.started":"2024-12-25T16:36:42.036638Z","shell.execute_reply":"2024-12-25T16:36:43.052781Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.nunique()","metadata":{"id":"vqGqFi7FwMwQ","executionInfo":{"status":"ok","timestamp":1734965020147,"user_tz":-330,"elapsed":1920,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"56d539e4-9826-4507-b192-1ca307bec82a","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:43.055782Z","iopub.execute_input":"2024-12-25T16:36:43.056109Z","iopub.status.idle":"2024-12-25T16:36:43.889435Z","shell.execute_reply.started":"2024-12-25T16:36:43.056078Z","shell.execute_reply":"2024-12-25T16:36:43.888342Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"numeric_cols=[]\ncategorical_cols=[]\nfor col in train.columns:\n    if train[col].dtype=='object':\n        categorical_cols.append(col)\n    else:\n        numeric_cols.append(col)\n\nprint(f'Numeric Columns: {numeric_cols} \\n')\nprint(f'Categorical Columns: {categorical_cols}')","metadata":{"id":"kigpxi1A1vD1","executionInfo":{"status":"ok","timestamp":1734965020147,"user_tz":-330,"elapsed":5,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"cf79161a-1607-45ed-cbb9-0376c3b3a6de","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:43.894581Z","iopub.execute_input":"2024-12-25T16:36:43.895073Z","iopub.status.idle":"2024-12-25T16:36:43.901916Z","shell.execute_reply.started":"2024-12-25T16:36:43.895035Z","shell.execute_reply":"2024-12-25T16:36:43.900785Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for col in categorical_cols:\n    print(f'{col}: {train[col].unique()}')","metadata":{"id":"TnLZvnGpnUuM","executionInfo":{"status":"ok","timestamp":1734965020577,"user_tz":-330,"elapsed":433,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"b1b27489-9fb4-486f-e069-4c6c2dce6033","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:43.905035Z","iopub.execute_input":"2024-12-25T16:36:43.905319Z","iopub.status.idle":"2024-12-25T16:36:44.496195Z","shell.execute_reply.started":"2024-12-25T16:36:43.905296Z","shell.execute_reply":"2024-12-25T16:36:44.495001Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"nominal_cols=['Gender','Marital Status','Smoking Status']\nordinal_cols=[\n'Education Level',\n 'Location',\n 'Policy Type',\n 'Customer Feedback',\n 'Occupation',\n 'Exercise Frequency',\n 'Property Type']","metadata":{"id":"Hy5vg_RJLiYd","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:44.497182Z","iopub.execute_input":"2024-12-25T16:36:44.497485Z","iopub.status.idle":"2024-12-25T16:36:44.501836Z","shell.execute_reply.started":"2024-12-25T16:36:44.497457Z","shell.execute_reply":"2024-12-25T16:36:44.50073Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"target_col='Premium Amount'\nnumeric_cols=['Age',\n 'Annual Income',\n 'Number of Dependents',\n 'Health Score',\n 'Previous Claims',\n 'Vehicle Age',\n 'Credit Score',\n 'Insurance Duration',\n 'Policy Start Day',\n 'Policy Start Month',\n 'Policy Start Year',\n 'Policy Start Date (sin)',\n 'Policy Start Month (sin)']","metadata":{"id":"fpXOJXFYLA4O","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:44.503272Z","iopub.execute_input":"2024-12-25T16:36:44.503619Z","iopub.status.idle":"2024-12-25T16:36:44.508262Z","shell.execute_reply.started":"2024-12-25T16:36:44.50358Z","shell.execute_reply":"2024-12-25T16:36:44.507138Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for col in numeric_cols:\n    plt.figure(figsize=(12, 6))\n    sns.kdeplot(train[col], shade=True)\n    plt.title(f'KDE Plot of {col}')\n    plt.xlabel(col)\n    plt.ylabel('Density')\n    plt.show()","metadata":{"id":"kanSoBsQvgLG","executionInfo":{"status":"ok","timestamp":1734866330189,"user_tz":-330,"elapsed":94971,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"09215114-b4c1-4b49-bd62-e6f7e3d3b313","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:36:44.509385Z","iopub.execute_input":"2024-12-25T16:36:44.509869Z","iopub.status.idle":"2024-12-25T16:37:51.176354Z","shell.execute_reply.started":"2024-12-25T16:36:44.509828Z","shell.execute_reply":"2024-12-25T16:37:51.1752Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns\n\nfor col in categorical_cols:\n    plt.figure(figsize=(12, 6))\n\n    # Include NaN counts as a separate category\n    category_counts = train[col].value_counts(dropna=False)\n\n    # Convert any NaN in the index to the string \"NaN\" for nicer labeling\n    category_labels = category_counts.index.astype(str)\n\n    # Plot the barplot\n    ax = sns.barplot(x=category_labels, y=category_counts.values)\n\n    # Add count labels on top of each bar\n    for i, value in enumerate(category_counts.values):\n        plt.text(i, value + 0.05, str(value),\n                 ha='center', va='bottom', fontsize=12, color='black')\n\n    # Add titles and labels\n    plt.title(f'Bar Plot of {col}', fontsize=14)\n    plt.xlabel(col, fontsize=12)\n    plt.ylabel('Count', fontsize=12)\n\n    plt.show()\n    print('\\n')\n","metadata":{"id":"2p6z0MeWv22j","executionInfo":{"status":"ok","timestamp":1734867349141,"user_tz":-330,"elapsed":5660,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"fe81f014-c0b8-4b80-e72c-ec3f103c374a","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:37:51.177529Z","iopub.execute_input":"2024-12-25T16:37:51.17789Z","iopub.status.idle":"2024-12-25T16:37:53.762259Z","shell.execute_reply.started":"2024-12-25T16:37:51.17786Z","shell.execute_reply":"2024-12-25T16:37:53.760961Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"null_counts = train.isnull().sum()\nnull_cols = null_counts[null_counts > 0]\n\nplt.figure(figsize=(12, 6))\nbars = plt.barh(null_cols.index, null_cols.values)\n\nfor bar, value in zip(bars, null_cols.values):\n    plt.text(value, bar.get_y() + bar.get_height() / 2, f\"{value}\", va='center', ha='left')\n\nplt.xlabel('Number of Null Values')\nplt.title('Null Values per Column')\nplt.tight_layout()\nplt.show()\n\nfor col in null_cols.index:\n    col_type = 'Numeric' if pd.api.types.is_numeric_dtype(train[col]) else 'Categorical'\n    print(f\"{col}: {col_type}\")","metadata":{"id":"Vw51damO5VRw","executionInfo":{"status":"ok","timestamp":1734866337482,"user_tz":-330,"elapsed":1159,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"ba9ca504-bf1c-4ce2-cd2e-4426d4934d4d","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:37:53.763633Z","iopub.execute_input":"2024-12-25T16:37:53.764076Z","iopub.status.idle":"2024-12-25T16:37:54.605102Z","shell.execute_reply.started":"2024-12-25T16:37:53.764037Z","shell.execute_reply":"2024-12-25T16:37:54.603824Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"skewness = train[numeric_cols].skew()\n\nskewed_cols = skewness[abs(skewness) > 0.5]\n\nprint(\"Skewness of numeric features:\")\nprint(skewness)\n\nprint(\"\\nFeatures with skewness > |0.5|:\")\nprint(skewed_cols)","metadata":{"id":"VJQs5H0YcRn2","executionInfo":{"status":"ok","timestamp":1734866337482,"user_tz":-330,"elapsed":7,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"e261229a-fbda-4bf3-ac68-349e0ca586f7","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:37:54.606373Z","iopub.execute_input":"2024-12-25T16:37:54.606715Z","iopub.status.idle":"2024-12-25T16:37:54.87161Z","shell.execute_reply.started":"2024-12-25T16:37:54.606686Z","shell.execute_reply":"2024-12-25T16:37:54.870156Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for col in numeric_cols:\n    plt.figure(figsize=(8, 6))\n    sns.boxplot(x=train[col])\n    plt.title(f'Box Plot of {col}')\n    plt.show()","metadata":{"id":"qAmDKK5hDKOw","executionInfo":{"status":"ok","timestamp":1734866372818,"user_tz":-330,"elapsed":35340,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"b40c9ed1-76b9-4fba-c5c1-b9f6345fa68d","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:37:54.872771Z","iopub.execute_input":"2024-12-25T16:37:54.873173Z","iopub.status.idle":"2024-12-25T16:37:57.543101Z","shell.execute_reply.started":"2024-12-25T16:37:54.87314Z","shell.execute_reply":"2024-12-25T16:37:57.541924Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print('Number of outliers in each numerical column: ')\nfor col in numeric_cols:\n  IQR2=train[col].quantile(0.75)\n  IQR1=train[col].quantile(0.25)\n  IQR=IQR2-IQR1\n  upper_limit=IQR2+1.5*IQR\n  lower_limit=IQR1-1.5*IQR\n  outliers=train[(train[col]>upper_limit) | (train[col]<lower_limit)]\n  print(f'{col}: {len(outliers)}')","metadata":{"id":"fiO2IndcecbI","executionInfo":{"status":"ok","timestamp":1734866373187,"user_tz":-330,"elapsed":395,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"81346a79-9a5c-4bb6-de95-28c582ff8868","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:37:57.54425Z","iopub.execute_input":"2024-12-25T16:37:57.544574Z","iopub.status.idle":"2024-12-25T16:37:58.227356Z","shell.execute_reply.started":"2024-12-25T16:37:57.544522Z","shell.execute_reply":"2024-12-25T16:37:58.226171Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(12, 6))\nsns.heatmap(train[numeric_cols].corr().round(2), annot=True)\nplt.title('Correlation Heatmap of Numeric Features')\nplt.show()","metadata":{"id":"IeWhOLRqd2IW","executionInfo":{"status":"ok","timestamp":1734866375850,"user_tz":-330,"elapsed":2668,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"8ea72910-3b3e-4615-a5d1-903e8873256a","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:37:58.228624Z","iopub.execute_input":"2024-12-25T16:37:58.229011Z","iopub.status.idle":"2024-12-25T16:37:59.601021Z","shell.execute_reply.started":"2024-12-25T16:37:58.228973Z","shell.execute_reply":"2024-12-25T16:37:59.599935Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(12,6))\nax = sns.countplot(x='Previous Claims', data=train)\nplt.xlabel('Previous Claims')\nplt.ylabel('Count')\nplt.title('Count of Previous Claims')\n\n# Loop through each patch (bar) and add text\nfor p in ax.patches:\n    height = p.get_height()\n    ax.annotate(\n        f'{height:.0f}',             # Text to show (no decimals)\n        (p.get_x() + p.get_width() / 2, height),  # (x, y) position\n        ha='center',                 # Horizontal center\n        va='bottom',                 # Vertical alignment\n        xytext=(0, 5),              # Offset from (x, y) in pixels\n        textcoords='offset points'   # Position is relative to (x, y)\n    )\n\nplt.show()\n\n\nplt.figure(figsize=(12,6))\nsns.barplot(train.groupby('Previous Claims')['Premium Amount'].mean())\nplt.xlabel('Previous Claims')\nplt.ylabel('Mean Premium Amount')\nplt.title('Mean Premium Amount by Previous Claims')\nplt.show()","metadata":{"id":"mPYDa_gqHISk","executionInfo":{"status":"ok","timestamp":1734867068496,"user_tz":-330,"elapsed":2516,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"81e66b12-13f4-4d77-c370-c44abb32f9da","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:37:59.602451Z","iopub.execute_input":"2024-12-25T16:37:59.603008Z","iopub.status.idle":"2024-12-25T16:38:00.183488Z","shell.execute_reply.started":"2024-12-25T16:37:59.602961Z","shell.execute_reply":"2024-12-25T16:38:00.182374Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.groupby('Previous Claims')['Premium Amount'].mean()","metadata":{"id":"t9fkxAgGGzt9","executionInfo":{"status":"ok","timestamp":1734866659019,"user_tz":-330,"elapsed":2241,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"eabe1ae9-358b-4552-a7d6-94c8f468d7f5","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:38:00.184615Z","iopub.execute_input":"2024-12-25T16:38:00.184884Z","iopub.status.idle":"2024-12-25T16:38:00.227885Z","shell.execute_reply.started":"2024-12-25T16:38:00.184859Z","shell.execute_reply":"2024-12-25T16:38:00.226519Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(12,6))\nsns.histplot(train['Credit Score'],kde=True)\nplt.xlabel('Credit Score')\nplt.ylabel('Frequency')\nplt.title('Distribution of Credit Score')\nplt.show()","metadata":{"id":"q5T4UiVmONJq","executionInfo":{"status":"ok","timestamp":1734866380920,"user_tz":-330,"elapsed":5078,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"eb153a3a-6bfe-47e8-f890-bf9be3b264a8","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:38:00.229001Z","iopub.execute_input":"2024-12-25T16:38:00.229273Z","iopub.status.idle":"2024-12-25T16:38:05.414169Z","shell.execute_reply.started":"2024-12-25T16:38:00.229251Z","shell.execute_reply":"2024-12-25T16:38:05.412579Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Mean premium amount for different credit score ranges\nmean_premium_1 = train[train['Credit Score'] < 400]['Premium Amount'].mean()\nmean_premium_2 = train[(train['Credit Score'] >= 400) & (train['Credit Score'] < 500)]['Premium Amount'].mean()\nmean_premium_3 = train[(train['Credit Score'] >= 500) & (train['Credit Score'] < 600)]['Premium Amount'].mean()\nmean_premium_4 = train[(train['Credit Score'] >= 600) & (train['Credit Score'] < 700)]['Premium Amount'].mean()\nmean_premium_5 = train[train['Credit Score'] >= 700]['Premium Amount'].mean()\n\n# Print the results\nprint(\"Mean Premium Amounts by Credit Score Range:\")\nprint(f\"Credit Score < 400: {mean_premium_1}\")\nprint(f\"400 <= Credit Score < 500: {mean_premium_2}\")\nprint(f\"500 <= Credit Score < 600: {mean_premium_3}\")\nprint(f\"600 <= Credit Score < 700: {mean_premium_4}\")\nprint(f\"Credit Score >= 700: {mean_premium_5}\")\n","metadata":{"id":"to2vf87VMABz","executionInfo":{"status":"ok","timestamp":1734866380920,"user_tz":-330,"elapsed":7,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"1628de99-bc47-4d2c-d132-7522d3ca0550","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:38:05.415698Z","iopub.execute_input":"2024-12-25T16:38:05.4161Z","iopub.status.idle":"2024-12-25T16:38:05.665217Z","shell.execute_reply.started":"2024-12-25T16:38:05.416064Z","shell.execute_reply":"2024-12-25T16:38:05.663864Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Scatter plot of Credit Score vs Premium Amount\nplt.figure(figsize=(10, 6))\nsns.scatterplot(x='Credit Score', y='Premium Amount', data=train[:5000], alpha=0.6)\nplt.title('Credit Score vs. Premium Amount')\nplt.xlabel('Credit Score')\nplt.ylabel('Premium Amount')\n\n# Calculate quartiles (25th and 75th percentiles)\nx_25, x_75 = np.percentile(train['Credit Score'].dropna(), [25, 75])\n\ny_25, y_75 = np.percentile(train['Premium Amount'], [25, 75])\n\n# Draw lines for the quartiles\nplt.axvline(x=x_25, color='red', linestyle='--', label=f'Credit Score 25th Percentile ({x_25:.2f})')\nplt.axvline(x=x_75, color='blue', linestyle='--', label=f'Credit Score 75th Percentile ({x_75:.2f})')\nplt.axhline(y=y_25, color='green', linestyle='--', label=f'Premium Amount 25th Percentile ({y_25:.2f})')\nplt.axhline(y=y_75, color='purple', linestyle='--', label=f'Premium Amount 75th Percentile ({y_75:.2f})')\n\nplt.legend()\n\n# Count points in each quadrant\nq1 = len(train[(train['Credit Score'] <= x_25) & (train['Premium Amount'] <= y_25)])\nq2 = len(train[(train['Credit Score'] <= x_25) & (train['Premium Amount'] > y_25) & (train['Premium Amount'] <= y_75)])\nq3 = len(train[(train['Credit Score'] > x_25) & (train['Credit Score'] <= x_75) & (train['Premium Amount'] <= y_25)])\nq4 = len(train[(train['Credit Score'] > x_25) & (train['Credit Score'] <= x_75) & (train['Premium Amount'] > y_25)])\n\nq5 = len(train[(train['Credit Score'] > x_75) & (train['Premium Amount'] <= y_25)])\nq6 = len(train[(train['Credit Score'] > x_75) & (train['Premium Amount'] > y_25)])\n\n# Print the number of points in each quadrant\nprint(f\"Number of points in Q1 (Low Credit Score & Low Premium): {q1}\")\nprint(f\"Number of points in Q2 (Low Credit Score & Medium Premium): {q2}\")\nprint(f\"Number of points in Q3 (Medium Credit Score & Low Premium): {q3}\")\nprint(f\"Number of points in Q4 (Medium Credit Score & Medium Premium): {q4}\")\nprint(f\"Number of points in Q5 (High Credit Score & Low Premium): {q5}\")\nprint(f\"Number of points in Q6 (High Credit Score & Medium Premium): {q6}\")\n","metadata":{"id":"JOewq4rQPqpf","executionInfo":{"status":"ok","timestamp":1734866383557,"user_tz":-330,"elapsed":2642,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"fb7c3933-b862-45fe-a8ce-1a268933b050","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:38:05.666283Z","iopub.execute_input":"2024-12-25T16:38:05.666642Z","iopub.status.idle":"2024-12-25T16:38:06.879156Z","shell.execute_reply.started":"2024-12-25T16:38:05.666592Z","shell.execute_reply":"2024-12-25T16:38:06.877888Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nplt.figure(figsize=(12,6))\nsns.histplot(train['Health Score'], kde=True)\nplt.xlabel('Health Score')\nplt.ylabel('Frequency')\nplt.title('Distribution of Health Score')\nplt.show()","metadata":{"id":"Qeumklfjb9_k","executionInfo":{"status":"ok","timestamp":1734872157490,"user_tz":-330,"elapsed":10200,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"05134d6d-67e0-469d-b011-316b91acef0f","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:38:06.880476Z","iopub.execute_input":"2024-12-25T16:38:06.880899Z","iopub.status.idle":"2024-12-25T16:38:12.4779Z","shell.execute_reply.started":"2024-12-25T16:38:06.880865Z","shell.execute_reply":"2024-12-25T16:38:12.476706Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n\n# Assuming 'train' is your DataFrame\n\n# Step 1: Ensure 'Health Score' is numeric\ntrain['Health Score'] = pd.to_numeric(train['Health Score'], errors='coerce')\n\n# Step 2: Handle missing values\ntrain_cleaned = train.dropna(subset=['Health Score'])  # Alternatively, fill NaNs as needed\n\n# Step 3: Define bin edges\nnum_bins = 10\nmin_score = train_cleaned['Health Score'].min()\nmax_score = train_cleaned['Health Score'].max()\nbin_edges = np.linspace(min_score, max_score, num_bins + 1)  # Creates equal-width bins\n\n# Step 4: Assign bins using numpy.digitize\ntrain_cleaned['Health Score Bin'] = np.digitize(train_cleaned['Health Score'], bins=bin_edges, right=False)\n\n# Optional: Create readable bin labels\nbin_labels = [f'Bin_{i}' for i in range(1, num_bins + 1)]\ntrain_cleaned['Health Score Bin'] = pd.cut(train_cleaned['Health Score'], bins=bin_edges, labels=bin_labels, include_lowest=True, right=False)\n\n# Step 5: Group by 'Health Score Bin' and aggregate\nresult = train_cleaned.groupby('Health Score Bin').agg(\n    mean_premium_amount=('Premium Amount', 'mean'),\n    count_premium_amount=('Premium Amount', 'count'),\n    min_health_score=('Health Score', 'min'),\n    max_health_score=('Health Score', 'max')\n).reset_index()\n\n# Step 6: Display the result\nprint(result)\n","metadata":{"id":"fV-3PMDHa2u_","executionInfo":{"status":"ok","timestamp":1734872073813,"user_tz":-330,"elapsed":390,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"8f85fe63-791c-47d3-b3e9-8fcfcab62387","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:49:01.063474Z","iopub.execute_input":"2024-12-25T16:49:01.063918Z","iopub.status.idle":"2024-12-25T16:49:01.42415Z","shell.execute_reply.started":"2024-12-25T16:49:01.063884Z","shell.execute_reply":"2024-12-25T16:49:01.422833Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# Group by 'Vehicle Age' and calculate the mean 'Premium Amount'\nmean_premium_by_vehicle_age = train.groupby('Vehicle Age')['Premium Amount'].mean()\n\n# Create a bar plot\nplt.figure(figsize=(12, 6))\nmean_premium_by_vehicle_age.plot(kind='bar')\nplt.xlabel('Vehicle Age')\nplt.ylabel('Mean Premium Amount')\nplt.title('Mean Premium Amount by Vehicle Age')\nplt.xticks(rotation=0)  # Rotate x-axis labels for better readability\nplt.show()\n\n# Print the result\nmean_premium_by_vehicle_age","metadata":{"id":"-EvzsKwJcOpM","executionInfo":{"status":"ok","timestamp":1734872225248,"user_tz":-330,"elapsed":1093,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"7379d8f8-e426-489a-e050-edf97357c032","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:49:59.424992Z","iopub.execute_input":"2024-12-25T16:49:59.425377Z","iopub.status.idle":"2024-12-25T16:49:59.743293Z","shell.execute_reply.started":"2024-12-25T16:49:59.425349Z","shell.execute_reply":"2024-12-25T16:49:59.742121Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Data Preprocessing","metadata":{"id":"SCpr21cIiiKv"}},{"cell_type":"markdown","source":"Imputing missing data","metadata":{"id":"6On3pGthlayH"}},{"cell_type":"code","source":"#defining functions for imputing numerical cols\n\ndef impute_with_mean(df,numerical_cols):\n  dataframe=df.copy()\n  for col in numerical_cols:\n    dataframe[col].fillna(dataframe[col].mean(),inplace=True)\n  return dataframe\n\ndef impute_with_median(df,numerical_cols):\n  dataframe=df.copy()\n  for col in numerical_cols:\n    dataframe[col].fillna(dataframe[col].median(),inplace=True)\n  return dataframe\n\n\n##discarding these below techniques as they are giving no better results than above\n'''\ndef impute_with_knn(df,numerical_cols):\n  dataframe=df.copy()\n  imputer=KNNImputer()\n  dataframe[numerical_cols]=imputer.fit_transform(dataframe[numerical_cols])\n  return dataframe\n\ndef impute_with_mice(df,numerical_cols):\n  dataframe=df.copy()\n  imputer=IterativeImputer()\n  dataframe[numerical_cols]=imputer.fit_transform(dataframe[numerical_cols])\n  return dataframe\n'''","metadata":{"id":"VemfZK9mD31E","executionInfo":{"status":"ok","timestamp":1734965020577,"user_tz":-330,"elapsed":5,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"ae021bbf-cf97-4b38-a1a1-1e2bfa6294b5","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:50:07.733776Z","iopub.execute_input":"2024-12-25T16:50:07.73434Z","iopub.status.idle":"2024-12-25T16:50:07.746102Z","shell.execute_reply.started":"2024-12-25T16:50:07.734287Z","shell.execute_reply":"2024-12-25T16:50:07.744776Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#defining functions for imputing categorical cols\n\ndef impute_with_mode(df,categorical_cols):\n  dataframe=df.copy()\n  for col in categorical_cols:\n    dataframe[col].fillna(dataframe[col].mode()[0],inplace=True)\n  return dataframe\n\ndef impute_with_missing(df,categorical_cols):\n  dataframe=df.copy()\n  for col in categorical_cols:\n    dataframe[col].fillna('missing',inplace=True)\n  return dataframe","metadata":{"id":"klobk-VAENZc","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:50:08.112058Z","iopub.execute_input":"2024-12-25T16:50:08.112397Z","iopub.status.idle":"2024-12-25T16:50:08.117898Z","shell.execute_reply.started":"2024-12-25T16:50:08.112369Z","shell.execute_reply":"2024-12-25T16:50:08.116779Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X=train.drop(target_col,axis=1)\ny=train[target_col]","metadata":{"id":"bsb5H57uGarG","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:50:08.54018Z","iopub.execute_input":"2024-12-25T16:50:08.540564Z","iopub.status.idle":"2024-12-25T16:50:08.674616Z","shell.execute_reply.started":"2024-12-25T16:50:08.540499Z","shell.execute_reply":"2024-12-25T16:50:08.673421Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"id":"aRKWOteyqVAr","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def label_encoder(train ,test ,categorical_cols):\n  train_copy=train.copy()\n  test_copy=test.copy()\n  for col in categorical_cols:\n    le = LabelEncoder()\n    train_copy[col] = le.fit_transform(train_copy[col])\n    test_copy[col] = le.transform(test_copy[col])\n  return train_copy,test_copy\n\n\nordinal_encoder = OrdinalEncoder(\n    categories=[\n        [\"missing\",\"High School\", \"Bachelor's\", \"Master's\", \"PhD\"],       # Education\n        [\"missing\",\"Rural\", \"Suburban\", \"Urban\"],                        # Location\n        [\"missing\",\"Basic\", \"Comprehensive\", \"Premium\"],                 # Policy Type\n        [\"missing\",\"Poor\", \"Average\", \"Good\"],                           # Customer Feedback\n        [\"missing\",\"Unemployed\", \"Employed\", \"Self-Employed\"],           # Occupation\n        [\"missing\",\"Rarely\", \"Monthly\", \"Weekly\", \"Daily\"],              # Exercise Frequency\n        [\"missing\",\"Apartment\", \"Condo\", \"House\"]                        # Property Type\n    ]\n)\n\n\ndef one_hot_encoder(train ,test ,categorical_cols):\n  train_copy=train.copy()\n  test_copy=test.copy()\n  for col in categorical_cols:\n    train_copy = pd.get_dummies(train_copy, columns=[col], prefix=[col])\n    test_copy = pd.get_dummies(test_copy, columns=[col], prefix=[col])\n  return train_copy,test_copy","metadata":{"id":"CsAfoLV09E0X","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:50:09.2971Z","iopub.execute_input":"2024-12-25T16:50:09.297482Z","iopub.status.idle":"2024-12-25T16:50:09.30505Z","shell.execute_reply.started":"2024-12-25T16:50:09.297449Z","shell.execute_reply":"2024-12-25T16:50:09.303814Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#transformation for numerical data\ndef boxcox_transformation(df,numeric_cols):\n  dataframe=df.copy()\n  transformed=[]\n  for col in numeric_cols:\n    skewness=dataframe[col].skew()\n    if abs(skewness) <= 0.5:\n      print(f'{col}: {skewness}     No need to apply transformation')\n    elif abs(skewness) > 0.5:\n      print('\\n')\n      transformed.append(col)\n      if(dataframe[col].min()<=0):\n        dataframe[col]=dataframe[col] + 1e-6\n\n      print(f'{col}: {skewness}')\n      dataframe[col], _ = boxcox(dataframe[col])\n      print(f'After transformation: \\n{col}: {abs(dataframe[col].skew())}')\n      print('\\n')\n\n  return dataframe, transformed","metadata":{"id":"7eeivVGS3WI4","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:50:09.592157Z","iopub.execute_input":"2024-12-25T16:50:09.592533Z","iopub.status.idle":"2024-12-25T16:50:09.598909Z","shell.execute_reply.started":"2024-12-25T16:50:09.592501Z","shell.execute_reply":"2024-12-25T16:50:09.597608Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def compare_histograms(df, columns, transformed_df):\n\n  num_cols = len(columns)\n  fig, axes = plt.subplots(num_cols, 2, figsize=(12, 4 * num_cols))\n  fig.suptitle(\"Histograms Before and After Transformation\", fontsize=16)\n\n  for i, col in enumerate(columns):\n      # Original Data Histogram\n      ax1 = axes[i, 0]\n      df[col].hist(ax=ax1, bins=30)\n      ax1.set_title(f'Original: {col}')\n      ax1.set_xlabel(col)\n      ax1.set_ylabel('Frequency')\n\n      # Transformed Data Histogram\n      ax2 = axes[i, 1]\n      transformed_df[col].hist(ax=ax2, bins=30)\n      ax2.set_title(f'Transformed: {col}')\n      ax2.set_xlabel(col)\n      ax2.set_ylabel('Frequency')\n\n\n  plt.tight_layout(rect=[0, 0, 1, 0.97])  # Adjust layout to prevent title overlap\n  plt.show()","metadata":{"id":"BUIGe_X3PGhh","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:50:18.309596Z","iopub.execute_input":"2024-12-25T16:50:18.309998Z","iopub.status.idle":"2024-12-25T16:50:18.316736Z","shell.execute_reply.started":"2024-12-25T16:50:18.309963Z","shell.execute_reply":"2024-12-25T16:50:18.315456Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def submit(y_pred):\n  id=pd.read_csv('/content/test.csv')['id']\n  submission=pd.DataFrame(columns=['id','Premium Amount'])\n  submission['id']=id\n  submission['Premium Amount']=y_pred\n\n  return submission","metadata":{"id":"gJWDP-UCQOVI","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:50:24.820201Z","iopub.execute_input":"2024-12-25T16:50:24.820588Z","iopub.status.idle":"2024-12-25T16:50:24.826081Z","shell.execute_reply.started":"2024-12-25T16:50:24.820534Z","shell.execute_reply":"2024-12-25T16:50:24.824673Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Creating the dataset","metadata":{"id":"Iyufy5XPWGv6"}},{"cell_type":"code","source":"# X -> containing features using to predict\n# y -> containing target column\n# test -> containing test data, similar to X\n# train -> X and y combined","metadata":{"id":"Bo9EUywyWS6i","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:50:41.124272Z","iopub.execute_input":"2024-12-25T16:50:41.124689Z","iopub.status.idle":"2024-12-25T16:50:41.128821Z","shell.execute_reply.started":"2024-12-25T16:50:41.124654Z","shell.execute_reply":"2024-12-25T16:50:41.127647Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Imputing missing values\n\n# Create lists to store the datasets\ntrain_datasets = []\ntest_datasets = []\n\n# Define imputation methods\nimputation_methods = {\n    'mean': impute_with_mean,\n    'median': impute_with_median,\n    #'knn': impute_with_knn,\n    #'mice': impute_with_mice\n}\n\n# Define categorical imputation methods\ncategorical_imputation_methods = {\n    'mode': impute_with_mode,\n    'missing': impute_with_missing\n}\n\n# Iterate through imputation methods\nfor num_method_name, num_method in imputation_methods.items():\n    for cat_method_name, cat_method in categorical_imputation_methods.items():\n        # Create copies of the original datasets\n        X_train_imputed = X.copy()\n        X_test_imputed = test.copy()\n\n        # Impute numerical features\n        X_train_imputed = num_method(X_train_imputed, numeric_cols)\n        X_test_imputed = num_method(X_test_imputed, numeric_cols)\n\n        # Impute categorical features\n        X_train_imputed = cat_method(X_train_imputed, categorical_cols)\n        X_test_imputed = cat_method(X_test_imputed, categorical_cols)\n\n        # Append to the lists with descriptive names\n        train_datasets.append((f\"train_{num_method_name}_{cat_method_name}\", X_train_imputed))\n        test_datasets.append((f\"test_{num_method_name}_{cat_method_name}\", X_test_imputed))\n        print(f'Done {num_method_name} - {cat_method_name}')","metadata":{"id":"HvCawPuOQr-0","executionInfo":{"status":"ok","timestamp":1734965040901,"user_tz":-330,"elapsed":19770,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"383184a7-de0e-44c1-b6b0-098fbe90cc22","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:50:42.819811Z","iopub.execute_input":"2024-12-25T16:50:42.820152Z","iopub.status.idle":"2024-12-25T16:50:57.776685Z","shell.execute_reply.started":"2024-12-25T16:50:42.820124Z","shell.execute_reply":"2024-12-25T16:50:57.775451Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Apply transformations to each train and test dataset pair\ntransformed_train_datasets = []\ntransformed_test_datasets = []\n\nfor (train_name, train_data), (test_name, test_data) in zip(train_datasets, test_datasets):\n\n    train_transformed = train_data.copy()\n    test_transformed = test_data.copy()\n\n    # Apply Box-Cox transformation\n    train_transformed, transformed_cols = boxcox_transformation(train_transformed, numeric_cols)\n    test_transformed, _ = boxcox_transformation(test_transformed, numeric_cols) #Already fitted in train, just transform\n\n    transformed_train_datasets.append((train_name, train_transformed))\n    transformed_test_datasets.append((test_name, test_transformed))\n","metadata":{"id":"lCmKxpJ8XQF3","executionInfo":{"status":"ok","timestamp":1734965182785,"user_tz":-330,"elapsed":141909,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"8d07a179-fb59-4045-f7d5-d6f99a5f0446","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:50:57.778134Z","iopub.execute_input":"2024-12-25T16:50:57.778507Z","iopub.status.idle":"2024-12-25T16:52:55.023832Z","shell.execute_reply.started":"2024-12-25T16:50:57.778478Z","shell.execute_reply":"2024-12-25T16:52:55.022605Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"encoding_methods = {\n    'label_encoding': label_encoder,\n    'one_hot_encoding': one_hot_encoder,\n    #'target_encoding': target_encoder #Commented out as it was causing issues\n}\n\n# Apply encodings to each transformed dataset\nencoded_train_datasets = []\nencoded_test_datasets = []\n\nfor (train_name, train_data), (test_name, test_data) in zip(transformed_train_datasets, transformed_test_datasets):\n    for encoding_name, encoding_method in encoding_methods.items():\n        # Create copies to avoid modifying the original DataFrames\n        encoded_train = train_data.copy()\n        encoded_test = test_data.copy()\n\n        # Apply the encoding method\n        encoded_train, encoded_test = encoding_method(encoded_train, encoded_test, categorical_cols)\n\n        # Append the encoded datasets to the lists\n        encoded_train_datasets.append((f\"{train_name}_{encoding_name}\", encoded_train))\n        encoded_test_datasets.append((f\"{test_name}_{encoding_name}\", encoded_test))\n        print(f\"Encoding {encoding_name} complete for dataset {train_name}\")\n","metadata":{"id":"faEpVfCxFHSc","executionInfo":{"status":"ok","timestamp":1734965231451,"user_tz":-330,"elapsed":48842,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"39d0c209-98a3-4cc9-fcbb-0f66854203e9","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:52:55.025863Z","iopub.execute_input":"2024-12-25T16:52:55.026194Z","iopub.status.idle":"2024-12-25T16:53:34.193039Z","shell.execute_reply.started":"2024-12-25T16:52:55.026162Z","shell.execute_reply":"2024-12-25T16:53:34.191675Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for (train_name, train_data), (test_name, test_data) in zip(transformed_train_datasets, transformed_test_datasets):\n    # Create copies of the data\n    train_data_copy = train_data.copy()\n    test_data_copy = test_data.copy()\n\n    # Apply ordinal encoding\n    train_data_copy[ordinal_cols] = ordinal_encoder.fit_transform(train_data_copy[ordinal_cols])\n    test_data_copy[ordinal_cols] = ordinal_encoder.transform(test_data_copy[ordinal_cols])\n    # Apply one-hot encoding\n    le=[]\n    ohe=[]\n    for col in nominal_cols:\n      if len(train_data_copy[col].unique()) == 2:\n        le.append(col)\n      else:\n        ohe.append(col)\n    train_data_copy , test_data_copy = label_encoder(train_data_copy ,test_data_copy ,le)\n    train_data_copy , test_data_copy = one_hot_encoder(train_data_copy ,test_data_copy ,ohe)\n    encoded_train_datasets.append((train_name+\"_ordinal_encoding\", train_data_copy))\n    encoded_test_datasets.append((test_name+\"_ordinal_encoding\", test_data_copy))\n    print(f\"Encoding ordinal complete for dataset {train_name}\")","metadata":{"id":"GAAwjgtAjMFD","executionInfo":{"status":"ok","timestamp":1734965259278,"user_tz":-330,"elapsed":27867,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"bcba7813-5ccf-4793-e0a5-6c9e15c078d1","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:53:34.194703Z","iopub.execute_input":"2024-12-25T16:53:34.195029Z","iopub.status.idle":"2024-12-25T16:53:55.307507Z","shell.execute_reply.started":"2024-12-25T16:53:34.195Z","shell.execute_reply":"2024-12-25T16:53:55.30633Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Baseline model evaluation","metadata":{"id":"HRBwecr7tNk3"}},{"cell_type":"code","source":"y_log = np.log1p(y)","metadata":{"id":"9j1_Kf2qqA23","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:53:55.308634Z","iopub.execute_input":"2024-12-25T16:53:55.309021Z","iopub.status.idle":"2024-12-25T16:53:55.336293Z","shell.execute_reply.started":"2024-12-25T16:53:55.308978Z","shell.execute_reply":"2024-12-25T16:53:55.335173Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"models = {\n    'XGBoost': XGBRegressor(),\n    'LightGBM': LGBMRegressor(verbose=-1),\n    'CatBoost': CatBoostRegressor(verbose=0,iterations=200)\n}","metadata":{"id":"To1CYasWgder","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:54:33.952699Z","iopub.execute_input":"2024-12-25T16:54:33.95305Z","iopub.status.idle":"2024-12-25T16:54:33.960767Z","shell.execute_reply.started":"2024-12-25T16:54:33.953021Z","shell.execute_reply":"2024-12-25T16:54:33.959489Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from re import VERBOSE\ndef evaluate_models(encoded_train_datasets, encoded_test_datasets, y, models):\n\n    results = []\n    for (train_name, X_train), (test_name, X_test) in zip(encoded_train_datasets, encoded_test_datasets):\n        # Split data (y should be the same shape as X_train)\n        X_train_split, X_val_split, y_train_split, y_val_split = train_test_split(\n            X_train, y, test_size=0.2, random_state=42\n        )\n\n        for model_name, model in models.items():\n            # 1. Fit the model on the log-transformed y (assuming y is log1p-ed)\n            model.fit(X_train_split, y_train_split)\n\n            # 2. Predict (still in log scale, presumably)\n            y_pred_log = model.predict(X_val_split)\n\n            # 3. Exponentiate predictions and targets for metrics on original scale\n            y_pred_exp = np.expm1(y_pred_log)\n            y_val_split_exp = np.expm1(y_val_split)   # <-- do NOT overwrite y_val_split itself\n\n            # 4. Compute evaluation metrics in original scale\n            #    Use np.maximum(y_pred_exp, 0) to clamp negative predictions to 0\n            rmsle = np.sqrt(mean_squared_log_error(y_val_split_exp, np.maximum(y_pred_exp, 0)))\n            rmse = np.sqrt(mean_squared_error(y_val_split_exp, y_pred_exp))\n            mae = mean_absolute_error(y_val_split_exp, y_pred_exp)\n            r2 = r2_score(y_val_split_exp, y_pred_exp)\n\n            # 5. Print the results\n            print('----------------------------------------------------')\n            print(f\"Model: {model_name}\")\n            print(f\"Dataset: {train_name}\")\n            print(f\"RMSLE: {rmsle}\")\n            print(f\"RMSE: {rmse}\")\n            print(f\"MAE: {mae}\")\n            print(f\"R2: {r2}\")\n\n            # 6. Record the results\n            results.append({\n                'model_name': model_name,\n                'dataset': train_name,\n                'RMSLE': rmsle,\n                'RMSE': rmse,\n                'MAE': mae,\n                'R2': r2,\n                'model': model\n            })\n            print('The model has been stored in the dataframe')\n\n    # Return as a DataFrame\n    return pd.DataFrame(results)\n","metadata":{"id":"ZgzGGASUFz0x","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:55:52.663603Z","iopub.execute_input":"2024-12-25T16:55:52.664156Z","iopub.status.idle":"2024-12-25T16:55:52.675609Z","shell.execute_reply.started":"2024-12-25T16:55:52.66411Z","shell.execute_reply":"2024-12-25T16:55:52.674047Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def evaluate_models_cv(encoded_train_datasets, encoded_test_datasets, y_log, models, n_splits=5):\n\n\n    # Initialize cross-validator\n    kf = KFold(n_splits=n_splits, shuffle=True, random_state=42)\n\n    results = []\n\n    for (train_name, X_train), (test_name, X_test) in zip(encoded_train_datasets, encoded_test_datasets):\n\n        # Convert X_train, y_log to numpy or leave as DataFrame/Series\n        # As long as indexing works with .iloc, DataFrame/Series is fine.\n\n        for model_name, model in models.items():\n            # Lists to store fold metrics\n            fold_rmsle = []\n            fold_rmse = []\n            fold_mae  = []\n            fold_r2   = []\n\n            # --- Cross-Validation Loop ---\n            for train_idx, val_idx in kf.split(X_train, y_log):\n                X_train_fold = X_train.iloc[train_idx]\n                X_val_fold   = X_train.iloc[val_idx]\n                y_train_fold = y_log.iloc[train_idx]\n                y_val_fold   = y_log.iloc[val_idx]\n\n                # 1. Fit on the training fold\n                model.fit(X_train_fold, y_train_fold)\n\n                # 2. Predict (still in log scale)\n                y_pred_log_fold = model.predict(X_val_fold)\n\n                # 3. Exponentiate to get original scale\n                y_pred_fold = np.expm1(y_pred_log_fold)\n                y_val_fold_exp = np.expm1(y_val_fold)\n\n                # 4. Compute metrics on the fold\n                # Avoid negative predictions for RMSLE\n                fold_rmsle.append(\n                    np.sqrt(mean_squared_log_error(y_val_fold_exp, np.maximum(y_pred_fold, 0)))\n                )\n                fold_rmse.append(\n                    np.sqrt(mean_squared_error(y_val_fold_exp, y_pred_fold))\n                )\n                fold_mae.append(\n                    mean_absolute_error(y_val_fold_exp, y_pred_fold)\n                )\n                fold_r2.append(\n                    r2_score(y_val_fold_exp, y_pred_fold)\n                )\n\n            # --- End of CV Loop for this model ---\n\n            # Average the metrics across folds\n            avg_rmsle = np.mean(fold_rmsle)\n            avg_rmse  = np.mean(fold_rmse)\n            avg_mae   = np.mean(fold_mae)\n            avg_r2    = np.mean(fold_r2)\n\n            # Print results\n            print('----------------------------------------------------')\n            print(f\"Dataset: {train_name}\")\n            print(f\"Model: {model_name}\")\n            print(f\"AVG RMSLE (CV): {avg_rmsle}\")\n            print(f\"AVG RMSE  (CV): {avg_rmse}\")\n            print(f\"AVG MAE   (CV): {avg_mae}\")\n            print(f\"AVG R2    (CV): {avg_r2}\")\n\n            # Optionally, retrain the model on the entire dataset (X_train, y_log)\n            # for final usage on X_test\n            model.fit(X_train, y_log)\n            # Store the final model for this dataset in model_map\n            model_map[train_name] = model\n\n            # Store results\n            results.append({\n                'dataset': train_name,\n                'model_name': model_name,\n                'model': model,\n                'RMSLE_CV': avg_rmsle,\n                'RMSE_CV' : avg_rmse,\n                'MAE_CV'  : avg_mae,\n                'R2_CV'   : avg_r2\n            })\n\n    # Return results as a DataFrame plus the map of final models\n    results_df = pd.DataFrame(results)\n    return results_df\n","metadata":{"id":"v11wGkDZWrjU","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:55:55.483536Z","iopub.execute_input":"2024-12-25T16:55:55.483956Z","iopub.status.idle":"2024-12-25T16:55:55.495279Z","shell.execute_reply.started":"2024-12-25T16:55:55.483924Z","shell.execute_reply":"2024-12-25T16:55:55.493842Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Results","metadata":{"id":"9qDYoZA_fuc1"}},{"cell_type":"code","source":"results_df = evaluate_models(encoded_train_datasets, encoded_test_datasets, y_log, models)","metadata":{"id":"zBOodKo5purv","executionInfo":{"status":"ok","timestamp":1734944998883,"user_tz":-330,"elapsed":897857,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"f600f13d-7af1-46f1-a0c9-fd51afcbd2b6","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T16:55:59.32282Z","iopub.execute_input":"2024-12-25T16:55:59.32317Z","iopub.status.idle":"2024-12-25T17:02:39.217538Z","shell.execute_reply.started":"2024-12-25T16:55:59.323142Z","shell.execute_reply":"2024-12-25T17:02:39.216352Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"results_df","metadata":{"id":"JFDbhkO_noJC","executionInfo":{"status":"ok","timestamp":1734945030612,"user_tz":-330,"elapsed":646,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"803a06f9-e3ec-40a5-dc3a-34f85d308195","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T17:02:39.21914Z","iopub.execute_input":"2024-12-25T17:02:39.219575Z","iopub.status.idle":"2024-12-25T17:02:39.26696Z","shell.execute_reply.started":"2024-12-25T17:02:39.219513Z","shell.execute_reply":"2024-12-25T17:02:39.265056Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"top_10_results = results_df.sort_values(by='RMSLE').head(10)\n\ntop_10_results","metadata":{"id":"RDEcxi7r0wa-","executionInfo":{"status":"ok","timestamp":1734945785988,"user_tz":-330,"elapsed":711,"user":{"displayName":"TheLoneWolf Gamer","userId":"06156569537337594069"}},"outputId":"4c7a6da5-47a9-4561-9abb-75279a0d5a44","trusted":true,"execution":{"iopub.status.busy":"2024-12-25T17:02:39.268676Z","iopub.execute_input":"2024-12-25T17:02:39.26898Z","iopub.status.idle":"2024-12-25T17:02:39.29152Z","shell.execute_reply.started":"2024-12-25T17:02:39.268956Z","shell.execute_reply":"2024-12-25T17:02:39.290336Z"}},"outputs":[],"execution_count":null}]}