{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":84493,"databundleVersionId":9871156,"sourceType":"competition"},{"sourceId":203900450,"sourceType":"kernelVersion"}],"dockerImageVersionId":30823,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import time\nimport polars as pl\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport lightgbm as lgb\nimport xgboost as xgb\nfrom sklearn.metrics import mean_squared_error, r2_score\nimport cupy as cp\nimport pandas as pd\nimport joblib\n# Función para preprocesar los datos (ya la tienes en tu código original)\ndef preprocess_data(train_lazy, valid_lazy):\n    print(\"Procesando datos de entrenamiento y validación incluyendo lags preexistentes...\")\n    \n    # Cargar datos en formato DataFrame\n    train_filtered = train_lazy.collect()\n    valid_filtered = valid_lazy.collect()\n\n    # Ordenar por date_id, symbol_id y time_id\n    train_filtered = train_filtered.sort(['date_id', 'symbol_id', 'time_id'])\n    valid_filtered = valid_filtered.sort(['date_id', 'symbol_id', 'time_id'])\n\n    # Generar nombres de columnas de features de 'feature_00' a 'feature_78'\n    feature_columns = [f'feature_0{i}' if i < 10 else f'feature_{i}' for i in range(79)]\n\n    # Excluir las columnas especificadas\n    excluded_columns = ['feature_64', 'feature_51', 'feature_54', 'feature_40', 'feature_43', 'feature_63']\n    feature_columns = [col for col in feature_columns if col not in excluded_columns]\n\n    # Incluir las columnas de lags ya existentes\n    lag_columns = [f\"responder_{idx}_lag_1\" for idx in range(9)]\n    all_columns = feature_columns + ['symbol_id', 'time_id'] + lag_columns\n\n    # Crear las características (X), la variable objetivo (y) y los pesos para entrenamiento\n    X_train = train_filtered[all_columns].to_pandas()\n    y_train = train_filtered['responder_6'].to_pandas()\n    sample_weight_train = train_filtered['weight'].to_pandas()\n\n    # Crear las características (X), la variable objetivo (y) y los pesos para validación\n    X_valid = valid_filtered[all_columns].to_pandas()\n    y_valid = valid_filtered['responder_6'].to_pandas()\n    sample_weight_valid = valid_filtered['weight'].to_pandas()\n\n    print(\"Procesamiento completado.\")\n    return X_train, y_train, sample_weight_train, X_valid, y_valid, sample_weight_valid\n\n# Función para calcular R² ponderado (ya la tienes en tu código original)\ndef r2_val(y_true, y_pred, sample_weight):\n    r2 = 1 - np.average((y_pred - y_true) ** 2, weights=sample_weight) / \\\n         (np.average((y_true) ** 2, weights=sample_weight) + 1e-41)\n    return r2\n\n# Cargar datos de entrenamiento y validación\ntrain_lazy = pl.scan_parquet(\"/kaggle/input/js24-preprocessing-create-lags/training.parquet\")\nvalid_lazy = pl.scan_parquet(\"/kaggle/input/js24-preprocessing-create-lags/validation.parquet\")\n\n# Preprocesar los datos de entrenamiento y validación\nX_train, y_train, sample_weight_train, X_valid, y_valid, sample_weight_valid = preprocess_data(train_lazy, valid_lazy)\n\n# **Entrenamiento y predicciones de LGBM**\nlgb_params = {\n    \"boosting_type\": \"gbdt\",\n    \"metric\": 'rmse',\n    \"random_state\": 42,\n    \"max_depth\": 10,\n    \"learning_rate\": 0.05,\n    \"n_estimators\": 600,\n    \"colsample_bytree\": 0.8,\n    \"colsample_bynode\": 0.8,\n    \"verbose\": -1,\n    \"reg_alpha\": 0.1,\n    \"reg_lambda\": 1,\n    \"extra_trees\": True,\n    \"num_leaves\": 128,\n    \"max_bin\": 255,\n    \"device\": 'gpu',\n    \"gpu_use_dp\": True\n}\nmodel_lgbm = lgb.LGBMRegressor(**lgb_params)\nmodel_lgbm.fit(X_train, y_train, sample_weight=sample_weight_train)\n\n# Predicciones de LGBM\ny_pred_lgbm_train = model_lgbm.predict(X_train)\ny_pred_lgbm_valid = model_lgbm.predict(X_valid)\ny_pred_lgbm_valid = np.clip(y_pred_lgbm_valid, -5, 5)\n\n# **Entrenamiento y predicciones de XGBoost**\nxgb_params = {\n    \"n_estimators\": 1000,\n    \"max_depth\": 10,\n    \"learning_rate\": 0.01,\n    \"subsample\": 0.8,\n    \"random_state\": 42,\n    \"tree_method\": \"hist\",\n    \"device\": \"cuda\",\n    \"reg_alpha\": 0.1,\n    \"reg_lambda\": 1.0,\n    \"colsample_bytree\": 0.8,\n    \"colsample_bynode\": 0.8,\n    \"max_bin\": 255,\n    \"verbosity\": 0\n}\nmodel_xgb = xgb.XGBRegressor(**xgb_params)\nmodel_xgb.fit(X_train, y_train, sample_weight=sample_weight_train)\n\n# Predicciones de XGBoost\ny_pred_xgb_train = model_xgb.predict(X_train)\ny_pred_xgb_valid = model_xgb.predict(X_valid)\ny_pred_xgb_valid = np.clip(y_pred_xgb_valid, -5, 5)\n\n# **Ensamble ponderado**\n\n# Define los pesos para los modelos LGBM y XGBoost (ajustables)\nweight_lgbm = 0.5\nweight_xgb = 0.5\n\n# Cálculo de las predicciones ponderadas\ny_pred_ensemble_valid = (weight_lgbm * y_pred_lgbm_valid) + (weight_xgb * y_pred_xgb_valid)\n\n# **Evaluar el rendimiento del ensamble ponderado**\nmse_ensemble = mean_squared_error(y_valid, y_pred_ensemble_valid)\nr2_weighted_ensemble = r2_val(y_valid, y_pred_ensemble_valid, sample_weight_valid)\n\n# Mostrar resultados\nprint(f\"Error cuadrático medio (MSE) del ensamble: {mse_ensemble}\")\nprint(f\"R cuadrado ponderado (R²) del ensamble: {r2_weighted_ensemble}\")\n\n# **Visualización de las predicciones vs los valores reales**\nplt.figure(figsize=(12, 6))\nplt.scatter(range(len(y_valid)), y_valid, label='Valores reales', color='red', s=10)\nplt.scatter(range(len(y_valid)), y_pred_ensemble_valid, label='Predicciones del ensamble', color='blue', s=10)\nplt.xlabel('Índice de muestra')\nplt.ylabel('Valor')\nplt.title('Comparación entre valores reales y predicciones del ensamble')\nplt.legend()\nplt.grid(True)\nplt.show()\n\n\njoblib.dump(model_lgbm, 'model_lgb.pkl')\njoblib.dump(model_xgb, 'model_xgb.pkl')\nprint(\"Modelos guardados con éxito.\")\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null}]}