{"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 # 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-05T20:19:51.331918Z","iopub.execute_input":"2024-12-05T20:19:51.332373Z","iopub.status.idle":"2024-12-05T20:19:51.753372Z","shell.execute_reply.started":"2024-12-05T20:19:51.332329Z","shell.execute_reply":"2024-12-05T20:19:51.752103Z"}},"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')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T20:22:04.427452Z","iopub.execute_input":"2024-12-05T20:22:04.427938Z","iopub.status.idle":"2024-12-05T20:22:12.772253Z","shell.execute_reply.started":"2024-12-05T20:22:04.427874Z","shell.execute_reply":"2024-12-05T20:22:12.770908Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.head(5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T20:22:14.467281Z","iopub.execute_input":"2024-12-05T20:22:14.468449Z","iopub.status.idle":"2024-12-05T20:22:14.493393Z","shell.execute_reply.started":"2024-12-05T20:22:14.468393Z","shell.execute_reply":"2024-12-05T20:22:14.491939Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# All imports","metadata":{}},{"cell_type":"code","source":"import plotly.express as px\nimport matplotlib\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import MinMaxScaler\nfrom sklearn.preprocessing import OneHotEncoder\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.ensemble import RandomForestRegressor\nfrom xgboost import XGBClassifier\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import GridSearchCV\nfrom sklearn.metrics import mean_squared_log_error\nfrom sklearn.preprocessing import MinMaxScaler\nimport optuna","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T20:20:11.573622Z","iopub.execute_input":"2024-12-05T20:20:11.574051Z","iopub.status.idle":"2024-12-05T20:20:14.059537Z","shell.execute_reply.started":"2024-12-05T20:20:11.574Z","shell.execute_reply":"2024-12-05T20:20:14.057689Z"}},"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)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T20:22:18.858974Z","iopub.execute_input":"2024-12-05T20:22:18.859539Z","iopub.status.idle":"2024-12-05T20:22:19.484121Z","shell.execute_reply.started":"2024-12-05T20:22:18.859499Z","shell.execute_reply":"2024-12-05T20:22:19.482834Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Train Data","metadata":{}},{"cell_type":"code","source":"X = train_df.drop(columns=['id','Premium Amount','Policy Start Date'])\ny = np.log1p(train_df['Premium Amount'])\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-05T20:22:22.190391Z","iopub.execute_input":"2024-12-05T20:22:22.190803Z","iopub.status.idle":"2024-12-05T20:22:22.852667Z","shell.execute_reply.started":"2024-12-05T20:22:22.190767Z","shell.execute_reply":"2024-12-05T20:22:22.851277Z"}},"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])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T20:22:25.13956Z","iopub.execute_input":"2024-12-05T20:22:25.140033Z","iopub.status.idle":"2024-12-05T20:22:27.707438Z","shell.execute_reply.started":"2024-12-05T20:22:25.139994Z","shell.execute_reply":"2024-12-05T20:22:27.706241Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Encode Categorical columns","metadata":{}},{"cell_type":"code","source":"label_encoders = {}\n\nfor col in X[categorical_cols].columns.tolist():\n    le = LabelEncoder()\n    X[col] = le.fit_transform(X[col].astype(str))\n    label_encoders[col] = le","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T20:22:31.757298Z","iopub.execute_input":"2024-12-05T20:22:31.75777Z","iopub.status.idle":"2024-12-05T20:22:34.465159Z","shell.execute_reply.started":"2024-12-05T20:22:31.757729Z","shell.execute_reply":"2024-12-05T20:22:34.463837Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Scale fields","metadata":{}},{"cell_type":"code","source":"scaler = MinMaxScaler()\nscaler.fit(X[numeric_cols + categorical_cols])\nX[numeric_cols + categorical_cols] = scaler.transform(X[numeric_cols + categorical_cols])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T20:22:38.314487Z","iopub.execute_input":"2024-12-05T20:22:38.315536Z","iopub.status.idle":"2024-12-05T20:22:38.998358Z","shell.execute_reply.started":"2024-12-05T20:22:38.315493Z","shell.execute_reply":"2024-12-05T20:22:38.996852Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Split training data","metadata":{}},{"cell_type":"code","source":"X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=29)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T20:22:56.828203Z","iopub.execute_input":"2024-12-05T20:22:56.828628Z","iopub.status.idle":"2024-12-05T20:22:57.460118Z","shell.execute_reply.started":"2024-12-05T20:22:56.828563Z","shell.execute_reply":"2024-12-05T20:22:57.458987Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Training","metadata":{}},{"cell_type":"code","source":"%%time\n# Define objective function\ndef objective(trial):\n    # Suggest values for hyperparameters\n    n_estimators = trial.suggest_int(\"n_estimators\", 10, 500, log=True)\n    max_depth = trial.suggest_int(\"max_depth\", 2, 15)\n    min_samples_split = trial.suggest_int(\"min_samples_split\", 2, 10)\n    min_samples_leaf = trial.suggest_int(\"min_samples_leaf\", 1, 10)\n    device_type: \"gpu\"\n\n    # Create and fit random forest model\n    model = RandomForestRegressor(\n        n_estimators=n_estimators,\n        max_depth=max_depth,\n        min_samples_split=min_samples_split,\n        min_samples_leaf=min_samples_leaf,\n        random_state=29,\n    )\n    model.fit(X_train, y_train)\n\n    # Make predictions and calculate RMSE\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    return rmse_le\n\n# study = optuna.create_study(direction=\"minimize\")\n# # Run optimization process\n# study.optimize(objective, n_trials=5, show_progress_bar=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T20:23:04.708623Z","iopub.execute_input":"2024-12-05T20:23:04.709049Z","iopub.status.idle":"2024-12-05T20:23:04.718119Z","shell.execute_reply.started":"2024-12-05T20:23:04.709012Z","shell.execute_reply":"2024-12-05T20:23:04.716617Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"best_params = {\n    'n_estimators': 52, \n    'max_depth': 14, \n    'min_samples_split': 6, \n    'min_samples_leaf': 1,\n    'n_jobs': -1,\n    'random_state': 29\n}\n\nrf_model = RandomForestRegressor(**best_params)\n# Retrain the model\nrf_model.fit(X_train, y_train)\n\n# Make predictions and calculate RMSE\ny_preds = np.expm1(rf_model.predict(X_val))\ny_val_actuals = np.expm1(y_val)\nrmse_le = np.sqrt(mean_squared_log_error(y_val_actuals, y_preds))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T20:23:11.275381Z","iopub.execute_input":"2024-12-05T20:23:11.275878Z","iopub.status.idle":"2024-12-05T20:26:23.610185Z","shell.execute_reply.started":"2024-12-05T20:23:11.275822Z","shell.execute_reply":"2024-12-05T20:26:23.608553Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Test Data","metadata":{}},{"cell_type":"code","source":"split_policy_date(test_df)\n\nX_test = test_df.drop(columns=['id','Policy Start Date'])\nX_test[numeric_cols] = imputer.transform(X_test[numeric_cols])\nfor col in X_test[categorical_cols].columns.tolist():\n    le = label_encoders[col]\n    X_test[col] = X_test[col].apply(lambda x: le.transform([x])[0] if x in le.classes_ else -1)\n\nX_test[numeric_cols + categorical_cols] = scaler.transform(X_test[numeric_cols + categorical_cols])\ntest_preds = np.expm1(rf_model.predict(X_test))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T20:30:44.992495Z","iopub.execute_input":"2024-12-05T20:30:44.993139Z","iopub.status.idle":"2024-12-05T20:37:30.070784Z","shell.execute_reply.started":"2024-12-05T20:30:44.99305Z","shell.execute_reply":"2024-12-05T20:37:30.069408Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"sample_submission = pd.read_csv('/kaggle/input/playground-series-s4e12/sample_submission.csv')\nsample_submission['Premium Amount'] = test_preds\nsample_submission.to_csv('/kaggle/working/submission.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T20:37:52.144644Z","iopub.execute_input":"2024-12-05T20:37:52.145081Z","iopub.status.idle":"2024-12-05T20:37:54.134908Z","shell.execute_reply.started":"2024-12-05T20:37:52.145002Z","shell.execute_reply":"2024-12-05T20:37:54.133685Z"}},"outputs":[],"execution_count":null}]}