{"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"},{"sourceId":211205059,"sourceType":"kernelVersion"}],"dockerImageVersionId":30787,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# single catboost model get the first place\n\n* if you like my work, please consider upvote","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom catboost import CatBoostRegressor\nfrom sklearn.model_selection import KFold\nfrom sklearn.metrics import mean_squared_log_error\nfrom sklearn.preprocessing import LabelEncoder, OrdinalEncoder\nfrom sklearn.preprocessing import OneHotEncoder\nimport joblib\n\n\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T14:16:00.532412Z","iopub.execute_input":"2024-12-04T14:16:00.532752Z","iopub.status.idle":"2024-12-04T14:16:00.537737Z","shell.execute_reply.started":"2024-12-04T14:16:00.532723Z","shell.execute_reply":"2024-12-04T14:16:00.536806Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/playground-series-s4e12/train.csv\")\ntest = pd.read_csv(\"/kaggle/input/playground-series-s4e12/test.csv\")\n\nsample = pd.read_csv('/kaggle/input/playground-series-s4e12/sample_submission.csv')\n\ntrain.drop('id', axis=1, inplace=True)\ntest.drop('id', axis=1, inplace=True) \n\nnonlog_fe , nonlog = joblib.load(\"/kaggle/input/rid-catboost-nonlog/cat_non_loged.pkl\")\n\ntrain['nonlog'] = nonlog_fe\ntest['nonlog'] = nonlog","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T14:16:00.539045Z","iopub.execute_input":"2024-12-04T14:16:00.539347Z","iopub.status.idle":"2024-12-04T14:16:07.178439Z","shell.execute_reply.started":"2024-12-04T14:16:00.539322Z","shell.execute_reply":"2024-12-04T14:16:07.177636Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def date(Df):\n\n    Df['Policy Start Date'] = pd.to_datetime(Df['Policy Start Date'])\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['Month_name'] = Df['Policy Start Date'].dt.month_name()\n    Df['Day_of_week'] = Df['Policy Start Date'].dt.day_name()\n    Df['Week'] = Df['Policy Start Date'].dt.isocalendar().week\n    Df['Year_sin'] = np.sin(2 * np.pi * Df['Year'])\n    Df['Year_cos'] = np.cos(2 * np.pi * Df['Year'])\n    Df['Month_sin'] = np.sin(2 * np.pi * Df['Month'] / 12) \n    Df['Month_cos'] = np.cos(2 * np.pi * Df['Month'] / 12)\n    Df['Day_sin'] = np.sin(2 * np.pi * Df['Day'] / 31)  \n    Df['Day_cos'] = np.cos(2 * np.pi * Df['Day'] / 31)\n    Df['Group']=(Df['Year']-2020)*48+Df['Month']*4+Df['Day']//7\n    \n    Df.drop('Policy Start Date', axis=1, inplace=True)\n\n    return Df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T14:16:07.179312Z","iopub.execute_input":"2024-12-04T14:16:07.179556Z","iopub.status.idle":"2024-12-04T14:16:07.186475Z","shell.execute_reply.started":"2024-12-04T14:16:07.179533Z","shell.execute_reply":"2024-12-04T14:16:07.185575Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def fe(df):\n    \n    df['contract length'] = pd.cut(\n        df[\"Insurance Duration\"].fillna(99),  \n        bins=[-float('inf'), 1, 3, float('inf')],  \n        labels=[0, 1, 2]  \n    ).astype(int)\n    return df\n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T14:16:07.188044Z","iopub.execute_input":"2024-12-04T14:16:07.188381Z","iopub.status.idle":"2024-12-04T14:16:07.203148Z","shell.execute_reply.started":"2024-12-04T14:16:07.18835Z","shell.execute_reply":"2024-12-04T14:16:07.202325Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = date(train)\ntest = date(test)\n\ntrain = fe(train)\ntest = fe(test)\n\ncat_cols = [col for col in train.columns if train[col].dtype == 'object']\nfeature_cols = list(test.columns)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T14:16:07.204056Z","iopub.execute_input":"2024-12-04T14:16:07.204338Z","iopub.status.idle":"2024-12-04T14:16:09.992857Z","shell.execute_reply.started":"2024-12-04T14:16:07.204313Z","shell.execute_reply":"2024-12-04T14:16:09.992049Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class CategoricalEncoder:\n    def __init__(self, train, test):\n        self.train = train\n        self.test = test\n\n    def frequency_encode(self, cat_cols, feature_cols, drop_org=False):\n        combined = pd.concat([self.train, self.test], axis=0, ignore_index=True)\n\n        new_cat_cols = [] \n        for col in cat_cols:\n            freq_encoding = combined[col].value_counts().to_dict()\n            \n            self.train[f\"{col}_freq\"] = self.train[col].map(freq_encoding).astype('float')\n            self.test[f\"{col}_freq\"] = self.test[col].map(freq_encoding).astype('float')\n\n            new_col_name = f\"{col}_freq\"\n            new_cat_cols.append(new_col_name)\n            feature_cols.append(new_col_name)\n            if drop_org:\n                feature_cols.remove(col)\n\n        return self.train, self.test, new_cat_cols, feature_cols","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T14:16:09.99383Z","iopub.execute_input":"2024-12-04T14:16:09.994066Z","iopub.status.idle":"2024-12-04T14:16:10.001079Z","shell.execute_reply.started":"2024-12-04T14:16:09.994042Z","shell.execute_reply":"2024-12-04T14:16:10.000158Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"encoder = CategoricalEncoder(train, test)\ntrain, test, cat_cols, feature_cols = encoder.frequency_encode(cat_cols, feature_cols, drop_org=True)\n\ntrain = train[feature_cols + ['Premium Amount']]\ntest = test[feature_cols]\n\n# train = train.fillna(-111)\n# test = test.fillna(-111)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T14:16:10.002258Z","iopub.execute_input":"2024-12-04T14:16:10.002527Z","iopub.status.idle":"2024-12-04T14:16:13.702594Z","shell.execute_reply.started":"2024-12-04T14:16:10.002503Z","shell.execute_reply":"2024-12-04T14:16:13.701778Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T14:16:13.703556Z","iopub.execute_input":"2024-12-04T14:16:13.703804Z","iopub.status.idle":"2024-12-04T14:16:13.733235Z","shell.execute_reply.started":"2024-12-04T14:16:13.703781Z","shell.execute_reply":"2024-12-04T14:16:13.732365Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = train.drop('Premium Amount', axis=1)  \ny = train['Premium Amount']\n\ny_log = np.log1p(y)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T14:16:13.736211Z","iopub.execute_input":"2024-12-04T14:16:13.736505Z","iopub.status.idle":"2024-12-04T14:16:13.917795Z","shell.execute_reply.started":"2024-12-04T14:16:13.736478Z","shell.execute_reply":"2024-12-04T14:16:13.916706Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def rmsle(y_true, y_pred):\n    return np.sqrt(mean_squared_log_error(y_true, y_pred))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T14:16:13.918865Z","iopub.execute_input":"2024-12-04T14:16:13.91917Z","iopub.status.idle":"2024-12-04T14:16:13.923483Z","shell.execute_reply.started":"2024-12-04T14:16:13.919127Z","shell.execute_reply":"2024-12-04T14:16:13.922586Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def train_model():\n    kf = KFold(n_splits=5, shuffle=True, random_state=42)\n    oof = np.zeros(len(X))\n    models = []\n\n    for fold, (train_idx, valid_idx) in enumerate(kf.split(X)):\n        print(f\"Fold {fold + 1}\")\n        X_train, X_valid = X.iloc[train_idx], X.iloc[valid_idx]\n        y_train, y_valid = y_log.iloc[train_idx], y_log.iloc[valid_idx]\n\n        model = CatBoostRegressor(\n            iterations=3000,\n            learning_rate=0.05,\n            depth=6,\n            eval_metric=\"RMSE\",\n            random_seed=42,\n            verbose=200,\n            task_type='GPU',\n            l2_leaf_reg =  0.7,\n        )\n        \n        model.fit(X_train,\n                  y_train,\n                  eval_set=(X_valid, y_valid), \n                  early_stopping_rounds=300,\n                  # cat_features=cat_cols,\n                 )\n        models.append(model)\n        oof[valid_idx] = np.maximum(0, model.predict(X_valid))\n        fold_rmsle = rmsle(np.expm1(y_valid), np.expm1(oof[valid_idx]))\n        print(f\"Fold {fold + 1} RMSLE: {fold_rmsle}\")\n        \n    return models, oof","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T14:16:13.924461Z","iopub.execute_input":"2024-12-04T14:16:13.9247Z","iopub.status.idle":"2024-12-04T14:16:13.936586Z","shell.execute_reply.started":"2024-12-04T14:16:13.924662Z","shell.execute_reply":"2024-12-04T14:16:13.935821Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"models,oof = train_model()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T14:16:13.937536Z","iopub.execute_input":"2024-12-04T14:16:13.937809Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(rmsle(y, np.expm1(oof)))","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_predictions = np.zeros(len(test))\n\nfor model in models:\n    test_predictions += np.maximum(0, np.expm1(model.predict(test))) / len(models)\n\n\nsample['Premium Amount'] = test_predictions\nsample.to_csv('submission.csv', index = False)\nsample.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}