{"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":10087945,"sourceType":"datasetVersion","datasetId":6220067}],"dockerImageVersionId":30787,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install -q autogluon.tabular\n\nimport pandas as pd\nimport numpy as np\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\nfrom autogluon.tabular import TabularPredictor\nfrom sklearn.linear_model import Lasso, Ridge\n\nimport joblib\n\ntrain_ag = False\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T12:05:07.103338Z","iopub.execute_input":"2024-12-03T12:05:07.1037Z","iopub.status.idle":"2024-12-03T12:05:15.594004Z","shell.execute_reply.started":"2024-12-03T12:05:07.103669Z","shell.execute_reply":"2024-12-03T12:05:15.592813Z"}},"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) ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T12:05:15.5964Z","iopub.execute_input":"2024-12-03T12:05:15.597181Z","iopub.status.idle":"2024-12-03T12:05:21.649815Z","shell.execute_reply.started":"2024-12-03T12:05:15.597134Z","shell.execute_reply":"2024-12-03T12:05:21.648859Z"}},"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-03T12:05:21.65129Z","iopub.execute_input":"2024-12-03T12:05:21.651549Z","iopub.status.idle":"2024-12-03T12:05:21.657908Z","shell.execute_reply.started":"2024-12-03T12:05:21.651523Z","shell.execute_reply":"2024-12-03T12:05:21.65709Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = date(train)\ntest = date(test)\n\ncat_cols = [col for col in train.columns if train[col].dtype == 'object']\nfeature_cols = list(test.columns)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T12:05:21.660159Z","iopub.execute_input":"2024-12-03T12:05:21.660504Z","iopub.status.idle":"2024-12-03T12:05:24.319537Z","shell.execute_reply.started":"2024-12-03T12:05:21.660466Z","shell.execute_reply":"2024-12-03T12:05:24.318822Z"}},"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\n        new_cat_cols = []\n        for col in cat_cols:\n            freq_encoding = self.train[col].value_counts().to_dict()\n\n            self.train[f\"{col}_freq\"] = self.train[col].map(freq_encoding).astype('category')\n            self.test[f\"{col}_freq\"] = self.test[col].map(freq_encoding).astype('category')\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-03T12:05:24.320596Z","iopub.execute_input":"2024-12-03T12:05:24.320949Z","iopub.status.idle":"2024-12-03T12:05:24.327448Z","shell.execute_reply.started":"2024-12-03T12:05:24.320894Z","shell.execute_reply":"2024-12-03T12:05:24.32658Z"}},"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\ntrain['Premium Amount'] = np.log1p(train['Premium Amount'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T12:05:24.328572Z","iopub.execute_input":"2024-12-03T12:05:24.328833Z","iopub.status.idle":"2024-12-03T12:05:27.249323Z","shell.execute_reply.started":"2024-12-03T12:05:24.328808Z","shell.execute_reply":"2024-12-03T12:05:27.248658Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T12:05:27.250291Z","iopub.execute_input":"2024-12-03T12:05:27.250564Z","iopub.status.idle":"2024-12-03T12:05:27.276194Z","shell.execute_reply.started":"2024-12-03T12:05:27.250536Z","shell.execute_reply":"2024-12-03T12:05:27.275257Z"}},"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-03T12:05:27.277441Z","iopub.execute_input":"2024-12-03T12:05:27.277733Z","iopub.status.idle":"2024-12-03T12:05:27.298399Z","shell.execute_reply.started":"2024-12-03T12:05:27.277706Z","shell.execute_reply":"2024-12-03T12:05:27.297753Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"kf = KFold(n_splits=5, shuffle=True, random_state=42)\n\nfor i, (_, val_index) in enumerate(kf.split(train)):\n    train.loc[val_index, 'fold'] = i","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T12:05:27.299395Z","iopub.execute_input":"2024-12-03T12:05:27.299651Z","iopub.status.idle":"2024-12-03T12:05:27.464843Z","shell.execute_reply.started":"2024-12-03T12:05:27.299625Z","shell.execute_reply":"2024-12-03T12:05:27.464163Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if train_ag:\n    predictor = TabularPredictor(\n            label='Premium Amount',\n            groups='fold'\n        ).fit(\n            train,\n            presets='best_quality',\n            time_limit=1800,\n            verbosity=2,\n            num_cpus=4,\n            num_gpus=2,\n            included_model_types=['GBM', 'CAT', 'NN_TORCH'],\n        )\n    \n    leaderboard = predictor.leaderboard()\n    print(leaderboard)\n\n    model_names = predictor.leaderboard()['model'].tolist()\n    \n    oofs = pd.DataFrame()\n    for model in model_names:\n        oof = predictor.predict_proba_oof(model)\n        oofs[model] = oof\n    \n    preds = pd.DataFrame()\n    for model in model_names:\n        pred = predictor.predict(test, model)\n        preds[model] = pred\n    \n    joblib.dump([oofs, preds], \"autogloun.pkl\")\n\nelse:\n    oofs, preds = joblib.load(\"/kaggle/input/autogo/autogloun.pkl\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T12:05:27.467627Z","iopub.execute_input":"2024-12-03T12:05:27.468219Z","iopub.status.idle":"2024-12-03T12:05:27.536893Z","shell.execute_reply.started":"2024-12-03T12:05:27.468178Z","shell.execute_reply":"2024-12-03T12:05:27.53598Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"models = list(oofs.columns)\nfor model in models:\n    print(rmsle(np.expm1(oofs[model]), np.expm1(train['Premium Amount'])))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T12:08:03.909528Z","iopub.execute_input":"2024-12-03T12:08:03.909867Z","iopub.status.idle":"2024-12-03T12:08:04.079519Z","shell.execute_reply.started":"2024-12-03T12:08:03.909838Z","shell.execute_reply":"2024-12-03T12:08:04.078443Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"lasso = Lasso(alpha=0.001)  \n\nlasso.fit(oofs, train['Premium Amount'])\noof_preds = lasso.predict(oofs)\nprint(rmsle(np.expm1(oof_preds), np.expm1(train['Premium Amount'])))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T12:06:16.886243Z","iopub.execute_input":"2024-12-03T12:06:16.886882Z","iopub.status.idle":"2024-12-03T12:06:18.775038Z","shell.execute_reply.started":"2024-12-03T12:06:16.886847Z","shell.execute_reply":"2024-12-03T12:06:18.773976Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_predictions = lasso.predict(preds)\n\nsample['Premium Amount'] = np.expm1(test_predictions)\nsample.to_csv('submission.csv', index = False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-03T12:05:28.358544Z","iopub.execute_input":"2024-12-03T12:05:28.359013Z","iopub.status.idle":"2024-12-03T12:05:29.448142Z","shell.execute_reply.started":"2024-12-03T12:05:28.358959Z","shell.execute_reply":"2024-12-03T12:05:29.447086Z"}},"outputs":[],"execution_count":null}]}