{"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":82611,"databundleVersionId":9553358,"sourceType":"competition"}],"dockerImageVersionId":30787,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from tqdm import tqdm\nfrom itertools import product\n\nimport numpy as np\nimport pandas as pd\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.model_selection import GroupKFold\nfrom sklearn.impute import SimpleImputer, KNNImputer\nimport warnings\n\n# Import necessary libraries\nfrom sklearn.linear_model import Ridge  # Meta-learner\nfrom sklearn.ensemble import StackingRegressor\nwarnings.filterwarnings(\"ignore\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:29:43.843985Z","iopub.execute_input":"2024-12-09T01:29:43.844431Z","iopub.status.idle":"2024-12-09T01:29:45.815536Z","shell.execute_reply.started":"2024-12-09T01:29:43.844399Z","shell.execute_reply":"2024-12-09T01:29:45.814631Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -qq pytorch_tabnet\n\nfrom pytorch_tabnet.tab_model import TabNetRegressor","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:29:45.817237Z","iopub.execute_input":"2024-12-09T01:29:45.817677Z","iopub.status.idle":"2024-12-09T01:29:58.220257Z","shell.execute_reply.started":"2024-12-09T01:29:45.817645Z","shell.execute_reply":"2024-12-09T01:29:58.219526Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define the hour and minute ranges for constructing feature column names\nhours = range(0, 6, 1)\nminutes = range(0, 60, 5)\n\ntarget_col = \"bg+1-00\"  # Target column name for prediction\ngroup_col = \"p_num\"  # Column name for grouping (e.g., participant number)\ndate_col = \"time\"  # Column name for time data\n\n# We only need the last 12 time intervals (1 hour)\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","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:29:58.221299Z","iopub.execute_input":"2024-12-09T01:29:58.221674Z","iopub.status.idle":"2024-12-09T01:29:58.228440Z","shell.execute_reply.started":"2024-12-09T01:29:58.221648Z","shell.execute_reply":"2024-12-09T01:29:58.227628Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train = pd.read_csv(\n    '/kaggle/input/brist1d/train.csv', \n    index_col='id', \n    parse_dates=['time'],\n)\n\ndf_test = pd.read_csv(\n    '/kaggle/input/brist1d/test.csv', \n    index_col='id', \n    parse_dates=['time'],\n)\n\ndf_subm = pd.read_csv(\n    \"/kaggle/input/brist1d/sample_submission.csv\",\n    index_col='id',\n)\n\n# Some frameworks may not handle column names with special characters like colons properly\ndf_train.columns = df_train.columns.str.replace(':', '-')\ndf_test.columns = df_test.columns.str.replace(':', '-')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:29:58.229439Z","iopub.execute_input":"2024-12-09T01:29:58.229716Z","iopub.status.idle":"2024-12-09T01:30:09.623033Z","shell.execute_reply.started":"2024-12-09T01:29:58.229692Z","shell.execute_reply":"2024-12-09T01:30:09.622252Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import random\nimport os\nimport numpy as np\nimport torch\n\n\ndef seed_everything(seed):\n    random.seed(seed)\n    os.environ[\"PYTHONHASHSEED\"] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.deterministic = True\n    torch.backends.cudnn.benchmark = True","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:30:09.625194Z","iopub.execute_input":"2024-12-09T01:30:09.625590Z","iopub.status.idle":"2024-12-09T01:30:09.630688Z","shell.execute_reply.started":"2024-12-09T01:30:09.625555Z","shell.execute_reply":"2024-12-09T01:30:09.629764Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"seed = 43  #\nThr_NAN = 49\nseed_everything(seed)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:30:09.631745Z","iopub.execute_input":"2024-12-09T01:30:09.632006Z","iopub.status.idle":"2024-12-09T01:30:09.648000Z","shell.execute_reply.started":"2024-12-09T01:30:09.631981Z","shell.execute_reply":"2024-12-09T01:30:09.647140Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Some frameworks may not handle column names with special characters like colons properly\ndf_train.columns = df_train.columns.str.replace(\":\", \"-\")\ndf_test.columns = df_test.columns.str.replace(\":\", \"-\")\n\n\nfor colset in [bg_cols, insu_cols, carb_cols, hr_cols, step_cols, cals_cols]:\n    df_train[colset] = (\n        df_train[colset]\n        .interpolate(axis=1)\n        .fillna(method=\"bfill\", axis=1)\n        .fillna(method=\"ffill\", axis=1)\n    )\n    df_test[colset] = (\n        df_test[colset]\n        .interpolate(axis=1)\n        .fillna(method=\"bfill\", axis=1)\n        .fillna(method=\"ffill\", axis=1)\n    )\n\n# #시계열적 분석\n# feature_columns = {\n#     'bg': bg_cols,\n#     'hr': hr_cols,\n#     'steps': step_cols\n# }\n\n# def impute_time_series_features(df, columns, method='median', window=5):\n#     for col in columns:\n#         df[col] = df[col].fillna(df[col].rolling(window=window, min_periods=1).median())\n        \n#         df[col] = df[col].fillna(method='ffill')   \n#         df[col] = df[col].fillna(method='bfill')\n        \n#         df[col] = df.groupby('p_num')[col].transform(lambda x: x.fillna(x.median()))\n#     return df\n\n# for feature, columns in feature_columns.items():\n#     df_train = impute_time_series_features(df_train, columns, method='median')\n#     df_test = impute_time_series_features(df_test, columns, method='median')\n\n# all_imputed_columns = bg_cols + hr_cols + step_cols\n# print(\"Remaining null values in training set:\", df_train[all_imputed_columns].isnull().sum().sum())\n# print(\"Remaining null values in testing set:\", df_test[all_imputed_columns].isnull().sum().sum())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:30:09.649102Z","iopub.execute_input":"2024-12-09T01:30:09.649437Z","iopub.status.idle":"2024-12-09T01:30:22.713043Z","shell.execute_reply.started":"2024-12-09T01:30:09.649399Z","shell.execute_reply":"2024-12-09T01:30:22.712136Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# #적 분석\n\n# feature_columns_insulin_cals = {\n#     'insulin': insu_cols,\n#     'cals': cals_cols\n# }\n\n# def impute_non_temporal_features(df, columns, method='median', window=5):\n#     for col in columns:\n#         df[col] = df.groupby('p_num')[col].transform(lambda x: x.fillna(x.median()))\n        \n#         df[col] = df[col].fillna(df[col].rolling(window=window, min_periods=1).median())\n#     return df\n\n# # Apply imputation to insulin and cals columns in both datasets\n# for feature, columns in feature_columns_insulin_cals.items():\n#     df_train = impute_non_temporal_features(df_train, columns, method='median')\n#     df_test = impute_non_temporal_features(df_test, columns, method='median')\n\n# # Verify if all nulls are handled in insulin and cals columns\n# all_imputed_columns_insulin_cals = insu_cols + cals_cols\n# print(\"Remaining null values in training set:\", df_train[all_imputed_columns_insulin_cals].isnull().sum().sum())\n# print(\"Remaining null values in testing set:\", df_test[all_imputed_columns_insulin_cals].isnull().sum().sum())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:30:22.714140Z","iopub.execute_input":"2024-12-09T01:30:22.714433Z","iopub.status.idle":"2024-12-09T01:30:22.720545Z","shell.execute_reply.started":"2024-12-09T01:30:22.714406Z","shell.execute_reply":"2024-12-09T01:30:22.719435Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 1. 최빈값(mode) 계산\nactivity_cols = [col for col in df_train.columns if col.startswith('activity')]\ndominant_activity_train = df_train[activity_cols].mode(axis=1)[0]\ndominant_activity_test = df_test[activity_cols].mode(axis=1)[0]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:30:22.722034Z","iopub.execute_input":"2024-12-09T01:30:22.722346Z","iopub.status.idle":"2024-12-09T01:31:00.654411Z","shell.execute_reply.started":"2024-12-09T01:30:22.722305Z","shell.execute_reply":"2024-12-09T01:31:00.653723Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 2. 결과를 데이터프레임에 추가\ndf_train['dominant_activity'] = dominant_activity_train\ndf_test['dominant_activity'] = dominant_activity_test\n\n# 3. 결과 확인\nprint(df_train['dominant_activity'].value_counts())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:31:00.655333Z","iopub.execute_input":"2024-12-09T01:31:00.655599Z","iopub.status.idle":"2024-12-09T01:31:00.671362Z","shell.execute_reply.started":"2024-12-09T01:31:00.655573Z","shell.execute_reply":"2024-12-09T01:31:00.670501Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Replace로 활동명 변경\nactivity_replace = {\n    'Walk': 'Walking',\n    'Run': 'Running',\n    'Swim': 'Swimming',\n}\ndf_train['dominant_activity'] = df_train['dominant_activity'].replace(activity_replace)\ndf_test['dominant_activity'] = df_test['dominant_activity'].replace(activity_replace)\nprint(df_train['dominant_activity'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:31:00.672355Z","iopub.execute_input":"2024-12-09T01:31:00.672627Z","iopub.status.idle":"2024-12-09T01:31:00.697185Z","shell.execute_reply.started":"2024-12-09T01:31:00.672597Z","shell.execute_reply":"2024-12-09T01:31:00.696329Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# NaN 값을 먼저 처리\ndf_train['dominant_activity'].fillna('No Activity', inplace=True)\ndf_test['dominant_activity'].fillna('No Activity', inplace=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:31:00.698333Z","iopub.execute_input":"2024-12-09T01:31:00.699007Z","iopub.status.idle":"2024-12-09T01:31:00.710316Z","shell.execute_reply.started":"2024-12-09T01:31:00.698967Z","shell.execute_reply":"2024-12-09T01:31:00.709363Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\n\n# LabelEncoder 초기화\nlabel_encoder = LabelEncoder()\n\n# train, test 모두 합쳐서 학습\ncombined_activities = pd.concat([\n    df_train['dominant_activity'],\n    df_test['dominant_activity']\n])\n\n# LabelEncoder로 인코딩 학습\nlabel_encoder.fit(combined_activities)\n\n# train과 test에 적용\ndf_train['dominant_activity_encoded'] = label_encoder.transform(df_train['dominant_activity'])\ndf_test['dominant_activity_encoded'] = label_encoder.transform(df_test['dominant_activity'])\n\n# 결과 확인\n# print(train_df[['dominant_activity', 'dominant_activity_encoded']].head())\n# print(test_df[['dominant_activity', 'dominant_activity_encoded']].head())\ndf_train = df_train.drop(['dominant_activity'], axis = 1)\ndf_test = df_test.drop(['dominant_activity'], axis = 1)\nactivity_counts = df_test['dominant_activity_encoded'].value_counts()\nactivity_counts\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:31:00.711540Z","iopub.execute_input":"2024-12-09T01:31:00.711920Z","iopub.status.idle":"2024-12-09T01:31:01.167838Z","shell.execute_reply.started":"2024-12-09T01:31:00.711882Z","shell.execute_reply":"2024-12-09T01:31:01.166358Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"feature_cols = feature_cols + ['dominant_activity_encoded']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:31:01.171130Z","iopub.execute_input":"2024-12-09T01:31:01.171412Z","iopub.status.idle":"2024-12-09T01:31:01.175719Z","shell.execute_reply.started":"2024-12-09T01:31:01.171386Z","shell.execute_reply":"2024-12-09T01:31:01.174736Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"feature_cols","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:31:01.176901Z","iopub.execute_input":"2024-12-09T01:31:01.177881Z","iopub.status.idle":"2024-12-09T01:31:01.189957Z","shell.execute_reply.started":"2024-12-09T01:31:01.177833Z","shell.execute_reply":"2024-12-09T01:31:01.188959Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:31:01.191157Z","iopub.execute_input":"2024-12-09T01:31:01.191573Z","iopub.status.idle":"2024-12-09T01:31:01.308770Z","shell.execute_reply.started":"2024-12-09T01:31:01.191534Z","shell.execute_reply":"2024-12-09T01:31:01.307983Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"mask = df_train[feature_cols].isna().sum(axis=1) <= Thr_NAN\n# Apply the mask to filter the rows\ndf_train = df_train[mask]\n\n\nimputer = SimpleImputer()  \n\ndf_train[feature_cols] = imputer.fit_transform(df_train[feature_cols])\ndf_test[feature_cols] = imputer.transform(df_test[feature_cols])\n\ndf_train['time_hour'] = pd.to_datetime(df_train['time']).dt.hour\ndf_test['time_hour'] = pd.to_datetime(df_test['time']).dt.hour\n\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\", \"time_hour\"])\n\ntime_cols = ['sin_hour', 'cos_hour', 'time_hour']\n\ngrouped_features = []\n\n# Iterate through each set of related columns (e.g., blood glucose, insulin, etc.)\nfor colset in [bg_cols, insu_cols, carb_cols, hr_cols, step_cols, cals_cols, time_cols]:\n    group_idxs = [idx for idx, col in enumerate(feature_cols) if col in colset]\n    grouped_features.append(group_idxs)\n\n\ndf_train_final = df_train[feature_cols]\ngroups = df_train[group_col]\n\ny_target = df_train[[target_col]]\n\ndf_test_final = df_test[feature_cols]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:31:01.309888Z","iopub.execute_input":"2024-12-09T01:31:01.310242Z","iopub.status.idle":"2024-12-09T01:31:02.274016Z","shell.execute_reply.started":"2024-12-09T01:31:01.310185Z","shell.execute_reply":"2024-12-09T01:31:02.273338Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"feature_cols","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:31:02.275449Z","iopub.execute_input":"2024-12-09T01:31:02.275829Z","iopub.status.idle":"2024-12-09T01:31:02.282377Z","shell.execute_reply.started":"2024-12-09T01:31:02.275788Z","shell.execute_reply":"2024-12-09T01:31:02.281497Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Meta-learner\n\nfrom lightgbm import LGBMRegressor\nfrom xgboost import XGBRegressor\nfrom catboost import CatBoostRegressor\nfrom sklearn.ensemble import HistGradientBoostingRegressor\n\n\n# Define a common random seed for reproducibility\nRANDOM_SEED = 42\nN_ESTIMATORS = 3500  # Number of estimators for the ensemble models\n\n# Define base estimators with random seed and number of estimators\nestimators = [\n    # ('lgbm', LGBMRegressor(random_state=RANDOM_SEED, n_estimators=N_ESTIMATORS)),\n    ('xgb', XGBRegressor(random_state=RANDOM_SEED, n_estimators=N_ESTIMATORS)),\n    ('catboost', CatBoostRegressor(random_seed=RANDOM_SEED, iterations=N_ESTIMATORS)),\n    ('hist', HistGradientBoostingRegressor(random_state=RANDOM_SEED, max_iter=N_ESTIMATORS))\n\n]\n\n\nmeta_model = Ridge(alpha=0.1)\n\n# Create StackingRegressor\nstacking_model = StackingRegressor(estimators=estimators, final_estimator=meta_model)\n\n# Fit the StackingRegressor\nstacking_model.fit(df_train_final, y_target)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-09T01:31:02.283493Z","iopub.execute_input":"2024-12-09T01:31:02.283822Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"final_res_0 = stacking_model.predict(df_test_final)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = 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    \n    # Split the data into training and validation sets for the current fold\n    X_train, y_train = X.iloc[idx_train].to_numpy(), y.iloc[idx_train].to_numpy()\n    X_valid, y_valid = X.iloc[idx_valid].to_numpy(), y.iloc[idx_valid].to_numpy()\n    \n    # Initialize the TabNet Regressor model\n    reg = TabNetRegressor(\n        grouped_features=grouped_features, \n    )\n    \n    # Train the model using the training set and validate using the validation set\n    reg.fit(\n        X_train, y_train,\n        eval_set=[(X_valid, y_valid)],\n        eval_metric=['rmse'],\n        batch_size=10000,\n        patience=40,\n        max_epochs=200,\n        num_workers=4,\n    )\n    \n    # Prepare the test data and make predictions\n    X_test = df_test[feature_cols].to_numpy()\n    \n    # Aggregate the predictions across the 5 folds (averaging for ensemble)\n    final_res_1 += reg.predict(X_test)[:, 0] / 5\n    \n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# apply limit for the result here!! \ndf_subm[\"bg+1:00\"] = (final_res_0 + final_res_1)/2.\ndf_subm.to_csv(\"submission.csv\")\ndf_subm","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_subm[\"bg+1:00\"]","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}