{"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"},{"sourceId":10087945,"sourceType":"datasetVersion","datasetId":6220067},{"sourceId":10103971,"sourceType":"datasetVersion","datasetId":6228803}],"dockerImageVersionId":30787,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import 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 sklearn.linear_model import Lasso, Ridge\nimport lightgbm as lgb\n\nimport joblib\n\ntrain_ag = False\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T00:31:17.656265Z","iopub.execute_input":"2024-12-05T00:31:17.656651Z","iopub.status.idle":"2024-12-05T00:31:21.516058Z","shell.execute_reply.started":"2024-12-05T00:31:17.656614Z","shell.execute_reply":"2024-12-05T00:31:21.515041Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import h2o\nfrom h2o.automl import H2OAutoML\n\nh2o.init()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T00:31:21.517761Z","iopub.execute_input":"2024-12-05T00:31:21.518287Z","iopub.status.idle":"2024-12-05T00:31:30.953699Z","shell.execute_reply.started":"2024-12-05T00:31:21.518252Z","shell.execute_reply":"2024-12-05T00:31:30.952414Z"}},"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-05T00:31:30.955701Z","iopub.execute_input":"2024-12-05T00:31:30.95621Z","iopub.status.idle":"2024-12-05T00:31:42.70472Z","shell.execute_reply.started":"2024-12-05T00:31:30.956159Z","shell.execute_reply":"2024-12-05T00:31:42.703566Z"}},"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-05T00:31:42.707506Z","iopub.execute_input":"2024-12-05T00:31:42.707982Z","iopub.status.idle":"2024-12-05T00:31:42.717304Z","shell.execute_reply.started":"2024-12-05T00:31:42.707934Z","shell.execute_reply":"2024-12-05T00:31:42.716307Z"}},"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-05T00:31:42.71861Z","iopub.execute_input":"2024-12-05T00:31:42.718972Z","iopub.status.idle":"2024-12-05T00:31:45.865252Z","shell.execute_reply.started":"2024-12-05T00:31:42.71894Z","shell.execute_reply":"2024-12-05T00:31:45.864221Z"}},"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-05T00:31:45.866631Z","iopub.execute_input":"2024-12-05T00:31:45.866985Z","iopub.status.idle":"2024-12-05T00:31:45.874321Z","shell.execute_reply.started":"2024-12-05T00:31:45.866953Z","shell.execute_reply":"2024-12-05T00:31:45.87327Z"}},"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-05T00:31:45.875556Z","iopub.execute_input":"2024-12-05T00:31:45.875902Z","iopub.status.idle":"2024-12-05T00:31:49.301157Z","shell.execute_reply.started":"2024-12-05T00:31:45.875869Z","shell.execute_reply":"2024-12-05T00:31:49.300137Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T00:31:49.302463Z","iopub.execute_input":"2024-12-05T00:31:49.30283Z","iopub.status.idle":"2024-12-05T00:31:49.336114Z","shell.execute_reply.started":"2024-12-05T00:31:49.302774Z","shell.execute_reply":"2024-12-05T00:31:49.335005Z"}},"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-05T00:31:49.337378Z","iopub.execute_input":"2024-12-05T00:31:49.337707Z","iopub.status.idle":"2024-12-05T00:31:49.342551Z","shell.execute_reply.started":"2024-12-05T00:31:49.337675Z","shell.execute_reply":"2024-12-05T00:31:49.341406Z"}},"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\n\nh_train = h2o.H2OFrame(train)\nh_test = h2o.H2OFrame(test)\n\nx = [col for col in h_train.columns if col not in ['Premium Amount', 'fold']]\ny = 'Premium Amount'\nfold_column = 'fold'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T00:31:49.345522Z","iopub.execute_input":"2024-12-05T00:31:49.345922Z","iopub.status.idle":"2024-12-05T00:32:55.531313Z","shell.execute_reply.started":"2024-12-05T00:31:49.345874Z","shell.execute_reply":"2024-12-05T00:32:55.530182Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if train_ag:\n    aml = H2OAutoML(\n            max_runtime_secs=3600* 5,\n            include_algos=[\"GBM\", \"DRF\", \"XGBoost\", \"DeepLearning\"],\n            keep_cross_validation_predictions=True,\n            seed=42,\n            verbosity=\"info\"\n        )\n    aml.train(x=x, y=y, training_frame=h_train,fold_column=fold_column)\n    \n    leaderboard = aml.leaderboard.as_data_frame()\n    print(leaderboard)\n\n    model_ids = leaderboard['model_id'].tolist()\n    \n    oofs = pd.DataFrame()\n    for model_id in model_ids:\n        model = h2o.get_model(model_id)\n        oof_predictions = model.cross_validation_holdout_predictions().as_data_frame()\n        oofs[model_id] = oof_predictions['predict']\n\n    preds = pd.DataFrame()\n    for model_id in model_ids:\n        model = h2o.get_model(model_id)\n        test_predictions = model.predict(h_test).as_data_frame()\n        preds[model_id] = test_predictions['predict']\n    \n    joblib.dump([oofs, preds], \"h2o_automl.pkl\")\n\nelse:\n    oofs, preds = joblib.load(\"/kaggle/input/h2o-automl/h2o_automl_2.pkl\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T00:32:55.532702Z","iopub.execute_input":"2024-12-05T00:32:55.533167Z","iopub.status.idle":"2024-12-05T00:33:05.987145Z","shell.execute_reply.started":"2024-12-05T00:32:55.533121Z","shell.execute_reply":"2024-12-05T00:33:05.986108Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"models = list(oofs.columns)\nfor model in models:\n    print(f\"{model}: {rmsle(np.expm1(oofs[model]), np.expm1(train['Premium Amount']))}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T00:33:05.988977Z","iopub.execute_input":"2024-12-05T00:33:05.989406Z","iopub.status.idle":"2024-12-05T00:33:16.479646Z","shell.execute_reply.started":"2024-12-05T00:33:05.989362Z","shell.execute_reply":"2024-12-05T00:33:16.478525Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ridge = Ridge(alpha=0.1)  \n\nridge.fit(oofs, train['Premium Amount'])\noof_preds = ridge.predict(oofs)\nprint(rmsle(np.expm1(oof_preds), np.expm1(train['Premium Amount'])))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T00:35:47.432746Z","iopub.execute_input":"2024-12-05T00:35:47.433176Z","iopub.status.idle":"2024-12-05T00:35:49.503882Z","shell.execute_reply.started":"2024-12-05T00:35:47.433141Z","shell.execute_reply":"2024-12-05T00:35:49.502788Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_predictions = ridge.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-05T00:33:18.728918Z","iopub.execute_input":"2024-12-05T00:33:18.729236Z","iopub.status.idle":"2024-12-05T00:33:20.742285Z","shell.execute_reply.started":"2024-12-05T00:33:18.729205Z","shell.execute_reply":"2024-12-05T00:33:20.741109Z"}},"outputs":[],"execution_count":null}]}