{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"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":"nvidiaTeslaT4","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"},{"sourceId":10064298,"sourceType":"datasetVersion","datasetId":6202384}],"dockerImageVersionId":30787,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"This notebook draws inspiration from the work of [@oscarm524](https://www.kaggle.com/oscarm524). You can explore his notebook for this competition [here](https://www.kaggle.com/code/oscarm524/ps-s4-ep12-eda-modeling-submission/notebook).","metadata":{}},{"cell_type":"code","source":"from catboost import CatBoostRegressor, Pool\nfrom sklearn.model_selection import RepeatedKFold\nfrom sklearn.metrics import mean_squared_log_error\nimport numpy as np\nimport pandas as pd\nimport pickle","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-01T13:25:58.320406Z","iopub.execute_input":"2024-12-01T13:25:58.32125Z","iopub.status.idle":"2024-12-01T13:25:58.325359Z","shell.execute_reply.started":"2024-12-01T13:25:58.321212Z","shell.execute_reply":"2024-12-01T13:25:58.324447Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class CFG:\n    train_filepath = '/kaggle/input/playground-series-s4e12/train.csv'\n    test_filepath = '/kaggle/input/playground-series-s4e12/test.csv'\n    original_filepath = '/kaggle/input/s4e12-original-data/Insurance Premium Prediction Dataset.csv'\n    submission_filepath = '/kaggle/input/playground-series-s4e12/sample_submission.csv'\n\n    target = 'Premium Amount'\n    seed = 42","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-01T13:25:58.529558Z","iopub.execute_input":"2024-12-01T13:25:58.529844Z","iopub.status.idle":"2024-12-01T13:25:58.533981Z","shell.execute_reply.started":"2024-12-01T13:25:58.529819Z","shell.execute_reply":"2024-12-01T13:25:58.533129Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = pd.read_csv(CFG.train_filepath, index_col=0)\ntest = pd.read_csv(CFG.test_filepath, index_col=0)\n\noriginal = pd.read_csv(CFG.original_filepath)\noriginal = original.dropna(subset=[CFG.target])\n\nsample_submission = pd.read_csv(CFG.submission_filepath)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-01T13:25:58.709619Z","iopub.execute_input":"2024-12-01T13:25:58.709863Z","iopub.status.idle":"2024-12-01T13:26:05.699652Z","shell.execute_reply.started":"2024-12-01T13:25:58.70984Z","shell.execute_reply":"2024-12-01T13:26:05.698895Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cat_cols = test.select_dtypes(include='object').columns.tolist()\nnum_cols = test.select_dtypes(exclude='object').columns.tolist()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-01T13:26:05.701626Z","iopub.execute_input":"2024-12-01T13:26:05.702006Z","iopub.status.idle":"2024-12-01T13:26:05.813131Z","shell.execute_reply.started":"2024-12-01T13:26:05.701967Z","shell.execute_reply":"2024-12-01T13:26:05.812282Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for col in cat_cols:\n    train[col] = train[col].astype('str')\n    test[col] = test[col].astype('str')\n    original[col] = original[col].astype('str')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-01T13:26:05.814321Z","iopub.execute_input":"2024-12-01T13:26:05.815011Z","iopub.status.idle":"2024-12-01T13:26:06.430132Z","shell.execute_reply.started":"2024-12-01T13:26:05.814971Z","shell.execute_reply":"2024-12-01T13:26:06.429408Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['is_org'] = 0\ntest['is_org'] = 0\noriginal['is_org'] = 1","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-01T13:26:06.431761Z","iopub.execute_input":"2024-12-01T13:26:06.432045Z","iopub.status.idle":"2024-12-01T13:26:06.438108Z","shell.execute_reply.started":"2024-12-01T13:26:06.432019Z","shell.execute_reply":"2024-12-01T13:26:06.437451Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = pd.concat([train, original], axis=0).reset_index(drop=True)\nX = train.drop(columns=[CFG.target], axis=1)\ny = train[CFG.target]\ny = np.log1p(y)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-01T13:26:06.438987Z","iopub.execute_input":"2024-12-01T13:26:06.439252Z","iopub.status.idle":"2024-12-01T13:26:07.664697Z","shell.execute_reply.started":"2024-12-01T13:26:06.439221Z","shell.execute_reply":"2024-12-01T13:26:07.663526Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cb_params = {\n    'loss_function': 'RMSE',\n    'iterations': 500,\n    'task_type': 'GPU'\n}\n\nkf = RepeatedKFold(n_splits=10, n_repeats=1, random_state=CFG.seed)\n\nscores, cat_oof_preds, cat_test_preds = list(), list(), list()\n\nfor i, (train_index, test_index) in enumerate(kf.split(X)):\n    print(f\"------------ Working on Fold {i} ------------\")\n    \n    X_train, X_test = X.iloc[train_index], X.iloc[test_index]\n    y_train, y_test = y.iloc[train_index], y.iloc[test_index]\n    \n    train_pool = Pool(data=X_train, label=y_train, cat_features=cat_cols)\n    test_pool = Pool(data=X_test, cat_features=cat_cols)\n    \n    cat_md = CatBoostRegressor(**cb_params)\n    cat_md.fit(train_pool, verbose=False)\n    preds = cat_md.predict(test_pool)\n    \n    preds_original = np.expm1(preds)\n    y_test_original = np.expm1(y_test)\n    \n    oof_preds = pd.DataFrame()\n    oof_preds['y'] = y_test_original.values\n    oof_preds['cat_preds'] = preds_original\n    oof_preds['fold'] = i\n    cat_oof_preds.append(oof_preds)\n    \n    rmsle = np.sqrt(mean_squared_log_error(y_test_original, preds_original))\n    print(f\"The RMSLE for fold {i} is {rmsle}\")\n    scores.append(rmsle)\n    \n    test_pool = Pool(data=test, cat_features=cat_cols)\n    test_preds = pd.DataFrame()\n    test_preds['cat_preds'] = np.expm1(cat_md.predict(test_pool))\n    test_preds['fold'] = i\n    cat_test_preds.append(test_preds)\n\ncat_oof_score = np.mean(scores)  \ncat_std = np.std(scores)\nprint(f\"The 10-fold average RMSLE score of the CatBoost model is {cat_oof_score}\")\nprint(f\"The 10-fold std RMSLE score of the CatBoost model is {cat_std}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-01T13:26:07.666068Z","iopub.execute_input":"2024-12-01T13:26:07.666464Z","iopub.status.idle":"2024-12-01T13:38:59.893816Z","shell.execute_reply.started":"2024-12-01T13:26:07.666424Z","shell.execute_reply":"2024-12-01T13:38:59.892893Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"out = pd.concat(cat_test_preds)\nfinal_preds = []\nfor i in range(0, 10):\n    dat = out[out['fold'] == i].reset_index(drop=True)\n    final_preds.append(dat['cat_preds'].values)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-01T13:38:59.894824Z","iopub.execute_input":"2024-12-01T13:38:59.895123Z","iopub.status.idle":"2024-12-01T13:39:00.145769Z","shell.execute_reply.started":"2024-12-01T13:38:59.895094Z","shell.execute_reply":"2024-12-01T13:39:00.144802Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission = pd.DataFrame()\nsubmission['id'] = sample_submission['id']\nsubmission['Premium Amount'] = np.mean(final_preds, axis=0)\nsubmission.to_csv('submission_cb_baseline.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-01T13:39:00.146983Z","iopub.execute_input":"2024-12-01T13:39:00.147867Z","iopub.status.idle":"2024-12-01T13:39:01.524376Z","shell.execute_reply.started":"2024-12-01T13:39:00.147834Z","shell.execute_reply":"2024-12-01T13:39:01.523444Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}