{"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":"gpu","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"}],"dockerImageVersionId":30805,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"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\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-09T19:13:33.102864Z","iopub.execute_input":"2024-12-09T19:13:33.103765Z","iopub.status.idle":"2024-12-09T19:13:33.433632Z","shell.execute_reply.started":"2024-12-09T19:13:33.10373Z","shell.execute_reply":"2024-12-09T19:13:33.432798Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/playground-series-s4e12/train.csv')\ntest_df = pd.read_csv('/kaggle/input/playground-series-s4e12/test.csv')\nsubmission_df = pd.read_csv('/kaggle/input/playground-series-s4e12/sample_submission.csv') ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T19:24:54.665569Z","iopub.execute_input":"2024-12-09T19:24:54.666386Z","iopub.status.idle":"2024-12-09T19:25:00.606699Z","shell.execute_reply.started":"2024-12-09T19:24:54.666347Z","shell.execute_reply":"2024-12-09T19:25:00.605996Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.head(5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T19:14:15.402867Z","iopub.execute_input":"2024-12-09T19:14:15.403682Z","iopub.status.idle":"2024-12-09T19:14:15.436732Z","shell.execute_reply.started":"2024-12-09T19:14:15.403647Z","shell.execute_reply":"2024-12-09T19:14:15.435885Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.shape,test_df.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T19:14:19.055908Z","iopub.execute_input":"2024-12-09T19:14:19.056266Z","iopub.status.idle":"2024-12-09T19:14:19.062345Z","shell.execute_reply.started":"2024-12-09T19:14:19.056236Z","shell.execute_reply":"2024-12-09T19:14:19.061456Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# All imports","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import MinMaxScaler\nfrom catboost import CatBoostRegressor\nfrom sklearn.model_selection import KFold\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.metrics import mean_squared_log_error\nimport optuna","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T19:14:23.520829Z","iopub.execute_input":"2024-12-09T19:14:23.521883Z","iopub.status.idle":"2024-12-09T19:14:24.692356Z","shell.execute_reply.started":"2024-12-09T19:14:23.521846Z","shell.execute_reply":"2024-12-09T19:14:24.691667Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Data cleanup and feature engg:","metadata":{}},{"cell_type":"code","source":"def split_policy_date(df):\n    df['Policy Start Date'] = pd.to_datetime(df['Policy Start Date'])\n    df['Policy_Start_Year'] = df['Policy Start Date'].dt.year\n    df['Policy_Start_Month'] = df['Policy Start Date'].dt.month\n    df['Policy_Start_Day'] = df['Policy Start Date'].dt.day\n\nsplit_policy_date(train_df)\nsplit_policy_date(test_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T19:25:05.768618Z","iopub.execute_input":"2024-12-09T19:25:05.769336Z","iopub.status.idle":"2024-12-09T19:25:06.564614Z","shell.execute_reply.started":"2024-12-09T19:25:05.769301Z","shell.execute_reply":"2024-12-09T19:25:06.563888Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.head(5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T19:14:31.247632Z","iopub.execute_input":"2024-12-09T19:14:31.248412Z","iopub.status.idle":"2024-12-09T19:14:31.27069Z","shell.execute_reply.started":"2024-12-09T19:14:31.248379Z","shell.execute_reply":"2024-12-09T19:14:31.269583Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Prepara training data","metadata":{}},{"cell_type":"code","source":"X = train_df.drop(columns=['id','Premium Amount','Policy Start Date'])\nX_test = test_df.drop(columns=['id','Policy Start Date'])\n\ny = np.log1p(train_df['Premium Amount'])\n\nnumeric_cols = X.select_dtypes(include=np.number).columns.to_list()\ncategorical_cols = X.select_dtypes('object').columns.to_list()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T19:25:11.555263Z","iopub.execute_input":"2024-12-09T19:25:11.555924Z","iopub.status.idle":"2024-12-09T19:25:12.297183Z","shell.execute_reply.started":"2024-12-09T19:25:11.555891Z","shell.execute_reply":"2024-12-09T19:25:12.29645Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Impute Numeric columns","metadata":{}},{"cell_type":"code","source":"imputer = SimpleImputer(strategy='median')\nX[numeric_cols] = imputer.fit_transform(X[numeric_cols])\nX_test[numeric_cols] = imputer.transform(X_test[numeric_cols])\n\nprint (\"finished imputing numerical columns\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T19:25:16.152279Z","iopub.execute_input":"2024-12-09T19:25:16.152995Z","iopub.status.idle":"2024-12-09T19:25:17.930403Z","shell.execute_reply.started":"2024-12-09T19:25:16.152962Z","shell.execute_reply":"2024-12-09T19:25:17.929444Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Handle Categorical columns","metadata":{}},{"cell_type":"code","source":"# Impute missing values in categorical columns with \"Unknown\". \nfor col in categorical_cols:\n    X[col] = X[col].astype(str).fillna(\"Unknown\")\n    X_test[col] = X_test[col].astype(str).fillna(\"Unknown\")\n\nprint (\"finished imputing categorical columns\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T19:47:49.416779Z","iopub.execute_input":"2024-12-09T19:47:49.417595Z","iopub.status.idle":"2024-12-09T19:47:50.595514Z","shell.execute_reply.started":"2024-12-09T19:47:49.417562Z","shell.execute_reply":"2024-12-09T19:47:50.594574Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Train & Validate","metadata":{}},{"cell_type":"code","source":"def train_and_evaluate(X_train, y_train, X_val, y_val, **params):\n    model = CatBoostRegressor(**params,cat_features=categorical_cols)\n    model.fit(X_train, y_train)\n    y_preds = np.expm1(model.predict(X_val))\n    y_val_actuals = np.expm1(y_val)\n    rmse_le = np.sqrt(mean_squared_log_error(y_val_actuals, y_preds))\n\n    return model, rmse_le","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T19:56:25.526724Z","iopub.execute_input":"2024-12-09T19:56:25.527072Z","iopub.status.idle":"2024-12-09T19:56:25.532404Z","shell.execute_reply.started":"2024-12-09T19:56:25.527041Z","shell.execute_reply":"2024-12-09T19:56:25.531414Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"kfold = KFold(n_splits=5)\nmodels = []\nmodel_rmse = []\n\n# CatBoost parameters\nparams = {\n    'iterations': 1000,\n    'learning_rate': 0.1,\n    'depth': 6,\n    'loss_function': 'RMSE',\n    'random_seed': 42,\n    'task_type': 'GPU',\n    'verbose': 0\n}\n\n\nfor train_idxs, val_idxs in kfold.split(X):\n    X_train, y_train = X.iloc[train_idxs], y.iloc[train_idxs]\n    X_val, y_val = X.iloc[val_idxs], y.iloc[val_idxs]\n    model, val_rmse = train_and_evaluate(X_train, \n                                         y_train, \n                                         X_val, \n                                         y_val, \n                                         **params)\n    models.append(model)\n    model_rmse.append(val_rmse)\n    print('RMSE: {}'.format(val_rmse))\n\nmean_rmsle = np.mean(model_rmse)\nprint(f\"Mean RMSLE: {np.mean(model_rmse)}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T20:53:10.606548Z","iopub.execute_input":"2024-12-09T20:53:10.606864Z","iopub.status.idle":"2024-12-09T20:57:50.830393Z","shell.execute_reply.started":"2024-12-09T20:53:10.606836Z","shell.execute_reply":"2024-12-09T20:57:50.829573Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Test Data","metadata":{}},{"cell_type":"code","source":"test_preds = []\nfor i, model in enumerate(models):\n    preds = model.predict(X_test)\n    test_preds.append(np.expm1(preds))\n\ntest_preds_stacked = np.column_stack(test_preds)\ntest_preds_stacked\ntest_final_preds = np.mean(test_preds_stacked, axis=1)\n\nprint(\"Averaged Test Predictions Shape:\", test_preds_stacked.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T21:00:45.567204Z","iopub.execute_input":"2024-12-09T21:00:45.567548Z","iopub.status.idle":"2024-12-09T21:00:53.56592Z","shell.execute_reply.started":"2024-12-09T21:00:45.567519Z","shell.execute_reply":"2024-12-09T21:00:53.564932Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"print (\"Output results to csv\")\nsubmission_df['Premium Amount'] = test_final_preds\nsubmission_df.to_csv('/kaggle/working/submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T21:02:21.212654Z","iopub.execute_input":"2024-12-09T21:02:21.213323Z","iopub.status.idle":"2024-12-09T21:02:22.599634Z","shell.execute_reply.started":"2024-12-09T21:02:21.213291Z","shell.execute_reply":"2024-12-09T21:02:22.598677Z"}},"outputs":[],"execution_count":null}]}