{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"colab":{"provenance":[{"file_id":"1v8qwILddakrSJ5fAf-MDdc7q7CXajVlB","timestamp":1734022410381}],"gpuType":"T4","authorship_tag":"ABX9TyNVsHcvNeVoejp4FDJGMqdS"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\n\nimport pandas as pd\n\nimport matplotlib.pyplot as plt\n\nimport seaborn as sns\n\n%matplotlib inline\n\nimport warnings\n\nwarnings.filterwarnings('ignore')\n","metadata":{"id":"k6dCrzaVUX7H","executionInfo":{"status":"ok","timestamp":1734024961601,"user_tz":-330,"elapsed":392,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/playground-series-s4e12/train.csv')\n\ntest_df = pd.read_csv('/kaggle/input/playground-series-s4e12/test.csv')\n\nsample_submission = pd.read_csv('/kaggle/input/playground-series-s4e12/sample_submission.csv')","metadata":{"id":"YgvTl2dLVsog","executionInfo":{"status":"ok","timestamp":1734024972964,"user_tz":-330,"elapsed":10832,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.info()","metadata":{"id":"yyoyEGK1WAib","executionInfo":{"status":"ok","timestamp":1734024973354,"user_tz":-330,"elapsed":411,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"1ab66d6b-d8f1-4bad-c5b2-ca2f782614ec"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df.info()","metadata":{"id":"JLDnxbwdWQ2Q","executionInfo":{"status":"ok","timestamp":1734024973942,"user_tz":-330,"elapsed":591,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"085d06e5-76d8-4d07-92cd-8f30b1573405"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.columns","metadata":{"id":"trEZ70V3YGqP","executionInfo":{"status":"ok","timestamp":1734024973942,"user_tz":-330,"elapsed":5,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"2665e83c-56da-4043-ae8e-548958313d24"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.drop('id',axis=1,inplace=True)","metadata":{"id":"saBxryTsYVhf","executionInfo":{"status":"ok","timestamp":1734024974579,"user_tz":-330,"elapsed":641,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from scipy.stats import skew\n\nimport numpy as np\n\nimport pandas as pd\n\n\n\n# Select only numeric columns before calculating skewness\n\nnumeric_df = train_df.select_dtypes(include=np.number)\n\n\n\n# Calculate skewness for numeric columns only\n\ndata_skewness = skew(numeric_df, nan_policy='omit', axis=0) # Apply skew along each column (axis=0)\n\n\n\n# Print results for each column\n\nfor column, skewness in zip(numeric_df.columns, data_skewness):\n\n    print(f\"Skewness of {column}: {skewness}\")\n\n    if abs(skewness) < 0.5:\n\n        print(f\"{column}: The data is approximately normal.\")\n\n    elif skewness > 0:\n\n        print(f\"{column}: The data is positively skewed.\")\n\n    else:\n\n        print(f\"{column}: The data is negatively skewed.\")","metadata":{"id":"gWrPB1xycgsG","executionInfo":{"status":"ok","timestamp":1734024974579,"user_tz":-330,"elapsed":6,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"8d19c8f6-1ee7-4ccd-c628-f4961fcc6888"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df['Age'].fillna(train_df['Age'].mean(), inplace=True)\n\ntrain_df['Annual Income'].fillna(train_df['Annual Income'].median(), inplace=True)\n\ntrain_df['Number of Dependents'].fillna(train_df['Number of Dependents'].mean(), inplace=True)\n\ntrain_df['Credit Score'].fillna(train_df['Credit Score'].mean(), inplace=True)\n\ntrain_df['Health Score'].fillna(train_df['Health Score'].mean(), inplace=True)\n\ntrain_df['Previous Claims'].fillna(train_df['Previous Claims'].median(), inplace=True)\n\ntrain_df['Vehicle Age'].fillna(train_df['Vehicle Age'].mean(), inplace=True)\n\ntrain_df['Insurance Duration'].fillna(train_df['Insurance Duration'].mean(), inplace=True)\n","metadata":{"id":"wS1TBCiecPNz","executionInfo":{"status":"ok","timestamp":1734024974580,"user_tz":-330,"elapsed":6,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df['Marital Status'].fillna(train_df['Marital Status'].mode()[0], inplace=True)\n\ntrain_df['Occupation'].fillna(train_df['Occupation'].mode()[0], inplace=True)\n\ntrain_df['Customer Feedback'].fillna(train_df['Customer Feedback'].mode()[0], inplace=True)\n","metadata":{"id":"wOb-6Elgexh7","executionInfo":{"status":"ok","timestamp":1734024975853,"user_tz":-330,"elapsed":1279,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df['Policy Start Date'] = pd.to_datetime(train_df['Policy Start Date']).dt.date","metadata":{"id":"Vgwym3a5h8aJ","executionInfo":{"status":"ok","timestamp":1734024976260,"user_tz":-330,"elapsed":411,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\n\n\n\nle = LabelEncoder()\n\ntrain_df['Gender'] = le.fit_transform(train_df['Gender'])\n\ntrain_df['Marital Status'] = le.fit_transform(train_df['Marital Status'])\n\ntrain_df['Occupation'] = le.fit_transform(train_df['Occupation'])\n\ntrain_df['Customer Feedback'] = le.fit_transform(train_df['Customer Feedback'])\n\ntrain_df['Education Level'] = le.fit_transform(train_df['Education Level'])\n\ntrain_df['Location'] = le.fit_transform(train_df['Location'])\n\ntrain_df['Policy Type'] = le.fit_transform(train_df['Policy Type'])\n\ntrain_df['Smoking Status'] = le.fit_transform(train_df['Smoking Status'])\n\ntrain_df['Property Type'] = le.fit_transform(train_df['Property Type'])\n\ntrain_df['Exercise Frequency'] = le.fit_transform(train_df['Exercise Frequency'])\n","metadata":{"id":"G7MbiA-8fyb8","executionInfo":{"status":"ok","timestamp":1734024979485,"user_tz":-330,"elapsed":3229,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.drop('Policy Start Date',axis=1,inplace=True)","metadata":{"id":"9iCbZA2cgBqy","executionInfo":{"status":"ok","timestamp":1734024979490,"user_tz":-330,"elapsed":25,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df","metadata":{"id":"2-fQCJ3Xgyge","executionInfo":{"status":"ok","timestamp":1734024979490,"user_tz":-330,"elapsed":25,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"2e4386cc-e3f8-4507-8c1a-b1f8e5fa08e3"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pd.options.display.float_format = '{:,.2f}'.format","metadata":{"id":"JXYlkDInJrE3","executionInfo":{"status":"ok","timestamp":1734024979490,"user_tz":-330,"elapsed":23,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.describe()","metadata":{"id":"YnKExsSDJN8B","executionInfo":{"status":"ok","timestamp":1734024981246,"user_tz":-330,"elapsed":1780,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"09638d8a-692d-4c19-c277-bf27e5208894"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df\n","metadata":{"id":"aTWPxdYSi-fy","executionInfo":{"status":"ok","timestamp":1734024981247,"user_tz":-330,"elapsed":13,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"0ab94b7c-ed48-4083-fe63-292761cc565c"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df.isnull().sum()","metadata":{"id":"ka0arJEg6xwg","executionInfo":{"status":"ok","timestamp":1734024982110,"user_tz":-330,"elapsed":874,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"d3c865ab-57ca-497c-c186-f3225ba1d829"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from scipy.stats import skew\n\nimport numpy as np\n\nimport pandas as pd\n\n\n\n# Select only numeric columns before calculating skewness\n\nnumeric_df = test_df.select_dtypes(include=np.number)\n\n\n\n# Calculate skewness for numeric columns only\n\ndata_skewness = skew(numeric_df, nan_policy='omit', axis=0) # Apply skew along each column (axis=0)\n\n\n\n# Print results for each column\n\nfor column, skewness in zip(numeric_df.columns, data_skewness):\n\n    print(f\"Skewness of {column}: {skewness}\")\n\n    if abs(skewness) < 0.5:\n\n        print(f\"{column}: The data is approximately normal.\")\n\n    elif skewness > 0:\n\n        print(f\"{column}: The data is positively skewed.\")\n\n    else:\n\n        print(f\"{column}: The data is negatively skewed.\")","metadata":{"id":"0IVlDOMN62cg","executionInfo":{"status":"ok","timestamp":1734024982110,"user_tz":-330,"elapsed":10,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"addc5021-861d-4a94-bf5d-90f09fc57f8c"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df['Age'].fillna(test_df['Age'].mean(), inplace=True)\n\ntest_df['Annual Income'].fillna(test_df['Annual Income'].median(), inplace=True)\n\ntest_df['Number of Dependents'].fillna(test_df['Number of Dependents'].mean(), inplace=True)\n\ntest_df['Credit Score'].fillna(test_df['Credit Score'].mean(), inplace=True)\n\ntest_df['Health Score'].fillna(test_df['Health Score'].mean(), inplace=True)\n\ntest_df['Previous Claims'].fillna(test_df['Previous Claims'].median(), inplace=True)\n\ntest_df['Vehicle Age'].fillna(test_df['Vehicle Age'].mean(), inplace=True)\n\ntest_df['Insurance Duration'].fillna(test_df['Insurance Duration'].mean(), inplace=True)\n","metadata":{"id":"qyZczcv77iL5","executionInfo":{"status":"ok","timestamp":1734024982581,"user_tz":-330,"elapsed":480,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df['Marital Status'].fillna(test_df['Marital Status'].mode()[0], inplace=True)\n\ntest_df['Occupation'].fillna(test_df['Occupation'].mode()[0], inplace=True)\n\ntest_df['Customer Feedback'].fillna(test_df['Customer Feedback'].mode()[0], inplace=True)\n","metadata":{"id":"Bcg-g10Z9BsE","executionInfo":{"status":"ok","timestamp":1734024982582,"user_tz":-330,"elapsed":7,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df['Policy Start Date'] = pd.to_datetime(test_df['Policy Start Date']).dt.date","metadata":{"id":"a6cKW0Mg9NDv","executionInfo":{"status":"ok","timestamp":1734024983715,"user_tz":-330,"elapsed":1140,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\n\n\n\nle = LabelEncoder()\n\ntest_df['Gender'] = le.fit_transform(test_df['Gender'])\n\ntest_df['Marital Status'] = le.fit_transform(test_df['Marital Status'])\n\ntest_df['Occupation'] = le.fit_transform(test_df['Occupation'])\n\ntest_df['Customer Feedback'] = le.fit_transform(test_df['Customer Feedback'])\n\ntest_df['Education Level'] = le.fit_transform(test_df['Education Level'])\n\ntest_df['Location'] = le.fit_transform(test_df['Location'])\n\ntest_df['Policy Type'] = le.fit_transform(test_df['Policy Type'])\n\ntest_df['Smoking Status'] = le.fit_transform(test_df['Smoking Status'])\n\ntest_df['Property Type'] = le.fit_transform(test_df['Property Type'])\n\ntest_df['Exercise Frequency'] = le.fit_transform(test_df['Exercise Frequency'])\n","metadata":{"id":"IVUQnRo6BjJC","executionInfo":{"status":"ok","timestamp":1734024985226,"user_tz":-330,"elapsed":1515,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df.drop('Policy Start Date',axis=1,inplace=True)","metadata":{"id":"6SNEPyPBB5Fz","executionInfo":{"status":"ok","timestamp":1734024985226,"user_tz":-330,"elapsed":15,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df","metadata":{"id":"gtv3sf7HCFtg","executionInfo":{"status":"ok","timestamp":1734024985226,"user_tz":-330,"elapsed":15,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"5a9f19e6-c9d9-45e6-bd72-a8df6b6f4857"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\nimport numpy as np\n\nfrom sklearn.model_selection import train_test_split, cross_val_score\n\nfrom sklearn.metrics import mean_squared_log_error\n\nimport optuna\n\nfrom xgboost import XGBRegressor\n\nimport time","metadata":{"id":"jtOsY5MOIMuU","executionInfo":{"status":"ok","timestamp":1734025228801,"user_tz":-330,"elapsed":385,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = train_df.drop(columns=['Premium Amount'])\n\ny = train_df['Premium Amount']\n\n\n\ntest_X = test_df.drop(columns=['id'])\n\ntest_ids = test_df['id']","metadata":{"id":"rNciKU6DCILe","executionInfo":{"status":"ok","timestamp":1734025168102,"user_tz":-330,"elapsed":511,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_log = np.log1p(y)","metadata":{"id":"pyzDGGWDXin-","executionInfo":{"status":"ok","timestamp":1734025168102,"user_tz":-330,"elapsed":4,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install --upgrade xgboost","metadata":{"id":"yecKduGe_e5f","executionInfo":{"status":"ok","timestamp":1734025810937,"user_tz":-330,"elapsed":5454,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"69dcdf2e-e753-4965-94dc-64f46a57071a"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install optuna","metadata":{"id":"_J04lUw723nX","executionInfo":{"status":"ok","timestamp":1734025173487,"user_tz":-330,"elapsed":4022,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"531d0d48-404c-4968-946d-87b7ef1a290f"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.shape","metadata":{"id":"fBYtUFg9yYKA","executionInfo":{"status":"ok","timestamp":1734025175271,"user_tz":-330,"elapsed":378,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"58be2e02-6751-4080-8799-8bb5111496ad"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df.shape","metadata":{"id":"vZ1Vi_KlySzh","executionInfo":{"status":"ok","timestamp":1734025175654,"user_tz":-330,"elapsed":7,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"49968000-a7b7-45eb-d832-7463efeb376d"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def root_mean_squared_log_error(y_true, y_pred):\n\n    return np.sqrt(mean_squared_log_error(y_true, y_pred))","metadata":{"id":"rZYo04Wd4dv6","executionInfo":{"status":"ok","timestamp":1734025177275,"user_tz":-330,"elapsed":9,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train, X_val, y_train_log, y_val_log = train_test_split(X, y_log, test_size=0.2, random_state=42)\n","metadata":{"id":"fUEO8dYJ17H9","executionInfo":{"status":"ok","timestamp":1734025181283,"user_tz":-330,"elapsed":2485,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import xgboost as xgb","metadata":{"id":"-U5PI3a576HG","executionInfo":{"status":"ok","timestamp":1734025296876,"user_tz":-330,"elapsed":384,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define the objective function for Optuna\n\ndef objective(trial):\n\n    params = {\n\n        'objective': 'reg:squarederror',\n\n        'tree_method': 'hist',\n\n        'eval_metric': 'rmse',\n\n        'eta': trial.suggest_float('eta', 0.01, 0.3),\n\n        'max_depth': trial.suggest_int('max_depth', 3, 10),\n\n        'subsample': trial.suggest_float('subsample', 0.6, 1.0),\n\n        'colsample_bytree': trial.suggest_float('colsample_bytree', 0.6, 1.0),\n\n        'lambda': trial.suggest_float('lambda', 1e-3, 10.0),\n\n        'alpha': trial.suggest_float('alpha', 1e-3, 10.0),\n\n        'n_estimators': trial.suggest_int('n_estimators', 50, 200),\n\n        'early_stopping_rounds': 10\n\n    }\n\n\n\n    model = xgb.XGBRegressor(**params, random_state=42)\n\n\n\n    model.fit(X_train, y_train_log, eval_set=[(X_val, y_val_log)],  verbose=False)\n\n\n\n    val_preds_log = model.predict(X_val)\n\n    rmsle = root_mean_squared_log_error(np.expm1(y_val_log), np.expm1(val_preds_log))\n\n\n\n    return rmsle\n\n\n\n    # Run the Optuna study\n\nstudy = optuna.create_study(direction='minimize')\n\nstudy.optimize(objective, n_trials=20, n_jobs=-1)","metadata":{"id":"gQNuAZb25U-E","executionInfo":{"status":"ok","timestamp":1734026341906,"user_tz":-330,"elapsed":402041,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"44a9b7b3-8f29-4ede-c56c-751337271f49"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Best hyperparameters:\", study.best_params)","metadata":{"id":"I96KgfwX_iHR","executionInfo":{"status":"ok","timestamp":1734026378504,"user_tz":-330,"elapsed":389,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"d9199755-bd7a-4199-d253-93e85ee9f084"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"best_params = study.best_params\n\nfinal_model = xgb.XGBRegressor(**best_params, random_state=42)\n\nfinal_model.fit(X_train, y_train_log)\n","metadata":{"id":"cdGm6VUuBrjh","executionInfo":{"status":"ok","timestamp":1734026415516,"user_tz":-330,"elapsed":24799,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"c5ab9a32-23f3-453a-ee18-c630992e4eab"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"val_preds_log = final_model.predict(X_val)\n\nval_preds = np.expm1(val_preds_log)  # Reverse log-transform to original scale\n","metadata":{"id":"4iwJ3LYWBuoc","executionInfo":{"status":"ok","timestamp":1734026452031,"user_tz":-330,"elapsed":3256,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"rmsle = root_mean_squared_log_error(np.expm1(y_val_log), val_preds)\n\nprint(f\"Validation RMSLE: {rmsle}\")","metadata":{"id":"lY51lLlaB8z9","executionInfo":{"status":"ok","timestamp":1734026459840,"user_tz":-330,"elapsed":398,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"9e2685bd-af11-472b-f588-93b0fe2965be"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_preds_log = final_model.predict(test_X)\n\ntest_preds = np.expm1(test_preds_log)","metadata":{"id":"YkEvd29HB_ZC","executionInfo":{"status":"ok","timestamp":1734026472367,"user_tz":-330,"elapsed":5191,"user":{"displayName":"Sumit","userId":"12696857742786416820"}}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission = pd.DataFrame({\n\n    'id': test_ids,\n\n    'Premium Amount': test_preds\n\n})\n\nsubmission.to_csv('xgboost_optuna_rmsle.csv', index=False)\n\nprint(\"Submission file saved as 'xgboost_optuna_rmsle.csv'.\")","metadata":{"id":"LL0O1D6aCBS7","executionInfo":{"status":"ok","timestamp":1734026482893,"user_tz":-330,"elapsed":2761,"user":{"displayName":"Sumit","userId":"12696857742786416820"}},"outputId":"2cbf6f07-7752-44d7-a161-866e7ef10afc"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"id":"dG4a5kbGCEc_"},"outputs":[],"execution_count":null}]}