{"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"}],"dockerImageVersionId":30804,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd \n\nfrom catboost import Pool, CatBoostRegressor\nfrom sklearn.model_selection import KFold\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-12T18:50:38.909012Z","iopub.execute_input":"2024-12-12T18:50:38.90944Z","iopub.status.idle":"2024-12-12T18:50:38.915599Z","shell.execute_reply.started":"2024-12-12T18:50:38.909404Z","shell.execute_reply":"2024-12-12T18:50:38.914137Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ntrain_df = pd.read_csv(\"/kaggle/input/playground-series-s4e12/train.csv\")\ntest_df = pd.read_csv(\"/kaggle/input/playground-series-s4e12/test.csv\")\nsample = pd.read_csv(\"/kaggle/input/playground-series-s4e12/sample_submission.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T18:50:38.91805Z","iopub.execute_input":"2024-12-12T18:50:38.919371Z","iopub.status.idle":"2024-12-12T18:50:49.255947Z","shell.execute_reply.started":"2024-12-12T18:50:38.919312Z","shell.execute_reply":"2024-12-12T18:50:49.25434Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T18:50:49.257478Z","iopub.execute_input":"2024-12-12T18:50:49.257913Z","iopub.status.idle":"2024-12-12T18:50:49.288783Z","shell.execute_reply.started":"2024-12-12T18:50:49.257877Z","shell.execute_reply":"2024-12-12T18:50:49.287539Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T18:50:49.291384Z","iopub.execute_input":"2024-12-12T18:50:49.291886Z","iopub.status.idle":"2024-12-12T18:50:49.97421Z","shell.execute_reply.started":"2024-12-12T18:50:49.291841Z","shell.execute_reply":"2024-12-12T18:50:49.972433Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T18:50:49.976043Z","iopub.execute_input":"2024-12-12T18:50:49.976634Z","iopub.status.idle":"2024-12-12T18:50:50.003092Z","shell.execute_reply.started":"2024-12-12T18:50:49.976562Z","shell.execute_reply":"2024-12-12T18:50:50.001324Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T18:50:50.004376Z","iopub.execute_input":"2024-12-12T18:50:50.004853Z","iopub.status.idle":"2024-12-12T18:50:50.470212Z","shell.execute_reply.started":"2024-12-12T18:50:50.004815Z","shell.execute_reply":"2024-12-12T18:50:50.46879Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"duplicates = train_df.duplicated()\ndisplay(train_df[duplicates])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T18:50:50.471961Z","iopub.execute_input":"2024-12-12T18:50:50.472382Z","iopub.status.idle":"2024-12-12T18:50:52.333594Z","shell.execute_reply.started":"2024-12-12T18:50:50.472336Z","shell.execute_reply":"2024-12-12T18:50:52.332206Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.isna().sum()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T18:50:52.335345Z","iopub.execute_input":"2024-12-12T18:50:52.335887Z","iopub.status.idle":"2024-12-12T18:50:53.122087Z","shell.execute_reply.started":"2024-12-12T18:50:52.335833Z","shell.execute_reply":"2024-12-12T18:50:53.120205Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Drop unnecessary columns\ntrain_df = train_df.drop('id', axis=1)\n\n# Separate numeric and categorical columns\nnumeric_cols = train_df.select_dtypes(include=['float64', 'int64']).columns\ncategorical_cols = train_df.select_dtypes(include=['object', 'category']).columns\n\n# Fill missing values\ntrain_df[numeric_cols] = train_df[numeric_cols].fillna(train_df[numeric_cols].median())\ntrain_df[categorical_cols] = train_df[categorical_cols].fillna('Unknown')\n\n# Define categorical features (indices, not column names, for CatBoost)\ncat_features = [train_df.columns.get_loc(col) for col in categorical_cols]\n\n# Create CatBoost Pool\ntrain_pool = Pool(\n    data=train_df.drop('Premium Amount', axis=1),\n    label=train_df['Premium Amount'],\n    cat_features=cat_features\n)\n\n# Initialize KFold\nkf = KFold(n_splits=3, shuffle=True, random_state=42)\n\n# Model parameters\nparams = {\n    'iterations': 1000,\n    'learning_rate': 0.03,\n    'eval_metric': 'RMSE',  \n    'loss_function': 'RMSE',\n    'early_stopping_rounds': 50,\n    'verbose': False\n}\n\n# Storage for RMSLE scores\ncv_scores = []\n\n# CV loop\nfor fold, (train_idx, val_idx) in enumerate(kf.split(train_df)):\n    print(f\"\\nFold {fold + 1}\")\n    \n    # Create fold-specific pools\n    train_fold = train_pool.slice(train_idx)\n    val_fold = train_pool.slice(val_idx)\n    \n    # Initialize and train model\n    model = CatBoostRegressor(**params)\n    model.fit(train_fold, eval_set=val_fold)\n    \n    # Make predictions\n    val_preds = model.predict(val_fold)\n    val_true = val_fold.get_label()\n    \n    # Calculate RMSLE manually\n    if np.any(val_preds < 0) or np.any(val_true < 0):\n        raise ValueError(\"RMSLE cannot be calculated on negative values.\")\n    \n    rmsle = np.sqrt(np.mean((np.log1p(val_preds) - np.log1p(val_true)) ** 2))\n    cv_scores.append(rmsle)\n    print(f\"Fold {fold + 1} RMSLE: {rmsle:.4f}\")\n\nprint(f\"\\nMean RMSLE: {np.mean(cv_scores):.4f} ± {np.std(cv_scores):.4f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-12T18:50:53.125558Z","iopub.execute_input":"2024-12-12T18:50:53.126005Z","iopub.status.idle":"2024-12-12T19:43:20.820526Z","shell.execute_reply.started":"2024-12-12T18:50:53.12597Z","shell.execute_reply":"2024-12-12T19:43:20.818996Z"}},"outputs":[],"execution_count":null}]}