{"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":82611,"databundleVersionId":9553358,"sourceType":"competition"}],"dockerImageVersionId":30786,"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 TimeSeriesSplit, RandomizedSearchCV\nfrom sklearn.metrics import mean_squared_error\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.pipeline import Pipeline\nfrom xgboost import XGBRegressor\nfrom lightgbm import LGBMRegressor  \nfrom sklearn.ensemble import StackingRegressor\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\n# Load and preprocess data\ntrain_path = '/kaggle/input/brist1d/train.csv'\ntest_path = '/kaggle/input/brist1d/test.csv'\nsample_submission_path = '/kaggle/input/brist1d/sample_submission.csv'\n\n# Load the datasets\ntrain = pd.read_csv(train_path)\ntest = pd.read_csv(test_path)\nsample_submission = pd.read_csv(sample_submission_path)\n\nsample_submission_head = sample_submission.head()\ntest_head = test.head()\n\nsample_submission_head, test_head\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-11-29T12:18:50.248448Z","iopub.execute_input":"2024-11-29T12:18:50.248930Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Time feature extraction\ndef preprocess_time_column(df):\n    df['time'] = pd.to_datetime(df['time'], format='%H:%M:%S')\n    df['hour'] = df['time'].dt.hour\n    df['minute'] = df['time'].dt.minute\n    df['hour_sin'] = np.sin(2 * np.pi * df['hour'] / 24)\n    df['hour_cos'] = np.cos(2 * np.pi * df['hour'] / 24)\n    df['minute_sin'] = np.sin(2 * np.pi * df['minute'] / 60)\n    df['minute_cos'] = np.cos(2 * np.pi * df['minute'] / 60)\n    return df\n    \nprint(f\"Initial train shape: {train.shape}\")\ntrain = preprocess_time_column(train)\ntest = preprocess_time_column(test)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Aggregate features\ndef aggregate_features(df, prefix_list):\n    for prefix in prefix_list:\n        columns = [col for col in df.columns if col.startswith(prefix)]\n        if columns:\n            df[f'{prefix}_mean'] = df[columns].mean(axis=1)\n    return df\n\nprint(f\"After time preprocessing: {train.shape}\")\ntrain = aggregate_features(train, ['bg', 'insulin', 'carbs', 'hr'])\ntest = aggregate_features(test, ['bg', 'insulin', 'carbs', 'hr'])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Reduced lag and rolling parameters\ndef create_lag_rolling_features(df, col, lags=[1], windows=[2]):\n    for lag in lags:\n        df[f'{col}_lag{lag}'] = df[col].shift(lag)\n    for window in windows:\n        df[f'{col}_rolling_mean_{window}'] = df[col].rolling(window=window).mean()\n        df[f'{col}_rolling_std_{window}'] = df[col].rolling(window=window).std()\n    return df\n\nprint(f\"Initial train shape: {train.shape}\")\ntrain = preprocess_time_column(train)\nprint(f\"After time preprocessing: {train.shape}\")\n\ntrain = aggregate_features(train, ['bg', 'insulin', 'carbs', 'hr'])\nprint(f\"After feature aggregation: {train.shape}\")\n\n# Apply lag and rolling features\nfor col in ['bg_mean', 'insulin_mean', 'carbs_mean', 'hr_mean']:\n    train = create_lag_rolling_features(train, col, lags=[1], windows=[2])\n    print(f\"After creating lag/rolling features for {col}: {train.shape}\")\n\n# Handle missing values\nprint(\"Handling missing values...\")\ntrain.fillna(method='bfill', inplace=True)\ntrain.fillna(method='ffill', inplace=True)\nprint(f\"Shape after handling NaNs: {train.shape}\")\n\n# Final feature/target separation\nX_train = train.drop(columns=['bg+1:00'])\ny_train = train['bg+1:00']\n\n# Check dataset size\nif len(X_train) < 5:\n    raise ValueError(\"Insufficient data for training after preprocessing.\")\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Separate features and target\nX_train = train.drop(columns=['bg+1:00'])\ny_train = train['bg+1:00']\nX_test = test.reindex(columns=X_train.columns, fill_value=0)\n\n# Ensure numeric data\nX_train = X_train.select_dtypes(include=[np.number])\nX_test = X_test.select_dtypes(include=[np.number])\n\n# Define pipeline\npipeline = Pipeline([\n    ('imputer', SimpleImputer(strategy='mean')),\n    ('scaler', StandardScaler()),\n    ('model', XGBRegressor(objective='reg:squarederror', random_state=42))\n])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define hyperparameter grid\nparam_grid = {\n    'model__n_estimators': [100, 200, 500],\n    'model__max_depth': [3, 6, 10],\n    'model__learning_rate': [0.01, 0.05, 0.1],\n    'model__subsample': [0.7, 0.8, 1.0],\n    'model__colsample_bytree': [0.7, 0.8, 1.0],\n    'model__alpha': [0, 1, 10],\n    'model__lambda': [0, 1, 10]\n}\n\n# TimeSeriesSplit for cross-validation\ntscv = TimeSeriesSplit(n_splits=5)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Ensure dataset size is sufficient\nif len(X_train) < 5:  # Minimum 5 rows for 5 splits\n    raise ValueError(\"Insufficient data after preprocessing. Adjust lags or rolling windows.\")\n\n# Dynamically set n_splits\nn_splits = min(5, len(X_train))\ntscv = TimeSeriesSplit(n_splits=n_splits)\n\n# RandomizedSearchCV\nrandom_search = RandomizedSearchCV(\n    pipeline, param_distributions=param_grid, \n    scoring='neg_mean_squared_error', \n    cv=tscv, n_iter=20, random_state=42, n_jobs=-1\n)\n\n# Fit the model\nrandom_search.fit(X_train, y_train)\n\n# Fit the model\nrandom_search.fit(X_train, y_train)\n\n# Best model\nbest_model = random_search.best_estimator_","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Train predictions and RMSE\ny_train_pred = best_model.predict(X_train)\ntrain_rmse = np.sqrt(mean_squared_error(y_train, y_train_pred))\nprint(f'Train RMSE: {train_rmse}')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Test predictions\ny_pred = best_model.predict(X_test)\n\n# Prepare submission file\nsubmission = pd.DataFrame({\n    'id': sample_submission['id'], \n    'bg+1:00': y_pred\n})\nsubmission.to_csv('submission.csv', index=False)\nprint(submission.head())","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}