{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.15","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"tpu1vmV38","dataSources":[{"sourceId":82611,"databundleVersionId":9553358,"sourceType":"competition"}],"dockerImageVersionId":30788,"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,"execution":{"iopub.status.busy":"2024-10-31T22:30:59.425271Z","iopub.execute_input":"2024-10-31T22:30:59.426408Z","iopub.status.idle":"2024-10-31T22:30:59.442436Z","shell.execute_reply.started":"2024-10-31T22:30:59.426365Z","shell.execute_reply":"2024-10-31T22:30:59.441563Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install pandas numpy matplotlib tabulate scikit-learn xgboost","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-31T22:30:59.444113Z","iopub.execute_input":"2024-10-31T22:30:59.444357Z","iopub.status.idle":"2024-10-31T22:31:03.038981Z","shell.execute_reply.started":"2024-10-31T22:30:59.444333Z","shell.execute_reply":"2024-10-31T22:31:03.037702Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Importamos las librerías necesarias\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom tabulate import tabulate\nfrom sklearn.preprocessing import LabelEncoder\nfrom xgboost import XGBRegressor\nfrom sklearn.model_selection import train_test_split, RandomizedSearchCV\nfrom sklearn.metrics import mean_squared_error, make_scorer\nfrom sklearn.metrics import mean_squared_error, make_scorer\nfrom sklearn.model_selection import RandomizedSearchCV, train_test_split\nfrom sklearn.preprocessing import LabelEncoder\nfrom xgboost import XGBRegressor\nimport numpy as np\n\n# Cargamos el dataset\ntrain = pd.read_csv('/kaggle/input/brist1d/train.csv')\ntest = pd.read_csv('/kaggle/input/brist1d/test.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-31T22:31:03.040491Z","iopub.execute_input":"2024-10-31T22:31:03.040843Z","iopub.status.idle":"2024-10-31T22:31:11.287614Z","shell.execute_reply.started":"2024-10-31T22:31:03.040805Z","shell.execute_reply":"2024-10-31T22:31:11.286693Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Calculamos el porcentaje de nulos en cada columna\nnull_percentage = train.isnull().mean() * 100\ncolumns_to_drop = null_percentage[null_percentage >= 50].index\n\n# Eliminamos las columnas del DataFrame\ntrain_cleaned = train.drop(columns=columns_to_drop)\ntest_cleaned = test.drop(columns=columns_to_drop, errors='ignore')\n\n# Mostramos el DataFrame limpio y el listado de columnas eliminadas\nprint(\"Columnas eliminadas debido a más del 50% de nulos:\", columns_to_drop.tolist())\nprint(\"DataFrame de entrenamiento después de eliminar columnas con más del 50% de nulos:\")\nprint(tabulate(train_cleaned.head(), headers='keys', tablefmt='pretty'))\n\n# Porcentaje de nulos en el DataFrame limpio\nnull_percentage_train = train_cleaned.isnull().mean() * 100\nnull_percentage_train = null_percentage_train.reset_index()\nnull_percentage_train.columns = ['Column', 'Null Percentage']\nprint(\"Porcentaje de nulos en el DataFrame de entrenamiento limpio:\")\nprint(tabulate(null_percentage_train, headers='keys', tablefmt='pretty'))\n\nnull_percentage_test = test_cleaned.isnull().mean() * 100\nnull_percentage_test = null_percentage_test.reset_index()\nnull_percentage_test.columns = ['Column', 'Null Percentage']\nprint(\"Porcentaje de nulos en el DataFrame de test limpio:\")\nprint(tabulate(null_percentage_test, headers='keys', tablefmt='pretty'))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-31T22:31:11.289659Z","iopub.execute_input":"2024-10-31T22:31:11.289939Z","iopub.status.idle":"2024-10-31T22:31:12.063104Z","shell.execute_reply.started":"2024-10-31T22:31:11.289910Z","shell.execute_reply":"2024-10-31T22:31:12.062138Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Separar la columna 'time' en horas, minutos y segundos en train_cleaned\ntrain_cleaned[['hours', 'minutes', 'seconds']] = train_cleaned['time'].str.split(':', expand=True)\ntrain_cleaned['hours'] = pd.to_numeric(train_cleaned['hours'])\ntrain_cleaned['minutes'] = pd.to_numeric(train_cleaned['minutes'])\ntrain_cleaned['seconds'] = pd.to_numeric(train_cleaned['seconds'])\ntrain_cleaned['total_minutes'] = train_cleaned['hours'] * 60 + train_cleaned['minutes']\ntrain_cleaned = train_cleaned.drop(columns=[\"seconds\", \"time\"])\n\n# Realizar la misma transformación en test_cleaned\ntest_cleaned[['hours', 'minutes', 'seconds']] = test_cleaned['time'].str.split(':', expand=True)\ntest_cleaned['hours'] = pd.to_numeric(test_cleaned['hours'])\ntest_cleaned['minutes'] = pd.to_numeric(test_cleaned['minutes'])\ntest_cleaned['seconds'] = pd.to_numeric(test_cleaned['seconds'])\ntest_cleaned['total_minutes'] = test_cleaned['hours'] * 60 + test_cleaned['minutes']\ntest_cleaned = test_cleaned.drop(columns=[\"seconds\", \"time\"])\n\n# Mostrar el DataFrame resultante para test_cleaned\nprint(\"DataFrame de test_cleaned después de la transformación:\")\nprint(tabulate(test_cleaned.head(), headers='keys', tablefmt='pretty'))\n\n# Crear un gráfico\nplt.figure(figsize=(32, 26))\nplt.scatter(train_cleaned['bg+1:00'], train_cleaned['total_minutes'], color='blue', alpha=0.6)\nplt.xlim(train_cleaned['bg+1:00'].min(), train_cleaned['bg+1:00'].max())\nplt.ylim(0, 1440)\nplt.title('Comportamiento de bg+1:00 respecto a las horas del día')\nplt.xlabel('Valores de bg+1:00')\nplt.ylabel('Minutos del día (0 a 1440)')\nplt.grid(axis='y', linestyle='--')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-31T22:31:12.064179Z","iopub.execute_input":"2024-10-31T22:31:12.064443Z","iopub.status.idle":"2024-10-31T22:31:14.370888Z","shell.execute_reply.started":"2024-10-31T22:31:12.064416Z","shell.execute_reply":"2024-10-31T22:31:14.369703Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Transformación logarítmica\ntrain_cleaned['log_bg+1:00'] = np.log(train_cleaned['bg+1:00'])\ntrain_cleaned = train_cleaned.drop(columns=[\"id\"])\n\n# Obtener columnas numéricas, excluyendo 'p_num', 'log_bg+1' y 'bg+1'\nnum_cols = train_cleaned.select_dtypes(include='number').columns.difference(['p_num']).difference(['log_bg+1', 'bg+1'])\n\n# Rellenar valores nulos en train_cleaned\ntrain_cleaned[num_cols] = train_cleaned[num_cols].fillna(train_cleaned[num_cols].mean())\n\n# Asegurarse de que num_cols se aplique solo a las columnas que están en test_cleaned\ntest_num_cols = test_cleaned.select_dtypes(include='number').columns.intersection(num_cols)\n\n# Rellenar valores nulos en test_cleaned\ntest_cleaned[test_num_cols] = test_cleaned[test_num_cols].fillna(test_cleaned[test_num_cols].mean())\n\n# Aplicar LabelEncoder a las columnas categóricas\nobject_cols_train = train_cleaned.select_dtypes(include=['object']).columns\nlabel_encoders = {}\nfor col in object_cols_train:\n    le = LabelEncoder()\n    train_cleaned[col] = le.fit_transform(train_cleaned[col].astype(str))\n    label_encoders[col] = le\n\nobject_cols_test = test_cleaned.select_dtypes(include=['object']).columns\nfor col in object_cols_test:\n    if col in label_encoders:\n        test_cleaned[col] = test_cleaned[col].astype(str).apply(\n            lambda x: label_encoders[col].transform([x])[0] if x in label_encoders[col].classes_ else np.nan\n        )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-31T22:31:14.372205Z","iopub.execute_input":"2024-10-31T22:31:14.372504Z","iopub.status.idle":"2024-10-31T22:31:16.887382Z","shell.execute_reply.started":"2024-10-31T22:31:14.372474Z","shell.execute_reply":"2024-10-31T22:31:16.886425Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import train_test_split, RandomizedSearchCV\nfrom sklearn.metrics import make_scorer, mean_squared_error\nfrom xgboost import XGBRegressor\nimport numpy as np\n\n# Codificar la columna 'p_num' en test_cleaned usando valores conocidos de train_cleaned\ndef encode_column(train_col, test_col):\n    le = LabelEncoder()\n    le.fit(train_col.astype(str))\n    return test_col.astype(str).apply(lambda x: le.transform([x])[0] if x in le.classes_ else np.nan)\n\ntest_cleaned['p_num'] = encode_column(train_cleaned['p_num'], test_cleaned['p_num']).fillna(0)\n\n# Separar características (X) y objetivo (y) en el conjunto de entrenamiento\nX = train_cleaned.drop(columns=['bg+1:00', 'log_bg+1:00'])\ny = train_cleaned['log_bg+1:00']\n\n# Dividir en conjuntos de entrenamiento (70%), validación (15%) y prueba (15%)\nX_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)\nX_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)\n\n# Inicializar el modelo XGBRegressor\nmodel = XGBRegressor(\n    eval_metric='rmse',\n    objective='reg:squarederror',\n    n_estimators=1000,\n    learning_rate=0.01,\n    max_depth=7,\n    reg_alpha=0.5,\n    reg_lambda=1,\n)\n\n# Definir el rango de hiperparámetros para optimización\nparam_dist = {\n    'learning_rate': [0.01, 0.05, 0.1, 0.005],\n    'max_depth': [5, 7],\n    'n_estimators': [500, 1000, 1500],\n    'reg_alpha': [0, 0.5, 1],\n    'reg_lambda': [1, 1.5]\n}\n\n# Definir RMSE como métrica de scoring directamente en make_scorer\nscorer = make_scorer(lambda y, y_pred: np.sqrt(mean_squared_error(y, y_pred)), greater_is_better=False)\n\n# Ajuste de hiperparámetros usando RandomizedSearchCV con RMSE\nrandom_search = RandomizedSearchCV(\n    model,\n    param_distributions=param_dist,\n    scoring=scorer,\n    cv=5,\n    verbose=2,\n    n_iter=10,\n    random_state=42\n)\nrandom_search.fit(X_train, y_train)\n\n# Entrenar el mejor modelo con el conjunto de validación\nbest_model = random_search.best_estimator_\nbest_model.fit(X_train, y_train, eval_set=[(X_val, y_val)], verbose=2)\n\n# Calcular RMSE en el conjunto de validación\ny_val_pred_log = best_model.predict(X_val)\nrmse_val = np.sqrt(mean_squared_error(y_val, y_val_pred_log))\nprint(f'RMSE en el conjunto de validación: {rmse_val}')\n\n# Calcular RMSE en el conjunto de prueba\ny_test_pred_log = best_model.predict(X_test)\nrmse_test = np.sqrt(mean_squared_error(y_test, y_test_pred_log))\nprint(f'RMSE en el conjunto de prueba: {rmse_test}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-31T22:31:16.888644Z","iopub.execute_input":"2024-10-31T22:31:16.888911Z","iopub.status.idle":"2024-10-31T23:04:37.797894Z","shell.execute_reply.started":"2024-10-31T22:31:16.888885Z","shell.execute_reply":"2024-10-31T23:04:37.797001Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Calcular RMSE en el conjunto de validación\nrmse = np.sqrt(mean_squared_error(y_val, y_val_pred_log))\nprint(f\"RMSE en el conjunto de validación: {rmse}\")\n\n# Transformar de vuelta a la escala original\ny_val_original = np.exp(y_val)\ny_val_pred_original = np.exp(y_val_pred_log)\n\n# Cálculo del sesgo\nsesgo = np.mean(y_val_pred_original - y_val_original)\nif sesgo > 0:\n    print(f\"El modelo tiene un sesgo positivo hacia arriba: {sesgo}\")\nelse:\n    print(f\"El modelo tiene un sesgo negativo hacia abajo: {sesgo}\")\n\n# Graficar predicciones vs. valores reales\nplt.figure(figsize=(48, 36))\nplt.scatter(y_val_original, y_val_pred_original, alpha=0.3, color='blue')\nplt.plot([min(y_val_original), max(y_val_original)], [min(y_val_original), max(y_val_original)], color='red', linewidth=2)\nplt.xlabel('Valores Reales')\nplt.ylabel('Predicciones')\nplt.title('Predicciones vs. Valores Reales')\nplt.grid()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-31T23:04:37.801458Z","iopub.execute_input":"2024-10-31T23:04:37.802210Z","iopub.status.idle":"2024-10-31T23:04:38.715050Z","shell.execute_reply.started":"2024-10-31T23:04:37.802170Z","shell.execute_reply":"2024-10-31T23:04:38.714328Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Hacer predicciones en el conjunto de prueba\nX_test_cleaned = test_cleaned.drop(columns=['id'])  # Eliminar 'id' para las predicciones\ny_pred_log = best_model.predict(X_test_cleaned)\n\n# Transformar las predicciones de vuelta a la escala original\ny_pred = np.exp(y_pred_log)\n\n# Crear un DataFrame para el archivo de submission\nsubmission = pd.DataFrame({\n    'id': test_cleaned['id'],\n    'bg+1:00': y_pred\n})\n\n# Guardar el DataFrame de submission a un archivo CSV\nsubmission.to_csv('D:\\\\Ale\\\\Competitions\\\\BrisT1D_Blood_Glucose\\\\Data\\\\submission.csv', index=False)\n\nprint(\"Archivo de submission creado exitosamente.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-31T23:04:38.716024Z","iopub.execute_input":"2024-10-31T23:04:38.716275Z","iopub.status.idle":"2024-10-31T23:04:38.805574Z","shell.execute_reply.started":"2024-10-31T23:04:38.716251Z","shell.execute_reply":"2024-10-31T23:04:38.804694Z"}},"outputs":[],"execution_count":null}]}