{"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","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Import Libraries","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\nimport warnings\n\nwarnings.filterwarnings('ignore')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Load Data","metadata":{}},{"cell_type":"code","source":"train_data = pd.read_csv('/kaggle/input/brist1d/train.csv')\ntest_data  = pd.read_csv('/kaggle/input/brist1d/test.csv')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Add an indicator column\ntrain_data['Dataset'] = 'train'\ntest_data['Dataset'] = 'test'\n\n# Concatenate train and test\ndf = pd.concat([train_data, test_data], axis=0).reset_index(drop=True)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 1. Exploratory Data Analysis (EDA)","metadata":{}},{"cell_type":"markdown","source":"## 1.1: Load and Understand the Dataset","metadata":{}},{"cell_type":"code","source":"train_data","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.info()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.describe()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 2: Data Preprocessing ","metadata":{}},{"cell_type":"markdown","source":"## 2.1: Explore Missing Values","metadata":{}},{"cell_type":"code","source":"pd.set_option('display.max_columns', None)\nprint(df.head())  # Display the first few rows with all columns","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.isnull().sum()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"column_names = df.columns.tolist()\nprint(column_names)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"missing_percentage = (df.isnull().sum() / len(df)) * 100\nprint(missing_percentage.sort_values(ascending=False))","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Separate numerical and categorical columns\nnumerical_columns = df.select_dtypes(include=['float64', 'int64']).columns\ncategorical_columns = df.select_dtypes(include=['object']).columns\n\n# Display results\nprint(\"Numerical Columns:\")\nprint(numerical_columns)\n\nprint(\"\\nCategorical Columns:\")\nprint(categorical_columns)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Handling missing values for numerical columns\nfor column in numerical_columns:\n    # Replace missing values in numerical columns with the mean\n    df[column].fillna(df[column].mean(), inplace=True)\n\n# Handling missing values for categorical columns\nfor column in categorical_columns:\n    # Replace missing values in categorical columns with 'no activity'\n    df[column].fillna('no activity', inplace=True)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.isnull().any().sum()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2.2: Encoding","metadata":{}},{"cell_type":"code","source":"cat = ['p_num', 'time', 'activity-5:55', 'activity-5:50', 'activity-5:45',\n       'activity-5:40', 'activity-5:35', 'activity-5:30', 'activity-5:25',\n       'activity-5:20', 'activity-5:15', 'activity-5:10', 'activity-5:05',\n       'activity-5:00', 'activity-4:55', 'activity-4:50', 'activity-4:45',\n       'activity-4:40', 'activity-4:35', 'activity-4:30', 'activity-4:25',\n       'activity-4:20', 'activity-4:15', 'activity-4:10', 'activity-4:05',\n       'activity-4:00', 'activity-3:55', 'activity-3:50', 'activity-3:45',\n       'activity-3:40', 'activity-3:35', 'activity-3:30', 'activity-3:25',\n       'activity-3:20', 'activity-3:15', 'activity-3:10', 'activity-3:05',\n       'activity-3:00', 'activity-2:55', 'activity-2:50', 'activity-2:45',\n       'activity-2:40', 'activity-2:35', 'activity-2:30', 'activity-2:25',\n       'activity-2:20', 'activity-2:15', 'activity-2:10', 'activity-2:05',\n       'activity-2:00', 'activity-1:55', 'activity-1:50', 'activity-1:45',\n       'activity-1:40', 'activity-1:35', 'activity-1:30', 'activity-1:25',\n       'activity-1:20', 'activity-1:15', 'activity-1:10', 'activity-1:05',\n       'activity-1:00', 'activity-0:55', 'activity-0:50', 'activity-0:45',\n       'activity-0:40', 'activity-0:35', 'activity-0:30', 'activity-0:25',\n       'activity-0:20', 'activity-0:15', 'activity-0:10', 'activity-0:05',\n       'activity-0:00']","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Convert categorical columns to integers (Label Encoding)\nfrom sklearn.preprocessing import LabelEncoder\n\nlabel_encoder = LabelEncoder()\nfor col in cat:\n    df[col] = label_encoder.fit_transform(df[col])  # Apply LabelEncoder to each column","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2.3: Train-Test Split for Model Development","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\n# Split concatenated data back into train and test\ntrain_data = df[df['Dataset'] == 'train'].drop(columns=['Dataset', 'id'])\ntest_data = df[df['Dataset'] == 'test'].drop(columns=['Dataset', 'bg+1:00'])\n\n\ncategorical_columns = train_data.select_dtypes(include=['object']).columns\n\n# Example: Assume 'target_column' is your target variable\ntarget_column = 'bg+1:00'  # Replace with the actual target column name\nX = train_data.drop(columns=[target_column])  # Features\ny = train_data[target_column]  # Target\n\n# Reshape y to be 2D (required by TabNet)\ny = y.values.reshape(-1, 1)\n\n\n# Split the data: 80% train, 20% test\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n\n\n# Log transform the target variables to stabilize variance\ny_train = np.log1p(y_train)  # Log transform training target\ny_test = np.log1p(y_test)      # Log transform validation target\n\n\n# Display the shapes of the resulting splits\nprint(\"X_train shape:\", X_train.shape)\nprint(\"X_test shape:\", X_test.shape)\nprint(\"y_train shape:\", y_train.shape)\nprint(\"y_test shape:\", y_test.shape)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 3. Model Selection and Implementation","metadata":{}},{"cell_type":"code","source":"column_names = X_train.columns.tolist()\nprint(column_names)\n\n# Input list\ndata = column_names\n\n# Grouping by the first part of the name with their positions\nfrom collections import defaultdict\n\ngrouped_data = defaultdict(list)\nfor index, item in enumerate(data):\n    if '-' in item or '+' in item:\n        prefix = item.split('-')[0].split('+')[0]  # Extract prefix\n    else:\n        prefix = item  # No hyphen or plus, use the whole name\n    grouped_data[prefix].append(index)  # Store index only\n\n# Flatten all grouped indices into a single list\nall_indices = [indices for indices in grouped_data.values()]\n\n# Print the final list of grouped indices\nprint(all_indices)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## TabNet","metadata":{}},{"cell_type":"code","source":"!pip install pytorch-tabnet","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"groups = all_indices\n\nfrom pytorch_tabnet.tab_model import TabNetRegressor\nfrom sklearn.metrics import mean_absolute_error, mean_squared_error\n\n# Regression\nreg_tabnet = TabNetRegressor(optimizer_params=dict(lr=0.09),grouped_features=groups, verbose=1)\n\nreg_tabnet.fit(\n    X_train.values, y_train,\n    eval_set=[(X_test.values, y_test)],\n    eval_metric=[\"rmse\"],\n    max_epochs=100,\n    patience=30,\n)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## CatBoost","metadata":{}},{"cell_type":"code","source":"# import pandas as pd\n# from catboost import CatBoostRegressor, Pool\n# from sklearn.model_selection import train_test_split\n# from sklearn.metrics import mean_squared_error\n\n\n\n# # Initialize the CatBoost model\n# model = CatBoostRegressor(iterations=1000, depth=6, learning_rate=0.1, loss_function='RMSE', cat_features=['p_num', 'time', 'activity-5:55', 'activity-5:50', 'activity-5:45',\n#        'activity-5:40', 'activity-5:35', 'activity-5:30', 'activity-5:25',\n#        'activity-5:20', 'activity-5:15', 'activity-5:10', 'activity-5:05',\n#        'activity-5:00', 'activity-4:55', 'activity-4:50', 'activity-4:45',\n#        'activity-4:40', 'activity-4:35', 'activity-4:30', 'activity-4:25',\n#        'activity-4:20', 'activity-4:15', 'activity-4:10', 'activity-4:05',\n#        'activity-4:00', 'activity-3:55', 'activity-3:50', 'activity-3:45',\n#        'activity-3:40', 'activity-3:35', 'activity-3:30', 'activity-3:25',\n#        'activity-3:20', 'activity-3:15', 'activity-3:10', 'activity-3:05',\n#        'activity-3:00', 'activity-2:55', 'activity-2:50', 'activity-2:45',\n#        'activity-2:40', 'activity-2:35', 'activity-2:30', 'activity-2:25',\n#        'activity-2:20', 'activity-2:15', 'activity-2:10', 'activity-2:05',\n#        'activity-2:00', 'activity-1:55', 'activity-1:50', 'activity-1:45',\n#        'activity-1:40', 'activity-1:35', 'activity-1:30', 'activity-1:25',\n#        'activity-1:20', 'activity-1:15', 'activity-1:10', 'activity-1:05',\n#        'activity-1:00', 'activity-0:55', 'activity-0:50', 'activity-0:45',\n#        'activity-0:40', 'activity-0:35', 'activity-0:30', 'activity-0:25',\n#        'activity-0:20', 'activity-0:15', 'activity-0:10', 'activity-0:05',\n#        'activity-0:00'])\n\n# # Train the model\n# model.fit(X_train, y_train)\n\n# # # Predict on validation set\n# # y_val_pred = model.predict(X_test)\n\n# # # Inverse transform predictions\n# # y_val_pred_original = np.expm1(y_val_pred)\n# # y_val_original = np.expm1(y_test)\n\n# # Make predictions\n# y_pred = model.predict(X_test)\n\n# # Evaluate the model\n# rmse = mean_squared_error(y_test, y_pred, squared=False)\n# print(f\"RMSE: {rmse}\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Submition","metadata":{}},{"cell_type":"code","source":"model = reg_tabnet","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Preprocess test data\ntest_features = test_data.drop(columns=['id'], errors='ignore')  # Drop unnecessary columns\n# test_features = test_features.reindex(columns=X_train.columns, fill_value=0)  # Align columns with training data","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Predict using the trained CatBoost model\ntest_data['bg+1:00'] = model.predict(test_features.values)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Reverse log transformation if applied during training\ntest_data['bg+1:00'] = np.expm1(test_data['bg+1:00'])  # Use np.expm1 if np.log1p was used during training\n\n# Clip predictions to avoid negative values (optional)\ntest_data['bg+1:00'] = test_data['bg+1:00'].clip(lower=0)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Create submission file\nsubmission = test_data[['id', 'bg+1:00']]  # Include 'id' and the predicted target column\nsubmission.to_csv('submission.csv', index=False)\n\nprint(\"Submission file created: submission.csv\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}