{"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":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Import necessary libraries\nimport numpy as np\nimport pandas as pd\nfrom itertools import product\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.model_selection import GroupKFold\nfrom sklearn.metrics import mean_squared_error\nfrom xgboost import XGBRegressor\nimport optuna\n\n# Load datasets\ndf_train = pd.read_csv('/kaggle/input/brist1d/train.csv', index_col='id', parse_dates=['time'])\ndf_test = pd.read_csv('/kaggle/input/brist1d/test.csv', index_col='id', parse_dates=['time'])\ndf_subm = pd.read_csv('/kaggle/input/brist1d/sample_submission.csv', index_col='id')\n\n# Replace incompatible column names\ndf_train.columns = df_train.columns.str.replace(':', '-')\ndf_test.columns = df_test.columns.str.replace(':', '-')\n\n# Define feature column ranges\nhours = range(0, 6)   # Last 6 hours\nminutes = range(0, 60, 5)  # Every 5 minutes\n\n# Generate feature column names\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# Handle missing values with interpolation (column-wise)\nfor colset in [bg_cols, insu_cols, carb_cols, hr_cols, step_cols, cals_cols]:\n    df_train[colset] = df_train[colset].interpolate(axis=1, limit_direction='both')\n    df_test[colset] = df_test[colset].interpolate(axis=1, limit_direction='both')\n\n# Impute remaining missing values using SimpleImputer\nimputer = SimpleImputer(strategy='mean')  # Mean imputation for numerical stability\ndf_train[feature_cols] = imputer.fit_transform(df_train[feature_cols])\ndf_test[feature_cols] = imputer.transform(df_test[feature_cols])\n\n# Add cyclical features for 'hour' to capture temporal patterns\ndf_train['sin_hour'] = np.sin(2 * np.pi * df_train['time'].dt.hour / 24)\ndf_train['cos_hour'] = np.cos(2 * np.pi * df_train['time'].dt.hour / 24)\ndf_test['sin_hour'] = np.sin(2 * np.pi * df_test['time'].dt.hour / 24)\ndf_test['cos_hour'] = np.cos(2 * np.pi * df_test['time'].dt.hour / 24)\n\n# Update feature columns\nfeature_cols.extend(['sin_hour', 'cos_hour'])\n\n# Target column, group column, and time column\ntarget_col = 'bg+1-00'\ngroup_col = 'p_num'\n\n# Define Optuna optimization function\ndef objective(trial):\n    param = {\n        'objective': 'reg:squarederror',\n        'eval_metric': 'rmse',\n        'booster': 'gbtree',\n        'n_estimators': trial.suggest_int('n_estimators', 500, 2900),\n        'eta': trial.suggest_loguniform('eta', 0.01, 0.3),\n        'max_depth': trial.suggest_int('max_depth', 3, 29),\n        'min_child_weight': trial.suggest_int('min_child_weight', 1, 10),\n        'gamma': trial.suggest_loguniform('gamma', 1e-6, 1e-1),\n        'subsample': trial.suggest_uniform('subsample', 0.6, 1.0),\n        'colsample_bytree': trial.suggest_uniform('colsample_bytree', 0.6, 1.0),\n        'tree_method': 'gpu_hist',  # Use GPU for faster training\n    }\n\n    # Prepare training data\n    X = df_train[feature_cols]\n    y = df_train[target_col]\n    groups = df_train[group_col]\n    cv = GroupKFold(n_splits=5)\n    rmse_list = []\n\n    # Cross-validation loop\n    for train_idx, valid_idx in cv.split(X, y, groups):\n        X_train, X_valid = X.iloc[train_idx], X.iloc[valid_idx]\n        y_train, y_valid = y.iloc[train_idx], y.iloc[valid_idx]\n\n        model = XGBRegressor(**param)\n        model.fit(X_train, y_train, eval_set=[(X_valid, y_valid)], early_stopping_rounds=50, verbose=False)\n        y_pred = model.predict(X_valid)\n        rmse_list.append(mean_squared_error(y_valid, y_pred, squared=False))\n\n    return np.mean(rmse_list)\n\n# Run Optuna optimization\nstudy = optuna.create_study(direction='minimize')\nstudy.optimize(objective, n_trials=61)\n\n# Train final model with best parameters\nbest_params = study.best_params\nprint(\"Best Hyperparameters:\", best_params)\n\n# Final predictions using K-Fold Cross Validation\nX = df_train[feature_cols]\ny = df_train[target_col]\ngroups = df_train[group_col]\ndf_subm[target_col] = 0.0\n\ncv = GroupKFold(n_splits=5)\nfor train_idx, valid_idx in cv.split(X, y, groups):\n    X_train, X_valid = X.iloc[train_idx], X.iloc[valid_idx]\n    y_train, y_valid = y.iloc[train_idx], y.iloc[valid_idx]\n\n    model = XGBRegressor(**best_params)\n    model.fit(X_train, y_train, eval_set=[(X_valid, y_valid)], early_stopping_rounds=50, verbose=False)\n\n    # Predict on test data and average results\n    df_subm[target_col] += model.predict(df_test[feature_cols]) / cv.n_splits\n\n# Save submission file\nsubmission = pd.DataFrame({'id': df_subm.index, 'bg+1:00': df_subm[target_col]})\nsubmission.to_csv('submission_optimized.csv', index=False)\nprint(\"Submission saved!\")\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-11-24T10:35:46.520319Z","iopub.execute_input":"2024-11-24T10:35:46.520714Z","iopub.status.idle":"2024-11-24T10:37:03.827628Z","shell.execute_reply.started":"2024-11-24T10:35:46.520679Z","shell.execute_reply":"2024-11-24T10:37:03.826825Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-24T10:37:03.828898Z","iopub.execute_input":"2024-11-24T10:37:03.829157Z","iopub.status.idle":"2024-11-24T10:37:03.844130Z","shell.execute_reply.started":"2024-11-24T10:37:03.829132Z","shell.execute_reply":"2024-11-24T10:37:03.843476Z"}},"outputs":[],"execution_count":null}]}