{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-12-18T19:05:11.653953Z","iopub.execute_input":"2024-12-18T19:05:11.654346Z","iopub.status.idle":"2024-12-18T19:05:12.899451Z","shell.execute_reply.started":"2024-12-18T19:05:11.654298Z","shell.execute_reply":"2024-12-18T19:05:12.898394Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pd.options.display.max_columns = None\nimport warnings\nwarnings.filterwarnings(\"ignore\")\nwarnings.simplefilter(action='ignore', category=FutureWarning)\n\ntrain=pd.read_csv(\"/kaggle/input/brist1d/train.csv\")\ntrain = train.drop(columns=['id'])\ntest=pd.read_csv(\"/kaggle/input/brist1d/test.csv\")\nparticipant_number=test['id']\ntest = test.drop(columns=['id'])\n\n","metadata":{"execution":{"iopub.status.busy":"2024-12-18T19:05:12.901291Z","iopub.execute_input":"2024-12-18T19:05:12.901730Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define the list of activities\nactivities = [\n    'Indoor climbing', 'Run', 'Strength training', 'Swim', 'Bike', 'Dancing',\n    'Stairclimber', 'Spinning', 'Walking', 'HIIT', 'Outdoor Bike', 'Walk',\n    'Aerobic Workout', 'Tennis', 'Workout', 'Hike', 'Zumba', 'Sport', 'Yoga',\n    'Swimming', 'Weights', 'Running'\n]\n\n# Create a dictionary to map activities to numbers\nactivity_map = {activity: i+1 for i, activity in enumerate(activities)}\nactivity_map[\"Missing\"] = len(activity_map) + 1\n\n# Find all activity columns\ndef encode_activities(df):\n    activity_columns = [col for col in df.columns if col.startswith('activity')]\n    \n    # Encode each activity column\n    for col in activity_columns:\n        df[f'{col}'] = df[col].map(activity_map).fillna(activity_map[\"Missing\"])\n    \n    # Check for any activities that weren't encoded across all activity columns\n    missing_encodings = pd.DataFrame()\n    for col in activity_columns:\n        missing = df[df[f'{col}'].isna() & df[col].notna()]\n        if not missing.empty:\n            missing_encodings = pd.concat([missing_encodings, missing[[col]]])\n    \n    if not missing_encodings.empty:\n        print(\"\\nWarning: Some activities were not encoded:\")\n        print(missing_encodings.melt()['value'].unique())\n    else:\n        print(\"\\nAll activities were successfully encoded.\")\n        return df\n\n    ","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train=encode_activities(train)\ntest=encode_activities(test)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def str_to_int(df):\n    df['time']=pd.to_datetime(df['time'],format='%H:%M:%S')\n    df['time'] = df['time'].dt.hour * 60 + df['time'].dt.minute + df['time'].dt.second / 60\n    df['p_num'] = df['p_num'].str.replace(r'\\D', '', regex=True).astype(int)\n    return df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train=str_to_int(train)\ntest=str_to_int(test)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n# Step 1: Calculate correlations\ncorrelations = train.corr()['bg+1:00'].drop('bg+1:00').abs()\n\n# Step 2: Select top correlated features (33% of total features)\ncritical_features = correlations.sort_values(ascending=False).head(int(len(correlations) / 3)).index\nnon_nan_counts = train[critical_features].notna().sum(axis=1)\nprint(non_nan_counts.describe())\nthresholds = np.arange(0.3, 0.7, 0.05)  # From 30% to 70% in steps of 5%\nretained_rows = [\n    train.dropna(thresh=int(len(critical_features) * (1 - t)), subset=critical_features).shape[0]\n    for t in thresholds\n]\nplt.plot(thresholds, retained_rows)\nplt.xlabel(\"Threshold (1 - x)\")\nplt.ylabel(\"Number of rows retained\")\nplt.title(\"Impact of Threshold on Retained Rows\")\nplt.show()\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Step 3: Allow missing values in 38% of critical features\nthreshold = int(len(critical_features)*(1-0.385))\n\n# Step 4: Filter rows with flexible missing value threshold\ntrain_filtered = train.dropna(thresh=threshold, subset=critical_features)\n\n# Debugging\nprint(\"\\nTop Features:\",threshold,len(critical_features), list(critical_features))\nprint(\"\\nShape before filtering:\", train.shape)\nprint(\"\\nShape after filtering:\", train_filtered.shape)\ntrain=train_filtered","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.impute import KNNImputer\n\nimport pandas as pd\nfrom sklearn.impute import KNNImputer\n\ndef impute_chunk(df, chunk_size=10000, n_neighbors=10):\n\n    imputer = KNNImputer(n_neighbors=n_neighbors)\n    # Function to impute a single chunk\n    def process_chunk(chunk):\n        return pd.DataFrame(imputer.fit_transform(chunk), columns=chunk.columns)\n\n    # Split DataFrame into chunks and process each chunk\n    chunks = [df[i:i + chunk_size] for i in range(0, len(df), chunk_size)]\n    imputed_chunks = [process_chunk(chunk) for chunk in chunks]\n\n    # Combine the chunks back into a single DataFrame\n    imputed_df = pd.concat(imputed_chunks, ignore_index=True)\n    return imputed_df\n\ntrain = impute_chunk(train, chunk_size=5000, n_neighbors=5)\nknn_imputer = KNNImputer(n_neighbors=5)\ntest = pd.DataFrame(knn_imputer.fit_transform(test.values), columns=test.columns, index=test.index)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train.to_csv(\"train_mod.csv\", index=False)\ntest.to_csv(\"test_mod.csv\", index=False)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.ensemble import IsolationForest\n\nscaled_data_df=train\n# Select numeric columns for outlier detection\nnumeric_data = scaled_data_df.select_dtypes(include=[float, int])\n\n# Initialize IsolationForest\niso_forest = IsolationForest(\n    contamination=0.15,  # Proportion of data to consider as outliers\n    random_state=17\n)\n\n# Fit the model and predict outliers\noutlier_labels = iso_forest.fit_predict(numeric_data)\n\n# Add the outlier labels to the original DataFrame\nscaled_data_df['outlier'] = outlier_labels\n\n# Filter out the outliers\ntrain = scaled_data_df[scaled_data_df['outlier'] == 1].drop(columns='outlier')  # Keep only inliers\n# Check the shapes\nprint(\"Original shape:\", scaled_data_df.shape)\nprint(\"Shape after removing outliers:\", train.shape)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import xgboost as xgb\nfrom sklearn.metrics import mean_squared_error\nimport numpy as np\nimport pandas as pd\nimport optuna\nfrom sklearn.model_selection import train_test_split, KFold\n\n# Split the data\nX = train.iloc[:, :-1].values\ny = train.iloc[:, -1].values\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=17)\n\ndef objective(trial):\n    xgboost_param = {\n        'random_state': 17,\n        'objective': 'reg:squarederror',\n        'eval_metric': 'rmse',\n        'tree_method': 'hist',  \n        'lambda': trial.suggest_loguniform('lambda', 0.1, 20.0),\n        'alpha': trial.suggest_loguniform('alpha', 1e-3, 10.0),\n        'learning_rate': trial.suggest_float('learning_rate', 0.05, 0.5),\n        'n_estimators': trial.suggest_int('n_estimators', 500, 2500),\n        'max_depth': trial.suggest_int('max_depth', 5, 15),\n        'min_child_weight': trial.suggest_int('min_child_weight', 0.1, 5),\n        'gamma': trial.suggest_float('gamma', 0.0, 0.12),\n        'subsample': trial.suggest_float('subsample', 0.5, 1.0),\n        'colsample_bytree': trial.suggest_float('colsample_bytree', 0.5,1.0),\n    }\n\n    kf = KFold(n_splits=5, shuffle=True, random_state=17)\n    cv_rmse = []\n    \n    for train_idx, val_idx in kf.split(X_train):\n        X_train_split, X_valid_split = X_train[train_idx], X_train[val_idx]\n        y_train_split, y_valid_split = y_train[train_idx], y_train[val_idx]\n        \n        model = xgb.XGBRegressor(**xgboost_param)\n        model.fit(\n            X_train_split, y_train_split,\n            eval_set=[(X_valid_split, y_valid_split)],\n            early_stopping_rounds=50,\n            verbose=False\n        )\n        preds = model.predict(X_valid_split)\n        rmse = mean_squared_error(y_valid_split, preds, squared=False)\n        cv_rmse.append(rmse)\n    \n    return np.mean(cv_rmse)\n\n# Create an Optuna study and optimize it with TPE sampler for efficient search\nstudy = optuna.create_study(direction='minimize', sampler=optuna.samplers.TPESampler(seed=17))\nstudy.optimize(objective, n_trials=50, timeout=35000)\n\n# Get the best hyperparameters\nbest_params = study.best_params\nbest_score = study.best_value\nprint(f\"Best Hyperparameters: {best_params}\")\nprint(f\"Best RMSE: {best_score:.3f}\")\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"optuna.visualization.plot_optimization_history(study)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"optuna.visualization.plot_parallel_coordinate(study)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"optuna.visualization.plot_slice(study, params=['n_estimators', 'max_depth', 'learning_rate', 'min_child_weight','gamma','colsample_bytree'])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"optuna.visualization.plot_param_importances(study)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Recreate the model with the best parameters\nbest_model = xgb.XGBRegressor(\n    **best_params,\n    random_state=17,\n    tree_method='hist',  # Better efficiency for large datasets\n    eval_metric='rmse'\n)\n\n# Fit the model with the entire training dataset\nbest_model.fit(X, y)\n\n# Ensure the test data is in the correct format\nX_test_data = test.values\n\n# Predict using the trained model\ny_test_pred = best_model.predict(X_test_data)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Save predictions to a CSV file\noutput = pd.DataFrame({\n    \"id\": participant_number,  # Or another identifier column if available\n    \"bg+1:00\": np.round(y_test_pred, 1)\n})\noutput.to_csv(\"test_predictions.csv\", index=False)","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}