{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":82611,"databundleVersionId":9553358,"sourceType":"competition"}],"dockerImageVersionId":30787,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"#My Version","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-28T20:23:02.646393Z","iopub.execute_input":"2024-11-28T20:23:02.647283Z","iopub.status.idle":"2024-11-28T20:23:02.653477Z","shell.execute_reply.started":"2024-11-28T20:23:02.647229Z","shell.execute_reply":"2024-11-28T20:23:02.652665Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport random\nimport numpy as np\nimport pandas as pd\nimport torch\nimport warnings\nfrom tqdm import tqdm\nfrom itertools import product\nfrom sklearn.model_selection import GroupKFold\nfrom sklearn.impute import SimpleImputer, KNNImputer\nfrom sklearn.linear_model import Ridge\nfrom sklearn.ensemble import StackingRegressor\nfrom sklearn.metrics import mean_squared_error\nfrom sklearn.base import BaseEstimator\nfrom lightgbm import LGBMRegressor\nfrom xgboost import XGBRegressor\nfrom catboost import CatBoostRegressor\nfrom pytorch_tabnet.tab_model import TabNetRegressor\nfrom sklearn.model_selection import StratifiedGroupKFold\n\nwarnings.filterwarnings(\"ignore\")\n\n# Fix random seed for reproducibility\ndef seed_everything(seed: int):\n    random.seed(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    os.environ[\"PYTHONHASHSEED\"] = str(seed)\n    torch.backends.cudnn.deterministic = True\n    torch.backends.cudnn.benchmark = False  # To prevent non-deterministic results when benchmark is True\n\n# Constants and file paths\nseed = 43\nThr_NAN = 49\ndata_path = \"/kaggle/input/brist1d/\"\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-28T20:23:02.655341Z","iopub.execute_input":"2024-11-28T20:23:02.656186Z","iopub.status.idle":"2024-11-28T20:23:11.33089Z","shell.execute_reply.started":"2024-11-28T20:23:02.656137Z","shell.execute_reply":"2024-11-28T20:23:11.32952Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pip install pytorch_tabnet","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-28T20:23:41.043212Z","iopub.execute_input":"2024-11-28T20:23:41.043563Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Read train and test data\ndf_train = pd.read_csv(os.path.join(data_path, 'train.csv'), index_col='id', parse_dates=['time'])\ndf_test = pd.read_csv(os.path.join(data_path, 'test.csv'), index_col='id', parse_dates=['time'])\ndf_subm = pd.read_csv(os.path.join(data_path, 'sample_submission.csv'), index_col='id')\n\n# Preprocess column names to replace problematic characters\ndf_train.columns = df_train.columns.str.replace(\":\", \"-\")\ndf_test.columns = df_test.columns.str.replace(\":\", \"-\")\n\n# Define feature column names\nhours = range(0, 6)\nminutes = range(0, 60, 5)\n\ntarget_col = \"bg+1-00\"\ngroup_col = \"p_num\"\ndate_col = \"time\"\n\n# Construct feature columns\nbg_cols = [f\"bg-{i}-{j:02d}\" for i, j in product(hours, minutes)][:12]\ninsu_cols = [f\"insulin-{i}-{j:02d}\" for i, j in product(hours, minutes)][:12]\ncarb_cols = [f\"carbs-{i}-{j:02d}\" for i, j in product(hours, minutes)][:12]\nhr_cols = [f\"hr-{i}-{j:02d}\" for i, j in product(hours, minutes)][:12]\nstep_cols = [f\"steps-{i}-{j:02d}\" for i, j in product(hours, minutes)][:12]\ncals_cols = [f\"cals-{i}-{j:02d}\" for i, j in product(hours, minutes)][:12]\n\nfeature_cols = bg_cols + insu_cols + carb_cols + hr_cols + step_cols + cals_cols\n\n# Impute missing values\nimputer = KNNImputer(n_neighbors=5)  # Using KNN imputation\ndf_train[feature_cols] = imputer.fit_transform(df_train[feature_cols])\ndf_test[feature_cols] = imputer.transform(df_test[feature_cols])\n\n# Time-based features (sin/cos hour)\ndf_train[\"sin_hour\"] = np.sin(np.pi * df_train[date_col].dt.hour / 12)\ndf_train[\"cos_hour\"] = np.cos(np.pi * df_train[date_col].dt.hour / 12)\n\ndf_test[\"sin_hour\"] = np.sin(np.pi * df_test[date_col].dt.hour / 12)\ndf_test[\"cos_hour\"] = np.cos(np.pi * df_test[date_col].dt.hour / 12)\n\nfeature_cols.extend([\"sin_hour\", \"cos_hour\"])\n\n# Handle missing rows based on threshold\nmask = df_train[feature_cols].isna().sum(axis=1) <= Thr_NAN\ndf_train = df_train[mask]\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-28T20:23:11.331921Z","iopub.status.idle":"2024-11-28T20:23:11.332395Z","shell.execute_reply.started":"2024-11-28T20:23:11.332154Z","shell.execute_reply":"2024-11-28T20:23:11.332179Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Grouped feature extraction\ngrouped_features = []\nfor colset in [bg_cols, insu_cols, carb_cols, hr_cols, step_cols, cals_cols]:\n    group_idxs = [idx for idx, col in enumerate(feature_cols) if col in colset]\n    grouped_features.append(group_idxs)\n\ndf_train_final = df_train[feature_cols]\ndf_test_final = df_test[feature_cols]\ny_target = df_train[[target_col]]\ngroups = df_train[group_col]\n\n# Define base models for stacking\nestimators = [\n    ('lgbm', LGBMRegressor(random_state=seed, n_estimators=1000)),\n    ('xgb', XGBRegressor(random_state=seed, n_estimators=1000)),\n    ('catboost', CatBoostRegressor(random_seed=seed, iterations=1000, learning_rate=0.05, depth=6))\n]\n\n# Meta model for stacking\nmeta_model = Ridge(alpha=0.1)\n\n# StackingRegressor\nstacking_model = StackingRegressor(estimators=estimators, final_estimator=meta_model)\nstacking_model.fit(df_train_final, y_target)\nfinal_res_0 = stacking_model.predict(df_test_final)\n\n# Cross-validation with TabNet\nX = df_train_final\ny = y_target\ncv = GroupKFold(5)\nfinal_res_1 = 0.0\n\nfor idx_train, idx_valid in cv.split(X, y, groups=groups):\n    X_train, y_train = X.iloc[idx_train], y.iloc[idx_train]\n    X_valid, y_valid = X.iloc[idx_valid], y.iloc[idx_valid]\n    \n    # Initialize and train TabNet\n    reg = TabNetRegressor(grouped_features=grouped_features)\n    reg.fit(X_train.to_numpy(), y_train.to_numpy(), eval_set=[(X_valid.to_numpy(), y_valid.to_numpy())], eval_metric=['rmse'], batch_size=10000, patience=40, max_epochs=200, num_workers=4)\n    \n    # Make predictions\n    X_test = df_test[feature_cols].to_numpy()\n    final_res_1 += reg.predict(X_test)[:, 0] / 5\n\n# Combine results from models\ndf_subm[\"bg+1:00\"] = (final_res_0 + final_res_1) / 2\ndf_subm.to_csv(\"submission.csv\")\ndf_subm.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-28T20:23:11.333982Z","iopub.status.idle":"2024-11-28T20:23:11.334295Z","shell.execute_reply.started":"2024-11-28T20:23:11.334145Z","shell.execute_reply":"2024-11-28T20:23:11.334161Z"}},"outputs":[],"execution_count":null}]}