{"metadata":{"kernelspec":{"display_name":"Python 3","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.10.12"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n%load_ext cudf.pandas\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt\nimport seaborn as sns\npd.set_option('display.max_columns', 500)\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        \nimport warnings\nwarnings.filterwarnings('ignore')\n\nplt.style.use('ggplot')\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:46:48.499438Z","iopub.execute_input":"2025-04-13T08:46:48.499758Z","iopub.status.idle":"2025-04-13T08:46:57.130396Z","shell.execute_reply.started":"2025-04-13T08:46:48.499727Z","shell.execute_reply":"2025-04-13T08:46:57.129671Z"}},"outputs":[],"execution_count":null},{"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')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:46:57.133772Z","iopub.execute_input":"2025-04-13T08:46:57.134081Z","iopub.status.idle":"2025-04-13T08:46:59.86449Z","shell.execute_reply.started":"2025-04-13T08:46:57.134059Z","shell.execute_reply":"2025-04-13T08:46:59.863555Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Data Understanding","metadata":{}},{"cell_type":"code","source":"train.shape","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test.shape","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.sample(10)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-12T05:17:37.273968Z","iopub.execute_input":"2025-04-12T05:17:37.274286Z","iopub.status.idle":"2025-04-12T05:17:39.000787Z","shell.execute_reply.started":"2025-04-12T05:17:37.274256Z","shell.execute_reply":"2025-04-12T05:17:38.999941Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.isnull().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-10T05:32:00.567228Z","iopub.execute_input":"2025-04-10T05:32:00.567619Z","iopub.status.idle":"2025-04-10T05:32:01.195577Z","shell.execute_reply.started":"2025-04-10T05:32:00.567589Z","shell.execute_reply":"2025-04-10T05:32:01.194525Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test.isnull().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-10T05:32:14.404534Z","iopub.execute_input":"2025-04-10T05:32:14.404967Z","iopub.status.idle":"2025-04-10T05:32:14.824189Z","shell.execute_reply.started":"2025-04-10T05:32:14.40494Z","shell.execute_reply":"2025-04-10T05:32:14.823269Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['Policy Start Date'] = pd.to_datetime(train['Policy Start Date'])\ntrain['year'] = train['Policy Start Date'].dt.year.astype('float32')\ntrain['month'] = train['Policy Start Date'].dt.month.astype('float32')\ntrain['day'] = train['Policy Start Date'].dt.day.astype('float32')\ntrain['day_of_week'] = train['Policy Start Date'].dt.day_of_week.astype('float32')\ntrain['seconds'] = (train['Policy Start Date'].astype(int) // 10**9).astype('float32')\ntrain.drop('Policy Start Date', axis=1, inplace=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:47:06.35713Z","iopub.execute_input":"2025-04-13T08:47:06.357432Z","iopub.status.idle":"2025-04-13T08:47:06.898877Z","shell.execute_reply.started":"2025-04-13T08:47:06.357408Z","shell.execute_reply":"2025-04-13T08:47:06.898185Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test['Policy Start Date'] = pd.to_datetime(test['Policy Start Date'])\ntest['year'] = test['Policy Start Date'].dt.year.astype('float32')\ntest['month'] = test['Policy Start Date'].dt.month.astype('float32')\ntest['day'] = test['Policy Start Date'].dt.day.astype('float32')\ntest['day_of_week'] = test['Policy Start Date'].dt.day_of_week.astype('float32')\ntest['seconds'] = (test['Policy Start Date'].astype(int) // 10**9).astype('float32')\ntest.drop('Policy Start Date', axis=1, inplace=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:47:10.206156Z","iopub.execute_input":"2025-04-13T08:47:10.206451Z","iopub.status.idle":"2025-04-13T08:47:10.28631Z","shell.execute_reply.started":"2025-04-13T08:47:10.206427Z","shell.execute_reply":"2025-04-13T08:47:10.285607Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-12T05:27:53.462249Z","iopub.execute_input":"2025-04-12T05:27:53.462558Z","iopub.status.idle":"2025-04-12T05:27:53.624406Z","shell.execute_reply.started":"2025-04-12T05:27:53.462534Z","shell.execute_reply":"2025-04-12T05:27:53.623523Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Data Preparation\n*  Converting object dtype into category for faster processing\n*  Filling missing values\n*  Encoding categorical values into numerical values","metadata":{}},{"cell_type":"code","source":"cat_cols = train.select_dtypes(include='object').columns\ntrain[cat_cols] = train[cat_cols].astype('category')\ntest[cat_cols] = test[cat_cols].astype('category')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:47:19.285284Z","iopub.execute_input":"2025-04-13T08:47:19.285605Z","iopub.status.idle":"2025-04-13T08:47:33.093358Z","shell.execute_reply.started":"2025-04-13T08:47:19.285566Z","shell.execute_reply":"2025-04-13T08:47:33.092448Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.impute import SimpleImputer\n\nsimple = SimpleImputer(strategy='most_frequent')\ncat_cols = train.select_dtypes(include='category').columns\ntrain[cat_cols] = simple.fit_transform(train[cat_cols])\ntest[cat_cols] = simple.transform(test[cat_cols])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:47:35.801228Z","iopub.execute_input":"2025-04-13T08:47:35.801585Z","iopub.status.idle":"2025-04-13T08:48:14.666493Z","shell.execute_reply.started":"2025-04-13T08:47:35.801555Z","shell.execute_reply":"2025-04-13T08:48:14.665581Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from cuml.preprocessing import TargetEncoder\n\nte = TargetEncoder(n_folds=15, smooth=20, split_method='random', stat='mean', seed=340)\nfor col in cat_cols:\n    te = TargetEncoder().fit(train[col], train['Premium Amount'])\n    train[col] = te.transform(train[col])\n    test[col] = te.transform(test[col])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:53:03.325553Z","iopub.execute_input":"2025-04-13T08:53:03.325848Z","iopub.status.idle":"2025-04-13T08:53:05.96842Z","shell.execute_reply.started":"2025-04-13T08:53:03.325826Z","shell.execute_reply":"2025-04-13T08:53:05.967729Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"simple = SimpleImputer(strategy='median')\nnum_cols = test.select_dtypes(exclude='object').columns\ntrain[num_cols] = simple.fit_transform(train[num_cols])\ntest[num_cols] = simple.transform(test[num_cols])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:53:27.017806Z","iopub.execute_input":"2025-04-13T08:53:27.018128Z","iopub.status.idle":"2025-04-13T08:53:37.719355Z","shell.execute_reply.started":"2025-04-13T08:53:27.018104Z","shell.execute_reply":"2025-04-13T08:53:37.718723Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Feature engineering","metadata":{}},{"cell_type":"code","source":"features = ['Age', 'Gender', 'Annual Income', 'Marital Status',\n       'Number of Dependents', 'Education Level', 'Occupation', 'Health Score',\n       'Location', 'Policy Type', 'Previous Claims', 'Vehicle Age',\n       'Credit Score', 'Insurance Duration', 'Customer Feedback',\n       'Smoking Status', 'Exercise Frequency', 'Property Type']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:57:45.390074Z","iopub.execute_input":"2025-04-13T08:57:45.390378Z","iopub.status.idle":"2025-04-13T08:57:45.394448Z","shell.execute_reply.started":"2025-04-13T08:57:45.390357Z","shell.execute_reply":"2025-04-13T08:57:45.393515Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def add_features(df):\n    for i, col1 in enumerate(features):\n        for col2 in (features[i+1:]):\n            new_col = f'{col1}_{col2}'\n            df[new_col] = train[col1] * train[col2]\n    return df\n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:57:48.081541Z","iopub.execute_input":"2025-04-13T08:57:48.081869Z","iopub.status.idle":"2025-04-13T08:57:48.086152Z","shell.execute_reply.started":"2025-04-13T08:57:48.081844Z","shell.execute_reply":"2025-04-13T08:57:48.085295Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Identifying outliers","metadata":{}},{"cell_type":"code","source":"sns.boxplot(data=train, y='Premium Amount', color='orange')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T05:24:59.198205Z","iopub.execute_input":"2025-04-13T05:24:59.198494Z","iopub.status.idle":"2025-04-13T05:25:01.603554Z","shell.execute_reply.started":"2025-04-13T05:24:59.19847Z","shell.execute_reply":"2025-04-13T05:25:01.60273Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sns.histplot(x='Annual Income', data=train, bins=35)\nplt.title('Distribution plot of Annual Income')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:56:58.805059Z","iopub.execute_input":"2025-04-13T08:56:58.805357Z","iopub.status.idle":"2025-04-13T08:57:00.72576Z","shell.execute_reply.started":"2025-04-13T08:56:58.805334Z","shell.execute_reply":"2025-04-13T08:57:00.724617Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Splitting the data for model prediction","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import KFold\n\nX = train.copy()\ny = X.pop('Premium Amount')\nX = add_features(X)\ny = np.log(y)\n\nX_test = test.copy()\nX_test = add_features(X_test)\n\nkf = KFold(n_splits=10, random_state=340, shuffle=True)\nfor train_index, valid_index in kf.split(X, y):\n    X_train, X_valid = X.iloc[train_index], X.iloc[valid_index]\n    y_train, y_valid = y.iloc[train_index], y.iloc[valid_index]\n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:57:52.157618Z","iopub.execute_input":"2025-04-13T08:57:52.15797Z","iopub.status.idle":"2025-04-13T08:58:41.987691Z","shell.execute_reply.started":"2025-04-13T08:57:52.15791Z","shell.execute_reply":"2025-04-13T08:58:41.987001Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Using LightGBM for prediction","metadata":{}},{"cell_type":"code","source":"from lightgbm import LGBMRegressor\nfrom sklearn.metrics import mean_squared_log_error\n\nlgm = LGBMRegressor(\n    n_estimators=300, \n    learning_rate=0.012057, \n    min_split_gain= 3, \n    max_depth=11, \n    reg_lambda = 0.70115,  \n    random_state=340,\n    feature_fraction=0.8,\n    n_jobs= -1,\n    device_type='gpu',\n    verbose=-1\n).fit(X_train, y_train)\n\npreds_light = lgm.predict(X_valid)\nprint(f'RMSLE: {np.sqrt(mean_squared_log_error(preds_light, y_valid)):,.5f}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T08:58:50.439679Z","iopub.execute_input":"2025-04-13T08:58:50.44005Z","iopub.status.idle":"2025-04-13T08:59:28.817105Z","shell.execute_reply.started":"2025-04-13T08:58:50.44001Z","shell.execute_reply":"2025-04-13T08:59:28.816246Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Extracting top features using feature importances","metadata":{}},{"cell_type":"code","source":"importances = lgm.feature_importances_\ncolumns = X.columns\n\nthreshold = np.quantile(importances, 0.5)\nselected_features = columns[importances > threshold]\ntop_X = X[selected_features]\nprint(selected_features)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T09:00:07.604726Z","iopub.execute_input":"2025-04-13T09:00:07.605077Z","iopub.status.idle":"2025-04-13T09:00:09.922346Z","shell.execute_reply.started":"2025-04-13T09:00:07.605046Z","shell.execute_reply":"2025-04-13T09:00:09.921335Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T09:03:51.786468Z","iopub.execute_input":"2025-04-13T09:03:51.78677Z","iopub.status.idle":"2025-04-13T09:03:54.038237Z","shell.execute_reply.started":"2025-04-13T09:03:51.786747Z","shell.execute_reply":"2025-04-13T09:03:54.037472Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Calculating cv score for top feature model","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import cross_val_score\n\nkf = KFold(n_splits=5, random_state=340, shuffle=True)\ntop_model_score = -1 * cross_val_score(lgm, top_X, y, cv=kf, scoring='neg_mean_squared_log_error').mean()\n\nprint(f'{np.sqrt(top_model_score)}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T09:03:58.419223Z","iopub.execute_input":"2025-04-13T09:03:58.419526Z","iopub.status.idle":"2025-04-13T09:06:09.042143Z","shell.execute_reply.started":"2025-04-13T09:03:58.419504Z","shell.execute_reply":"2025-04-13T09:06:09.041203Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Submission","metadata":{}},{"cell_type":"code","source":"top_X_train = X_train[selected_features]\ntop_X_test = X_test[selected_features]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T09:06:47.982329Z","iopub.execute_input":"2025-04-13T09:06:47.982665Z","iopub.status.idle":"2025-04-13T09:06:51.94962Z","shell.execute_reply.started":"2025-04-13T09:06:47.982643Z","shell.execute_reply":"2025-04-13T09:06:51.948908Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"lgm.fit(top_X_train, y_train)\n\ntest_preds = lgm.predict(top_X_test)\nsub = pd.read_csv('/kaggle/input/playground-series-s4e12/sample_submission.csv')\nsub['Premium Amount'] = np.exp(test_preds) - 1\nsub.to_csv('submission.csv', index=False)\nprint(\"Your submission was successfully saved!\")\nsub.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-13T09:06:55.218883Z","iopub.execute_input":"2025-04-13T09:06:55.219228Z","iopub.status.idle":"2025-04-13T09:07:27.500079Z","shell.execute_reply.started":"2025-04-13T09:06:55.219201Z","shell.execute_reply":"2025-04-13T09:07:27.499313Z"}},"outputs":[],"execution_count":null}]}