{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","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":30823,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Importing libraries and datasets","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport optuna\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport re\nimport warnings\n\nwarnings.filterwarnings('ignore')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:26:12.619427Z","iopub.execute_input":"2024-12-30T09:26:12.619801Z","iopub.status.idle":"2024-12-30T09:26:14.237246Z","shell.execute_reply.started":"2024-12-30T09:26:12.619761Z","shell.execute_reply":"2024-12-30T09:26:14.235877Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/playground-series-s4e12/train.csv', index_col='id')\ntest = pd.read_csv('/kaggle/input/playground-series-s4e12/test.csv', index_col='id')\nsample = pd.read_csv('/kaggle/input/playground-series-s4e12/sample_submission.csv')\noriginal = pd.read_csv('/kaggle/input/insurance-premium-prediction/Insurance Premium Prediction Dataset.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:26:14.239027Z","iopub.execute_input":"2024-12-30T09:26:14.239592Z","iopub.status.idle":"2024-12-30T09:26:27.482998Z","shell.execute_reply.started":"2024-12-30T09:26:14.239559Z","shell.execute_reply":"2024-12-30T09:26:27.48194Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.columns = train.columns.str.lower().str.replace(' ', '_')\ntest.columns = test.columns.str.lower().str.replace(' ', '_')\noriginal.columns = original.columns.str.lower().str.replace(' ', '_')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:26:27.484628Z","iopub.execute_input":"2024-12-30T09:26:27.485052Z","iopub.status.idle":"2024-12-30T09:26:27.491788Z","shell.execute_reply.started":"2024-12-30T09:26:27.485008Z","shell.execute_reply":"2024-12-30T09:26:27.490512Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.head(1) # target - premium_amount","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:26:27.493064Z","iopub.execute_input":"2024-12-30T09:26:27.493488Z","iopub.status.idle":"2024-12-30T09:26:27.536916Z","shell.execute_reply.started":"2024-12-30T09:26:27.493445Z","shell.execute_reply":"2024-12-30T09:26:27.535734Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.describe().round(2)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:26:27.539731Z","iopub.execute_input":"2024-12-30T09:26:27.540014Z","iopub.status.idle":"2024-12-30T09:26:28.23023Z","shell.execute_reply.started":"2024-12-30T09:26:27.539988Z","shell.execute_reply":"2024-12-30T09:26:28.229158Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Functions to work with features","metadata":{}},{"cell_type":"code","source":"# def converter(df):\n#     columns = df.select_dtypes(exclude='number').columns.tolist()\n\n#     for col in columns:\n#         df[col] = df[col].astype('category')\n\n#     return df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:26:28.232518Z","iopub.execute_input":"2024-12-30T09:26:28.232888Z","iopub.status.idle":"2024-12-30T09:26:28.237337Z","shell.execute_reply.started":"2024-12-30T09:26:28.232857Z","shell.execute_reply":"2024-12-30T09:26:28.23608Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from datetime import timedelta\n\ndef feature_transformer(df):\n\n    df['policy_start_date'] = pd.to_datetime(df['policy_start_date'])\n\n    df['year'] = df['policy_start_date'].dt.year\n    df['day'] = df['policy_start_date'].dt.day\n    df['month'] = df['policy_start_date'].dt.month\n    df['day_of_year'] = df['policy_start_date'].dt.dayofyear\n    df['day_of_week'] = df['policy_start_date'].dt.weekday\n    df['sin_day_of_week'] = np.sin(2 * np.pi * df['day_of_week'] / 7)\n    df['cos_day_of_week'] = np.cos(2 * np.pi * df['day_of_week'] / 7)\n    \n    df[\"seconds since 1970\"] = df['policy_start_date'].astype(\"int64\") // 10**9\n    \n    df['days_passed'] = (df['policy_start_date'].max() - df['policy_start_date']).dt.days\n    \n    df['cat_day_of_week'] = df['day_of_week'].astype('string')\n    df['cat_year'] = df['year'].astype('string')\n    df['cat_day'] = df['day'].astype('string')\n    df['cat_day_of_year'] = df['day_of_year'].astype('string')\n    df['cat_month'] = df['month'].astype('string')\n    \n\n    policy_starts_min = df['policy_start_date'].min()  # 2019-08-17\n    year = policy_starts_min.year  \n    \n    if policy_starts_min >= pd.Timestamp(f'{year}-01-01'):\n        fiscal_year_start = pd.Timestamp(f'{year}-08-01')\n    else:\n        fiscal_year_start = pd.Timestamp(f'{year-1}-08-01')\n\n    \n    df['time_from_fiscal_year'] = (df['policy_start_date'] - fiscal_year_start).dt.days\n    df['seconds_from_fiscal_year'] = (df['policy_start_date'] - fiscal_year_start).dt.total_seconds()\n\n    new_date = policy_starts_min - timedelta(days=1)\n    \n    df['time_from_first_policy'] = (df['policy_start_date'] - new_date).dt.days\n    \n    df['time_from_first_policy_seconds'] = (df['policy_start_date'] - new_date).dt.total_seconds()\n    \n    df['Days Passed'] = (df['policy_start_date'].max() - df['policy_start_date']).dt.days\n\n    df['claims_vs_duration'] = df['previous_claims'] / df['insurance_duration']\n    df['days_from_2019_crisis'] = (df['policy_start_date'] - pd.Timestamp('2019-01-01')).dt.days\n    df['revenue_per_dependent'] = (df['annual_income'] / df['number_of_dependents'] + 1)\n    df['ratio_of_doubts'] = (df['previous_claims'] + 1) / df['annual_income'] # NEW\n    \n    df['marital_status_customer_feedback'] = df['marital_status'] + df['customer_feedback']\n    df['customer_feedback_property_type'] = df['customer_feedback'] + df['property_type']\n    df['customer_feedback_year'] = df['customer_feedback'] + df['cat_year'] # тут упала\n    df['marital_status_year'] = df['marital_status'] + df['cat_year']\n    df['exercise_frequency_year'] = df['exercise_frequency'] + df['cat_year']\n    df['customer_feedback_smoking_status'] = df['customer_feedback'] + df['smoking_status']\n    df['customer_feedback_property_type'] = df['customer_feedback'] + df['property_type']\n    df['year_day_of_week'] = df['cat_year'] + df['cat_day_of_week']\n    df['property_type_year'] = df['property_type'] + df['cat_year']\n    df['policy_type_year'] = df['policy_type'] + df['cat_year']\n    df['gender_marital_status'] = df['gender'] + df['marital_status']\n    df['education_level_customer_feedback'] = df['education_level'] + df['customer_feedback']\n    df['gender_year'] = df['gender'] + df['cat_year']\n    df['marital_status_day_of_week'] = df['marital_status'] + df['cat_day_of_week']\n    df['occupation_customer_feedback'] = df['occupation'] + df['customer_feedback']\n    df['occupation_year'] = df['occupation'] + df['cat_year']\n    df['location_customer_feedback'] = df['location'] + df['customer_feedback'] \n    df['location_day_of_week'] = df['location'] + df['cat_day_of_week']\n    df['education_level_year'] = df['education_level'] + df['cat_year']\n    df['customer_feedback_month'] = df['customer_feedback'] + df['cat_month']\n    df['marital_status_day'] = df['marital_status'] + df['cat_day']\n    df['exercise_frequency_property_type'] = df['exercise_frequency'] + df['property_type']\n    df['education_level_day_of_week'] = df['education_level'] + df['cat_day_of_week']\n    df['education_level_month'] = df['education_level'] + df['cat_month']\n    df['marital_status_policy_type'] = df['marital_status'] + df['policy_type']\n    df['location_month'] = df['location'] + df['cat_month']\n    df['exercise_frequency_day'] = df['exercise_frequency'] + df['cat_day']\n    df['year_month'] = df['cat_year'] + df['cat_month']\n    df['education_level_occupation'] = df['education_level'] + df['occupation']\n    df['marital_status_smoking_status'] = df['marital_status'] + df['smoking_status']\n    df['marital_status_occupation'] = df['marital_status'] + df['occupation']\n    df['property_type_month'] = df['property_type'] + df['cat_month']\n    df['policy_type_customer_feedback'] = df['policy_type'] + df['customer_feedback']\n    df['gender_day_of_year'] = df['gender'] + df['cat_day_of_year']\n\n    df.drop(columns=['time_from_first_policy', 'policy_start_date'], inplace=True)\n\n    return df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:26:28.238213Z","iopub.execute_input":"2024-12-30T09:26:28.23854Z","iopub.status.idle":"2024-12-30T09:26:28.25565Z","shell.execute_reply.started":"2024-12-30T09:26:28.23851Z","shell.execute_reply":"2024-12-30T09:26:28.254224Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def columns_imputer(df):\n    for c in df.columns:\n        df[f\"is_{c}_na\"] = df[c].isna().astype(int)\n\n    return df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:26:28.257166Z","iopub.execute_input":"2024-12-30T09:26:28.257496Z","iopub.status.idle":"2024-12-30T09:26:28.2797Z","shell.execute_reply.started":"2024-12-30T09:26:28.257467Z","shell.execute_reply":"2024-12-30T09:26:28.278385Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"num_cols = ['age', 'annual_income', 'number_of_dependents', 'health_score','previous_claims', 'vehicle_age', 'credit_score', 'insurance_duration']\n\nfor col in num_cols:\n    print(f\"Column {col} has {train[train[col] == 0].shape[0]} zeros\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:26:28.281198Z","iopub.execute_input":"2024-12-30T09:26:28.281636Z","iopub.status.idle":"2024-12-30T09:26:28.470929Z","shell.execute_reply.started":"2024-12-30T09:26:28.281592Z","shell.execute_reply":"2024-12-30T09:26:28.469779Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def num_to_cat(df):\n    global num_cols\n\n    for col in num_cols:\n        df[f\"categorial_{col}\"] = df[col].astype('category')\n\n    return df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:26:28.471919Z","iopub.execute_input":"2024-12-30T09:26:28.472286Z","iopub.status.idle":"2024-12-30T09:26:28.478162Z","shell.execute_reply.started":"2024-12-30T09:26:28.472252Z","shell.execute_reply":"2024-12-30T09:26:28.476686Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# for col in num_cols:\n#     sns.displot(train, x=col, kind=\"kde\")  \n#     plt.title(f\"Distribution of {col}\")\n#     plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:26:28.479398Z","iopub.execute_input":"2024-12-30T09:26:28.479723Z","iopub.status.idle":"2024-12-30T09:26:28.499705Z","shell.execute_reply.started":"2024-12-30T09:26:28.479685Z","shell.execute_reply":"2024-12-30T09:26:28.498493Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Model preparation","metadata":{}},{"cell_type":"code","source":"X = train.drop('premium_amount', axis=1)\ny = train['premium_amount']\n\ny_log1p = np.log1p(y)\n\nX = feature_transformer(X)\nX = columns_imputer(X)\nX = num_to_cat(X) # categorical_age\n\ncats = X.select_dtypes(include=['string', 'category', 'object']).columns.tolist()\nnums = X.select_dtypes(include=['number']).columns.tolist()\n\n# # Ensure that 'None' is included as a category\n# X[cats] = X[cats].fillna('None').astype('string')\n# X[nums] = X[nums].fillna(-999).astype(float)\n\n#X = feature_transformer(X)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:26:28.500645Z","iopub.execute_input":"2024-12-30T09:26:28.501045Z","iopub.status.idle":"2024-12-30T09:26:48.124262Z","shell.execute_reply.started":"2024-12-30T09:26:28.501001Z","shell.execute_reply":"2024-12-30T09:26:48.122969Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for col in cats:\n    X[col] = X[col].astype('string')\n\n\nX[cats] = X[cats].fillna('None').astype('string')\nX[nums] = X[nums].fillna(-999).astype(float)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:26:48.125654Z","iopub.execute_input":"2024-12-30T09:26:48.126067Z","iopub.status.idle":"2024-12-30T09:27:07.841714Z","shell.execute_reply.started":"2024-12-30T09:26:48.126025Z","shell.execute_reply":"2024-12-30T09:27:07.840249Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import KFold, train_test_split\nfrom sklearn.metrics import mean_squared_error, mean_squared_log_error\nfrom catboost import CatBoostRegressor, Pool\n\nclass CatboostWithOptuna:\n    def __init__(self, X, y, n_folds=10, random_state=42, verbose=0, task_type='GPU', optuna_params=None):\n        self.X = X\n        self.y = y\n        self.n_folds = n_folds\n        self.random_state = random_state\n        self.verbose = verbose\n        self.task_type = task_type\n        self.best_model_params = {}\n\n        # Placeholders\n        self.oof_predictions = []  # Out-of-fold predictions\n        self.catboost_params_history = []  # История гиперпараметров\n        self.best_score = float('inf')  # Лучший результат\n\n    def _suggest_hyperparams(self, trial):\n        return {\n            'iterations' : trial.suggest_int('iterations', 400, 1000),\n            'learning_rate' : trial.suggest_float('learning_rate', 0.01, 0.4, log=True),\n            'depth' : trial.suggest_int('depth', 4, 9),\n            'l2_leaf_reg' : trial.suggest_float('l2_leaf_reg', 0.1, 1, log=True),\n            'loss_function' : trial.suggest_categorical('loss_function', ['RMSE']),\n            'random_strength' : trial.suggest_float('random_strength', 1e-3, 1, log=True),\n            'bagging_temperature' : trial.suggest_float('bagging_temperature', 1e-2, 1, log=True)\n        }\n    \n    def objective(self, trial):\n        \n        params = self._suggest_hyperparams(trial)\n\n        cat_features = self.X.select_dtypes(include=['category', 'string', 'object']).columns.tolist()\n\n        # K-fold CV\n        kf = KFold(n_splits=self.n_folds, shuffle=True, random_state=self.random_state)\n        fold_rmsle = []\n        oof_preds = np.zeros((self.X.shape[0]))\n\n        for fold, (train_index, val_index) in enumerate(kf.split(self.X)):\n            print(f\"Fold {fold + 1} out of {self.n_folds}\")\n\n            X_train, X_val = self.X.iloc[train_index], self.X.iloc[val_index]\n            y_train, y_val = self.y.iloc[train_index], self.y.iloc[val_index]\n\n            # Model creation \n            model = CatBoostRegressor(iterations=params['iterations'],\n                                      learning_rate=params['learning_rate'],\n                                      depth=params['depth'],\n                                      l2_leaf_reg=params['l2_leaf_reg'],\n                                      loss_function=params['loss_function'],\n                                      random_strength=params['random_strength'],\n                                      bagging_temperature=params['bagging_temperature'],\n                                     verbose=0,\n                                     task_type=self.task_type)\n            \n            model.fit(X_train, y_train, cat_features=cat_features)\n\n            val_pred = model.predict(X_val)\n\n            oof_preds[val_index] = val_pred\n\n            fold_rmsle.append(mean_squared_error(y_val, val_pred, squared=False))\n        \n        # save oof predictions\n        self.oof_predictions.append(oof_preds.copy())\n\n        mean_rmsle = np.mean(fold_rmsle)\n        self.catboost_params_history.append({**params, 'RMSE': mean_rmsle})\n\n        return mean_rmsle\n\n        \n\n\n    def optimize(self,n_trials=10):\n        study = optuna.create_study(direction='minimize')\n        study.optimize(self.objective, n_trials=n_trials)\n        self.best_model_params = study.best_params\n        self.best_score = study.best_value\n\n        return study\n\n    @property\n    def oof(self):\n        if not self.oof_predictions:\n            raise ValueError(\"No OOF preds available\")\n        return self.oof_predictions","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:27:07.847032Z","iopub.execute_input":"2024-12-30T09:27:07.847431Z","iopub.status.idle":"2024-12-30T09:27:08.632393Z","shell.execute_reply.started":"2024-12-30T09:27:07.847398Z","shell.execute_reply":"2024-12-30T09:27:08.631375Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# OOF PREDICTIONS AND HYPERPARAMETERS SEARCH","metadata":{}},{"cell_type":"code","source":"# hyperparam_search = CatboostWithOptuna(X, y_log1p, n_folds = 5)\n# first_study = hyperparam_search.optimize(n_trials=40) # n_trials=50 is good","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:27:08.640269Z","iopub.execute_input":"2024-12-30T09:27:08.640744Z","iopub.status.idle":"2024-12-30T09:27:08.662712Z","shell.execute_reply.started":"2024-12-30T09:27:08.640686Z","shell.execute_reply":"2024-12-30T09:27:08.661584Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# from sklearn.model_selection import train_test_split\n\n# X_train, X_test, y_train, y_test = train_test_split(\n#     X, y, test_size=0.2, random_state=42)\n\n# y_train_log1p = np.log1p(y_train)\n# y_test_log1p = np.log1p(y_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:27:08.663739Z","iopub.execute_input":"2024-12-30T09:27:08.664051Z","iopub.status.idle":"2024-12-30T09:27:22.675566Z","shell.execute_reply.started":"2024-12-30T09:27:08.664017Z","shell.execute_reply":"2024-12-30T09:27:22.674387Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# train_pool = Pool(X_train, y_train_log1p, feature_names = X_train.columns.tolist(), cat_features=cat_features)\n# test_pool = Pool(X_test, y_test_log1p, feature_names = X_test.columns.tolist(), cat_features=cat_features)\n\n\n# model = CatBoostRegressor(**first_study.best_params,\n#         random_state=42,\n#         task_type='GPU',\n#         verbose = 0,\n#         cat_features=cat_features)\n\n# model.fit(X_train, y_train)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:27:22.676514Z","iopub.execute_input":"2024-12-30T09:27:22.676788Z","iopub.status.idle":"2024-12-30T09:27:22.681242Z","shell.execute_reply.started":"2024-12-30T09:27:22.676764Z","shell.execute_reply":"2024-12-30T09:27:22.679931Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# feature_importances = model.get_feature_importance(train_pool, type='FeatureImportance')\n# feature_names = X_train.columns\n\n\n# plt.figure(figsize=(20, 10))\n# sns.barplot(x=feature_importances, y=feature_names)\n# plt.title(\"Feature Importances\")\n# plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:27:22.681915Z","iopub.execute_input":"2024-12-30T09:27:22.682356Z","iopub.status.idle":"2024-12-30T09:27:22.703164Z","shell.execute_reply.started":"2024-12-30T09:27:22.682315Z","shell.execute_reply":"2024-12-30T09:27:22.702004Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# oof_preds = hyperparam_search.oof_predictions\n\n# # Sum of predictions from all trials\n# mean_squared_log_error(y, sum(np.expm1(oof_preds))/len(oof_preds), squared = False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:27:22.704489Z","iopub.execute_input":"2024-12-30T09:27:22.704983Z","iopub.status.idle":"2024-12-30T09:27:22.724647Z","shell.execute_reply.started":"2024-12-30T09:27:22.704912Z","shell.execute_reply":"2024-12-30T09:27:22.723426Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"catboost_params = {'iterations': 719, 'learning_rate': 0.050771585717022505, 'depth': 9, 'l2_leaf_reg': 0.35647655856918115, 'loss_function': 'RMSE', 'random_strength': 0.06546237246369487, 'bagging_temperature': 0.011774942898945484}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:27:22.725938Z","iopub.execute_input":"2024-12-30T09:27:22.726429Z","iopub.status.idle":"2024-12-30T09:27:22.744878Z","shell.execute_reply.started":"2024-12-30T09:27:22.726384Z","shell.execute_reply":"2024-12-30T09:27:22.74375Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Function for creating oof predictions (on test data)\ndef cv_test_preds(X, y, X_test,n_folds=5):\n\n    folds = KFold(n_splits=n_folds, shuffle=True, random_state=42)\n    test_preds = []\n\n    for fold, (train_idx, val_idx) in enumerate(folds.split(X, y)):\n\n        X_train, y_train = X.iloc[train_idx], y.iloc[train_idx]\n\n        # Finding categorical features\n        cat_features = X_test.select_dtypes(exclude=['number']).columns.tolist()\n\n\n        model = CatBoostRegressor(**catboost_params,\n        random_state=42,\n        task_type='CPU',\n        verbose = 0,\n        cat_features=cat_features)\n        model.fit(X_train, y_train, cat_features=cat_features)\n\n        # Making predictions\n        test_preds.append(model.predict(X_test))\n\n    return test_preds","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:27:22.746042Z","iopub.execute_input":"2024-12-30T09:27:22.746483Z","iopub.status.idle":"2024-12-30T09:27:22.767763Z","shell.execute_reply.started":"2024-12-30T09:27:22.746437Z","shell.execute_reply":"2024-12-30T09:27:22.766547Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# X_test = test\n# X_test = columns_imputer(X_test)\n\n# cats = X_test.select_dtypes(exclude=['number']).columns.tolist()\n# nums = X_test.select_dtypes(include=['number']).columns.tolist()\n\n# X_test[cats] = X_test[cats].fillna('None').astype('string')\n# X_test[nums] = X_test[nums].fillna(-999).astype(float)\n\n# X_test = feature_transformer(X_test)\n# X_test = num_to_cat(X_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:27:22.768908Z","iopub.execute_input":"2024-12-30T09:27:22.769382Z","iopub.status.idle":"2024-12-30T09:27:22.791318Z","shell.execute_reply.started":"2024-12-30T09:27:22.769333Z","shell.execute_reply":"2024-12-30T09:27:22.790183Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_test = test\n\nX_test = feature_transformer(X_test)\nX_test = columns_imputer(X_test)\nX_test = num_to_cat(X_test) # categorical_age\n\ncats = X_test.select_dtypes(include=['string', 'category', 'object']).columns.tolist()\nnums = X_test.select_dtypes(include=['number']).columns.tolist()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:27:22.792572Z","iopub.execute_input":"2024-12-30T09:27:22.792949Z","iopub.status.idle":"2024-12-30T09:27:35.825356Z","shell.execute_reply.started":"2024-12-30T09:27:22.792908Z","shell.execute_reply":"2024-12-30T09:27:35.823813Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for col in cats:\n    X_test[col] = X_test[col].astype('string')\n\n\nX_test[cats] = X_test[cats].fillna('None').astype('string')\nX_test[nums] = X_test[nums].fillna(-999).astype(float)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:27:35.82651Z","iopub.execute_input":"2024-12-30T09:27:35.826929Z","iopub.status.idle":"2024-12-30T09:27:48.919985Z","shell.execute_reply.started":"2024-12-30T09:27:35.826887Z","shell.execute_reply":"2024-12-30T09:27:48.918804Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def cv_test_preds(X, y, X_test, n_folds=5):\n    folds = KFold(n_splits=n_folds, shuffle=True, random_state=42)\n    test_preds = []\n\n    for fold, (train_idx, val_idx) in enumerate(folds.split(X, y)):\n        X_train, y_train = X.iloc[train_idx], y.iloc[train_idx]\n\n        cat_features = X.select_dtypes(exclude=['number']).columns.tolist()\n\n        model = CatBoostRegressor(\n            **catboost_params,\n            random_state=42,\n            task_type='CPU',\n            verbose=0,\n            cat_features=cat_features\n        )\n        model.fit(X_train, y_train, cat_features=cat_features)\n\n        test_preds.append(model.predict(X_test))\n\n    return test_preds","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:28:30.473908Z","iopub.execute_input":"2024-12-30T09:28:30.474306Z","iopub.status.idle":"2024-12-30T09:28:30.480843Z","shell.execute_reply.started":"2024-12-30T09:28:30.474272Z","shell.execute_reply":"2024-12-30T09:28:30.479804Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_final_preds = cv_test_preds(X, y_log1p, X_test, n_folds=5)\n\npreds = sum(np.expm1(X_final_preds))/len(X_final_preds)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-30T09:28:32.886973Z","iopub.execute_input":"2024-12-30T09:28:32.887344Z","execution_failed":"2024-12-30T15:31:44.667Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_submission = pd.read_csv('/kaggle/input/playground-series-s4e12/sample_submission.csv')\n\nsample_submission['Premium Amount'] = preds\nsample_submission.to_csv(\"submission.csv\", index = False)\n\nprint('DONE!')","metadata":{"trusted":true,"execution":{"execution_failed":"2024-12-30T15:31:44.667Z"}},"outputs":[],"execution_count":null}]}