{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"},{"sourceId":9178166,"sourceType":"datasetVersion","datasetId":5547076}],"dockerImageVersionId":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"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\nimport 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\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":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install scikit-learn -U","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import root_mean_squared_log_error, root_mean_squared_error\nimport matplotlib.pyplot as plt; plt.style.use('ggplot')\nimport seaborn as sns\nimport plotly.express as px\n\nfrom sklearn.model_selection import KFold, StratifiedKFold, train_test_split\nfrom catboost import CatBoostClassifier, Pool\nfrom sklearn.metrics import accuracy_score, f1_score, balanced_accuracy_score, root_mean_squared_log_error\nfrom sklearn.preprocessing import LabelEncoder\n\nfrom sklearn.model_selection import KFold, StratifiedKFold, train_test_split, GridSearchCV, RepeatedKFold, RepeatedStratifiedKFold\nfrom tqdm import tqdm\nfrom xgboost import XGBRegressor\nfrom sklearn.metrics import mean_squared_error, mean_absolute_error\nfrom sklearn.preprocessing import StandardScaler, RobustScaler\nfrom lightgbm import LGBMRegressor\nfrom sklearn.model_selection import KFold, StratifiedKFold, train_test_split, GridSearchCV, RepeatedKFold, RepeatedStratifiedKFold\nfrom tqdm import tqdm\nfrom xgboost import XGBRegressor\nfrom sklearn.metrics import mean_squared_error\nfrom lightgbm import LGBMRegressor\nfrom sklearn.ensemble import HistGradientBoostingRegressor\nfrom sklearn.model_selection import RandomizedSearchCV, GridSearchCV\nfrom scipy.stats import uniform\nimport catboost as cb\nfrom hyperopt import fmin, tpe, hp, anneal, Trials\nfrom sklearn.model_selection import cross_val_score\nimport category_encoders as ce\nfrom catboost import CatBoostRegressor\nfrom sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, AdaBoostRegressor\nfrom sklearn.linear_model import HuberRegressor, Ridge\nfrom sklearn.tree import ExtraTreeRegressor\nfrom sklearn.preprocessing import StandardScaler, RobustScaler\nfrom hyperopt import fmin, tpe, hp, anneal, Trials\nimport optuna\nfrom sklearn.svm import SVR\nfrom sklearn.neural_network import MLPRegressor","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 1. Data Exploration","metadata":{}},{"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\")\norg = pd.read_csv(\"/kaggle/input/insurance-premium-prediction/Insurance Premium Prediction Dataset.csv\")\nsubmit = pd.read_csv(\"/kaggle/input/playground-series-s4e12/sample_submission.csv\")\nprint('train shape: ', train.shape)\nprint('test shape: ', test.shape)\nprint('org shape: ', org.shape)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def analyze_dataframe(df):\n    # Create a DataFrame to store the results\n    result_df = pd.DataFrame(index=df.columns, columns=['Unique Values', 'Missing Values'])\n\n    # Populate the result DataFrame with the desired information\n    for column in df.columns:\n        unique_values = df[column].nunique()\n        missing_values = df[column].isnull().sum()\n\n        result_df.loc[column] = [unique_values, missing_values]\n    return result_df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"analyze_dataframe(train)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"analyze_dataframe(test)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"analyze_dataframe(org)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# train[\"Premium Amount\"] = np.log(train[\"Premium Amount\"] + 1.0)\n# org[\"Premium Amount\"] = np.log(org[\"Premium Amount\"] + 1.0)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# visualize the target distribution\nfig, ax = plt.subplots(1,1,figsize=(10, 6))\npalette = sns.color_palette('tab10', 2)\nsns.kdeplot(data=train, x=train[\"Premium Amount\"], ax=ax, label='Train', color=palette[0], fill=True)\nsns.kdeplot(data=org, x=org[\"Premium Amount\"], ax=ax, label='Original', color=palette[1], fill=True)\nax.set_title(f'Original vs Generated', fontsize=12)\nax.legend(title='Dataset', loc='upper right', labels=['Train', 'Original'])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Numerical Features\nNUMERICAL_COLS = [\n    'Age',\n    'Annual Income',\n    'Health Score',\n    'Credit Score',\n    'Vehicle Age',\n    'Previous Claims',\n    'Insurance Duration',\n    'Number of Dependents',\n    'Premium Amount'\n]\n\n# correlation between numeric features\ndef plot_corr(df, method='pearson'):\n    corr_mat = df.corr(method=method) # default pearson\n    train_mask = np.triu(np.ones_like(corr_mat, dtype=bool))\n    cmap = sns.diverging_palette(100, 7, s = 75, l = 40, n = 5, center = 'light', as_cmap = True)\n\n    plt.figure(figsize = (15, 10))\n    sns.heatmap(corr_mat, annot = True, cmap = cmap, fmt = '.2f', center = 0,\n                annot_kws = {'size': 12}, mask = train_mask).set_title('Correlations Among Numeric Features')\n    plt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# train \nplot_corr(train[NUMERICAL_COLS], method='pearson')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plot_corr(org[NUMERICAL_COLS], method='pearson')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"TARGET = 'Premium Amount'\ntrain[TARGET].describe()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"org[TARGET].describe()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"CATEGORICAL_COLS = [\n    'Gender',\n    'Marital Status',\n    'Education Level',\n    'Occupation',\n    'Location',\n    'Policy Type',\n    'Customer Feedback',\n    'Smoking Status',\n    'Exercise Frequency',\n    'Property Type'\n]","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### Gender vs Target","metadata":{}},{"cell_type":"code","source":"# visualize Gender with target\ndef visualize_category_target(df, cat_col, target='Premium Amount', dataset='Train'):\n    fig, ax = plt.subplots(1,1,figsize=(10, 6))\n    cat_values = df[cat_col].unique()\n    print('No. unique values: ', cat_values.shape[0])\n    palette = sns.color_palette('tab10', len(cat_values))\n    for indx,val in enumerate(cat_values):\n        cat_data = df[df[cat_col] == val].reset_index(drop=True)\n        sns.kdeplot(data=cat_data, x=cat_data[target], ax=ax, label=val, color=palette[indx], fill=True)\n    ax.legend(title=dataset, loc='upper right', labels=cat_values)\nvisualize_category_target(train, 'Gender', dataset='Train')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Note**: No difference between Male and Female for Target distribution","metadata":{}},{"cell_type":"code","source":"visualize_category_target(org, 'Gender', dataset='Original Dataset')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### Marital Status vs Target","metadata":{}},{"cell_type":"code","source":"visualize_category_target(train, 'Marital Status',dataset=\"Train Dataset\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"visualize_category_target(org, 'Marital Status',dataset=\"Original Dataset\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Note**: No difference between Married, Single, Divorced in terms of TARGET","metadata":{}},{"cell_type":"markdown","source":"#### Education Level vs Target","metadata":{}},{"cell_type":"code","source":"visualize_category_target(train, 'Education Level',dataset=\"Original Dataset\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### Occupation vs Target","metadata":{}},{"cell_type":"code","source":"visualize_category_target(train, 'Occupation',dataset=\"Train Dataset\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### Location vs Target","metadata":{}},{"cell_type":"code","source":"visualize_category_target(train, 'Location',dataset=\"Train Dataset\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### Policy Type vs Target","metadata":{}},{"cell_type":"code","source":"visualize_category_target(train, 'Policy Type',dataset=\"Train Dataset\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"visualize_category_target(org, 'Policy Type',dataset=\"Original Dataset\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### Customer Feedback vs TARGET","metadata":{"execution":{"iopub.status.busy":"2024-12-08T08:22:29.384545Z","iopub.execute_input":"2024-12-08T08:22:29.385001Z","iopub.status.idle":"2024-12-08T08:22:29.533956Z","shell.execute_reply.started":"2024-12-08T08:22:29.384964Z","shell.execute_reply":"2024-12-08T08:22:29.532734Z"}}},{"cell_type":"code","source":"visualize_category_target(train, 'Customer Feedback',dataset=\"Train Dataset\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"visualize_category_target(org, 'Customer Feedback',dataset=\"Original Dataset\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### Smoking Status vs Target","metadata":{}},{"cell_type":"code","source":"visualize_category_target(train, 'Smoking Status',dataset=\"Train Dataset\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### Exercise Frequency vs Target","metadata":{}},{"cell_type":"code","source":"visualize_category_target(train, 'Exercise Frequency',dataset=\"Train Dataset\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#### Property Type vs Target","metadata":{}},{"cell_type":"code","source":"visualize_category_target(train, 'Property Type',dataset=\"Train Dataset\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2. Baseline Model","metadata":{}},{"cell_type":"code","source":"# drop unnecessary columns\ntrain.drop(columns=['id'], inplace=True)\ntest.drop(columns=['id'], inplace=True)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# correct order of org\norg = org[train.columns.tolist()]\nlearn = pd.concat([train, org], axis=0)\nlearn.dropna(subset=['Premium Amount'], inplace=True)\nlearn = learn.sample(frac=1.0, random_state=42) # shuffle learn, reproducible\nlearn.reset_index(drop=True, inplace=True)\nlabel = np.log(learn.pop('Premium Amount')+1)\n\n# get a local test set\nlearn, test_local, label, label_local = train_test_split(\n    learn, label,\n    test_size=0.1, \n    random_state=42, \n    # shuffle=True, \n    # stratify=label\n)\nlearn.reset_index(drop=True, inplace=True)\nlabel.reset_index(drop=True, inplace=True)\n\n# drop date column\nlearn.drop(columns=['Policy Start Date'], inplace=True)\ntest_local.drop(columns=['Policy Start Date'], inplace=True)\ntest.drop(columns=['Policy Start Date'], inplace=True)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# categorical encoding\nCATEGORICAL_COLS = [\n    'Gender',\n    'Marital Status',\n    'Education Level',\n    'Occupation',\n    'Location',\n    'Policy Type',\n    'Customer Feedback',\n    'Smoking Status',\n    'Exercise Frequency',\n    'Property Type'\n]\n# learn[CATEGORICAL_COLS]\nencoder = ce.OneHotEncoder(cols=CATEGORICAL_COLS)\nlearn = encoder.fit_transform(learn)\ntest = encoder.transform(test)\ntest_local = encoder.transform(test_local)\nprint('learn shape: ', learn.shape)\nprint('test shape: ', test.shape)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# K-Fold cross validation\nrandom_state=42\nN_FOLDS = 10\nskf = KFold(\n    n_splits=N_FOLDS, \n    shuffle=True, \n    random_state=random_state\n)\n\nscores = []\nscores_local = []\ntest_preds = []\nfor n_fold, (train_idx, valid_idx) in enumerate(skf.split(learn, label)):\n    X_train, y_train = learn.iloc[train_idx], label[train_idx]\n    X_val, y_val = learn.iloc[valid_idx], label[valid_idx]\n\n    model = XGBRegressor(n_estimators=500)\n    model.fit(X_train, y_train)\n\n    # make prediction on validation set\n    y_val_pred = model.predict(X_val)\n    # y_val_pred[np.where(y_val_pred < 0)] = 0  # min should be zero\n    val_score = root_mean_squared_error(y_val, y_val_pred)\n    scores.append(val_score)\n\n    # make prediction on local test set\n    y_local_pred = model.predict(test_local)\n    # y_local_pred[np.where(y_local_pred < 0)] = 0  # min should be zero\n    local_score = root_mean_squared_error(label_local, y_local_pred)\n    scores_local.append(local_score)\n    \n    y_test_pred = np.exp(model.predict(test))\n    test_preds.append(y_test_pred)\n    \nprint('Average validation RMSLE: ', np.mean(scores))\nprint('Average local test RMSLE: ', np.mean(scores_local))","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submit['Premium Amount'] = np.mean(test_preds, axis=0)\nsubmit.to_csv('submit.csv', index=False)\nsubmit","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}