{"metadata":{"kaggle":{"accelerator":"none","dataSources":[{"sourceId":82611,"databundleVersionId":9553358,"sourceType":"competition"}],"dockerImageVersionId":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false},"kernelspec":{"display_name":"Python 3","language":"python","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"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport pandas as pd\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import HistGradientBoostingRegressor\nfrom sklearn.metrics import mean_squared_error\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:10.960692Z","iopub.execute_input":"2024-10-26T06:26:10.961164Z","iopub.status.idle":"2024-10-26T06:26:14.512038Z","shell.execute_reply.started":"2024-10-26T06:26:10.961121Z","shell.execute_reply":"2024-10-26T06:26:14.510629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/brist1d/train.csv', low_memory=False)","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:14.514386Z","iopub.execute_input":"2024-10-26T06:26:14.515063Z","iopub.status.idle":"2024-10-26T06:26:35.011353Z","shell.execute_reply.started":"2024-10-26T06:26:14.515010Z","shell.execute_reply":"2024-10-26T06:26:35.009990Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = pd.read_csv('/kaggle/input/brist1d/test.csv', low_memory=False)","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:35.012807Z","iopub.execute_input":"2024-10-26T06:26:35.013166Z","iopub.status.idle":"2024-10-26T06:26:35.302638Z","shell.execute_reply.started":"2024-10-26T06:26:35.013128Z","shell.execute_reply":"2024-10-26T06:26:35.301719Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Feature Enginering","metadata":{}},{"cell_type":"markdown","source":"## Making timeframes","metadata":{}},{"cell_type":"code","source":"df['time'] = pd.to_datetime(df['time'], format='%H:%M:%S')\n\ndf['120_min_timeframe'] = df['time'].dt.floor('120T').dt.time\ndf['90_min_timeframe'] = df['time'].dt.floor('90T').dt.time\ndf['75_min_timeframe'] = df['time'].dt.floor('75T').dt.time\ndf['60_min_timeframe'] = df['time'].dt.floor('60T').dt.time\ndf['45_min_timeframe'] = df['time'].dt.floor('45T').dt.time\ndf['30_min_timeframe'] = df['time'].dt.floor('30T').dt.time\ndf['15_min_timeframe'] = df['time'].dt.floor('15T').dt.time\ndf['10_min_timeframe'] = df['time'].dt.floor('10T').dt.time","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:35.305573Z","iopub.execute_input":"2024-10-26T06:26:35.306502Z","iopub.status.idle":"2024-10-26T06:26:36.047403Z","shell.execute_reply.started":"2024-10-26T06:26:35.306449Z","shell.execute_reply":"2024-10-26T06:26:36.046493Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['10_min_timeframe_hours'] = df['10_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ndf['10_min_timeframe_minutes'] = df['10_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ndf['10_min_timeframe_seconds'] = df['10_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)\n\ndf['15_min_timeframe_hours'] = df['15_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ndf['15_min_timeframe_minutes'] = df['15_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ndf['15_min_timeframe_seconds'] = df['15_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)\n\ndf['30_min_timeframe_hours'] = df['30_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ndf['30_min_timeframe_minutes'] = df['30_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ndf['30_min_timeframe_seconds'] = df['30_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)\n\ndf['45_min_timeframe_hours'] = df['45_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ndf['45_min_timeframe_minutes'] = df['45_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ndf['45_min_timeframe_seconds'] = df['45_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)\n\ndf['60_min_timeframe_hours'] = df['60_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ndf['60_min_timeframe_minutes'] = df['60_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ndf['60_min_timeframe_seconds'] = df['60_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)\n\ndf['75_min_timeframe_hours'] = df['75_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ndf['75_min_timeframe_minutes'] = df['75_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ndf['75_min_timeframe_seconds'] = df['75_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)\n\ndf['90_min_timeframe_hours'] = df['90_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ndf['90_min_timeframe_minutes'] = df['90_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ndf['90_min_timeframe_seconds'] = df['90_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)\n\ndf['120_min_timeframe_hours'] = df['120_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ndf['120_min_timeframe_minutes'] = df['120_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ndf['120_min_timeframe_seconds'] = df['120_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:36.048752Z","iopub.execute_input":"2024-10-26T06:26:36.049105Z","iopub.status.idle":"2024-10-26T06:26:40.354051Z","shell.execute_reply.started":"2024-10-26T06:26:36.049068Z","shell.execute_reply":"2024-10-26T06:26:40.352909Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test['time'] = pd.to_datetime(test['time'], format='%H:%M:%S')\n\ntest['120_min_timeframe'] = test['time'].dt.floor('120T').dt.time\ntest['90_min_timeframe'] = test['time'].dt.floor('90T').dt.time\ntest['75_min_timeframe'] = test['time'].dt.floor('75T').dt.time\ntest['60_min_timeframe'] = test['time'].dt.floor('60T').dt.time\ntest['45_min_timeframe'] = test['time'].dt.floor('45T').dt.time\ntest['30_min_timeframe'] = test['time'].dt.floor('30T').dt.time\ntest['15_min_timeframe'] = test['time'].dt.floor('15T').dt.time\ntest['10_min_timeframe'] = test['time'].dt.floor('10T').dt.time","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:40.355504Z","iopub.execute_input":"2024-10-26T06:26:40.356294Z","iopub.status.idle":"2024-10-26T06:26:40.394455Z","shell.execute_reply.started":"2024-10-26T06:26:40.356239Z","shell.execute_reply":"2024-10-26T06:26:40.393291Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test['10_min_timeframe_hours'] = test['10_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ntest['10_min_timeframe_minutes'] = test['10_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ntest['10_min_timeframe_seconds'] = test['10_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)\n\ntest['15_min_timeframe_hours'] = test['15_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ntest['15_min_timeframe_minutes'] = test['15_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ntest['15_min_timeframe_seconds'] = test['15_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)\n\ntest['30_min_timeframe_hours'] = test['30_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ntest['30_min_timeframe_minutes'] = test['30_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ntest['30_min_timeframe_seconds'] = test['30_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)\n\ntest['45_min_timeframe_hours'] = test['45_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ntest['45_min_timeframe_minutes'] = test['45_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ntest['45_min_timeframe_seconds'] = test['45_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)\n\ntest['60_min_timeframe_hours'] = test['60_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ntest['60_min_timeframe_minutes'] = test['60_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ntest['60_min_timeframe_seconds'] = test['60_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)\n\ntest['75_min_timeframe_hours'] = test['75_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ntest['75_min_timeframe_minutes'] = test['75_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ntest['75_min_timeframe_seconds'] = test['75_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)\n\ntest['90_min_timeframe_hours'] = test['90_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ntest['90_min_timeframe_minutes'] = test['90_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ntest['90_min_timeframe_seconds'] = test['90_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)\n\ntest['120_min_timeframe_hours'] = test['120_min_timeframe'].apply(lambda t: t.hour if pd.notnull(t) else None)\ntest['120_min_timeframe_minutes'] = test['120_min_timeframe'].apply(lambda t: t.minute if pd.notnull(t) else None)\ntest['120_min_timeframe_seconds'] = test['120_min_timeframe'].apply(lambda t: t.second if pd.notnull(t) else None)","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:40.396052Z","iopub.execute_input":"2024-10-26T06:26:40.396475Z","iopub.status.idle":"2024-10-26T06:26:40.521089Z","shell.execute_reply.started":"2024-10-26T06:26:40.396427Z","shell.execute_reply":"2024-10-26T06:26:40.519852Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Group time intervals","metadata":{}},{"cell_type":"code","source":"def group_timeframes(df, col_prefix, intervals=[60], keep_columns=None):\n    cols = [col for col in df.columns if col.startswith(col_prefix)]\n    \n    if keep_columns:\n        cols = [col for col in cols if col not in keep_columns]\n    \n    grouped_cols = {interval: {} for interval in intervals}\n    \n    for col in cols:\n        try:\n            time_part = col.split('-')[-1]\n            hour, minute = map(int, time_part.split(':'))\n        except ValueError:\n            print(f\"Skipping column '{col}' due to invalid time format.\")\n            continue\n        \n        for interval in intervals:\n            start_minute = (minute // interval) * interval\n            end_minute = start_minute + interval\n            \n            if end_minute >= 60:\n                end_minute -= 60\n                end_hour = (hour + 1) % 24\n            else:\n                end_hour = hour\n\n            new_col_name = f'{col_prefix}_{hour:02d}:{start_minute:02d}-{end_hour:02d}:{end_minute:02d}'\n\n            grouped_cols[interval].setdefault(new_col_name, []).append(col)\n    \n    for interval in intervals:\n        for new_col_name, original_cols in grouped_cols[interval].items():\n            df[new_col_name] = df[original_cols].mean(axis=1)\n\n    return df\n\nkeep_columns = ['bg+1:00']\n\ndf = group_timeframes(df, 'bg', intervals=[15, 30, 45, 60], keep_columns=keep_columns)  \ndf = group_timeframes(df, 'insulin', intervals=[15, 30, 45, 60])   \ndf = group_timeframes(df, 'carbs', intervals=[15, 30, 45, 60])     \ndf = group_timeframes(df, 'hr', intervals=[15, 30, 45, 60])        \ndf = group_timeframes(df, 'steps', intervals=[15, 30, 45, 60])     \ndf = group_timeframes(df, 'cals', intervals=[15, 30, 45, 60])      ","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:40.522406Z","iopub.execute_input":"2024-10-26T06:26:40.522827Z","iopub.status.idle":"2024-10-26T06:26:52.977818Z","shell.execute_reply.started":"2024-10-26T06:26:40.522762Z","shell.execute_reply":"2024-10-26T06:26:52.976789Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def group_timeframes(df, col_prefix, intervals=[60], keep_columns=None):\n    cols = [col for col in df.columns if col.startswith(col_prefix)]\n    \n    if keep_columns:\n        cols = [col for col in cols if col not in keep_columns]\n    \n    grouped_cols = {interval: {} for interval in intervals}\n    \n    for col in cols:\n        try:\n            time_part = col.split('-')[-1]\n            hour, minute = map(int, time_part.split(':'))  # Attempt to extract the hour and minute\n        except ValueError:\n            print(f\"Skipping column '{col}' due to invalid time format.\")\n            continue\n        \n        for interval in intervals:\n            start_minute = (minute // interval) * interval\n            end_minute = start_minute + interval\n            \n            if end_minute >= 60:\n                end_minute -= 60\n                end_hour = (hour + 1) % 24\n            else:\n                end_hour = hour\n\n            new_col_name = f'{col_prefix}_{hour:02d}:{start_minute:02d}-{end_hour:02d}:{end_minute:02d}'\n\n            grouped_cols[interval].setdefault(new_col_name, []).append(col)\n    \n    for interval in intervals:\n        for new_col_name, original_cols in grouped_cols[interval].items():\n            df[new_col_name] = df[original_cols].mean(axis=1)\n\n    return df\n\n\n\nkeep_columns = ['bg+1:00']\n\ntest = group_timeframes(test, 'bg', intervals=[15, 30, 45, 60], keep_columns=keep_columns)  \ntest = group_timeframes(test, 'insulin', intervals=[15, 30, 45, 60])   \ntest = group_timeframes(test, 'carbs', intervals=[15, 30, 45, 60])     \ntest = group_timeframes(test, 'hr', intervals=[15, 30, 45, 60])        \ntest = group_timeframes(test, 'steps', intervals=[15, 30, 45, 60])     \ntest = group_timeframes(test, 'cals', intervals=[15, 30, 45, 60])      ","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:52.979001Z","iopub.execute_input":"2024-10-26T06:26:52.979357Z","iopub.status.idle":"2024-10-26T06:26:53.684747Z","shell.execute_reply.started":"2024-10-26T06:26:52.979319Z","shell.execute_reply":"2024-10-26T06:26:53.683857Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Create interaction features by multiplying the corresponding carbs and insulin columns","metadata":{}},{"cell_type":"code","source":"carbs_columns = [col for col in df.columns if col.startswith('carbs')]\ninsulin_columns = [col for col in df.columns if col.startswith('insulin')]\n\nmatching_columns = [(carbs_col, insulin_col) for carbs_col, insulin_col in zip(carbs_columns, insulin_columns) if carbs_col.split('-')[-1] == insulin_col.split('-')[-1]]\n\nfor carbs_col, insulin_col in matching_columns:\n    interaction_feature = f'{carbs_col}_x_{insulin_col}'\n    df[interaction_feature] = df[carbs_col] * df[insulin_col]","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:53.687569Z","iopub.execute_input":"2024-10-26T06:26:53.687959Z","iopub.status.idle":"2024-10-26T06:26:53.970647Z","shell.execute_reply.started":"2024-10-26T06:26:53.687917Z","shell.execute_reply":"2024-10-26T06:26:53.969546Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"carbs_columns = [col for col in test.columns if col.startswith('carbs')]\ninsulin_columns = [col for col in test.columns if col.startswith('insulin')]\n\nmatching_columns = [(carbs_col, insulin_col) for carbs_col, insulin_col in zip(carbs_columns, insulin_columns) if carbs_col.split('-')[-1] == insulin_col.split('-')[-1]]\n\nfor carbs_col, insulin_col in matching_columns:\n    interaction_feature = f'{carbs_col}_x_{insulin_col}'\n    test[interaction_feature] = test[carbs_col] * test[insulin_col]","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:53.972008Z","iopub.execute_input":"2024-10-26T06:26:53.972460Z","iopub.status.idle":"2024-10-26T06:26:54.082852Z","shell.execute_reply.started":"2024-10-26T06:26:53.972410Z","shell.execute_reply":"2024-10-26T06:26:54.081928Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Create interaction features by multiplying the corresponding heart rate and insulin columns","metadata":{}},{"cell_type":"code","source":"hr_columns = [col for col in df.columns if col.startswith('hr')]\ninsulin_columns = [col for col in df.columns if col.startswith('insulin')]\n\nmatching_columns = [(hr_columns, insulin_col) for hr_columns, insulin_col in zip(hr_columns, insulin_columns) if hr_columns.split('-')[-1] == insulin_col.split('-')[-1]]\n\nfor hr_columns, insulin_col in matching_columns:\n    interaction_feature = f'{hr_columns}_x_{insulin_col}'\n    df[interaction_feature] = df[hr_columns] * df[insulin_col]","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:54.084266Z","iopub.execute_input":"2024-10-26T06:26:54.084727Z","iopub.status.idle":"2024-10-26T06:26:54.368280Z","shell.execute_reply.started":"2024-10-26T06:26:54.084661Z","shell.execute_reply":"2024-10-26T06:26:54.367177Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"hr_columns = [col for col in test.columns if col.startswith('hr')]\ninsulin_columns = [col for col in test.columns if col.startswith('insulin')]\n\nmatching_columns = [(hr_columns, insulin_col) for hr_columns, insulin_col in zip(hr_columns, insulin_columns) if hr_columns.split('-')[-1] == insulin_col.split('-')[-1]]\n\nfor hr_columns, insulin_col in matching_columns:\n    interaction_feature = f'{hr_columns}_x_{insulin_col}'\n    test[interaction_feature] = test[hr_columns] * test[insulin_col]","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:54.369295Z","iopub.execute_input":"2024-10-26T06:26:54.369597Z","iopub.status.idle":"2024-10-26T06:26:54.479213Z","shell.execute_reply.started":"2024-10-26T06:26:54.369566Z","shell.execute_reply":"2024-10-26T06:26:54.478159Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Fill NA's and Dropping activity","metadata":{}},{"cell_type":"code","source":"df[df.filter(like='steps').columns] = df.filter(like='steps').fillna(0)\ndf[df.filter(like='cals').columns] = df.filter(like='cals').fillna(0)\ndf[df.filter(like='carbs').columns] = df.filter(like='carbs').fillna(0)\n\ndf = df.drop(df.filter(like='activity').columns, axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:54.480434Z","iopub.execute_input":"2024-10-26T06:26:54.480817Z","iopub.status.idle":"2024-10-26T06:26:57.849687Z","shell.execute_reply.started":"2024-10-26T06:26:54.480776Z","shell.execute_reply":"2024-10-26T06:26:57.848701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test[test.filter(like='steps').columns] =test.filter(like='steps').fillna(0)\ntest[test.filter(like='cals').columns] = test.filter(like='cals').fillna(0)\ntest[test.filter(like='carbs').columns] =test.filter(like='carbs').fillna(0)\n\ntest = test.drop(test.filter(like='activity').columns, axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:57.851242Z","iopub.execute_input":"2024-10-26T06:26:57.851699Z","iopub.status.idle":"2024-10-26T06:26:58.020280Z","shell.execute_reply.started":"2024-10-26T06:26:57.851648Z","shell.execute_reply":"2024-10-26T06:26:58.019310Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Model","metadata":{}},{"cell_type":"code","source":"combined_pnums = pd.concat([df['p_num'], test['p_num']])\n\nlabel_encoder = LabelEncoder()\nlabel_encoder.fit(combined_pnums)\n\ndf['p_num'] = label_encoder.transform(df['p_num'])\ntest['p_num'] = label_encoder.transform(test['p_num'])\n\nX_train = df.drop(['id', 'time','10_min_timeframe','15_min_timeframe','45_min_timeframe',\n                   '75_min_timeframe','120_min_timeframe', '60_min_timeframe','90_min_timeframe', \n                   '30_min_timeframe', 'bg+1:00'], axis=1)\ny_train = df['bg+1:00']\n\nX_train_split, X_val, y_train_split, y_val = train_test_split(X_train, y_train, test_size=0.05, random_state=42)\n\nmodels = {\n    'HistGradientBoosting': HistGradientBoostingRegressor(),\n}\n\nrmse_scores = {}\nfor name, model in models.items():\n    print(f'Training Start {name}....')\n    \n    model.fit(X_train_split, y_train_split)\n    \n    y_pred = model.predict(X_val)\n    \n    rmse = mean_squared_error(y_val, y_pred, squared=False)\n    rmse_scores[name] = rmse\n    print(f'{name} RMSE: {rmse:.4f}')\n    \n    X_test = test.drop(['bg+1:00', 'id', 'time','10_min_timeframe','15_min_timeframe','45_min_timeframe',\n                        '75_min_timeframe','120_min_timeframe', '60_min_timeframe', '30_min_timeframe', \n                        '90_min_timeframe'], axis=1, errors='ignore')\n    \n    test_predictions = model.predict(X_test)\n    \n    submission = pd.DataFrame({'id': test['id'], 'bg+1:00': test_predictions})\n    submission.to_csv(f'/kaggle/working/submission.csv', index=False)\n\n    print(\"Model training, evaluation, and test predictions completed.\")\n\nprint(\"RMSE Scores:\", rmse_scores)","metadata":{"execution":{"iopub.status.busy":"2024-10-26T06:26:58.021610Z","iopub.execute_input":"2024-10-26T06:26:58.022002Z","iopub.status.idle":"2024-10-26T06:28:20.319871Z","shell.execute_reply.started":"2024-10-26T06:26:58.021964Z","shell.execute_reply":"2024-10-26T06:28:20.318777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Train rmse of 1.809680510621126","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}