Construir un pipeline completo donde un agente de Aprendizaje por Refuerzo (Q-learning) calibre año tras año un modelo XGBoost para predecir salary_in_usd, aplicando este modelo sobre una hoja llamada “Pronosticos” de un archivo Excel base.
- Python 3.10
- XGBoost
- scikit-learn
- Gymnasium
- Pandas, NumPy
- Matplotlib
Prueba_Tecnica_Bogota/
├── Data/ # Dataset original Excel
├── Notebooks/ # Exploración y limpieza
├── Outputs/ # Mapeos generados manualmente
├── src/
│ ├── agents/ # Agente RL
│ ├── envs/ # Entorno Gym
│ ├── scoring/ # Evaluación final
│ ├── training/ # Entrenamiento RL
│ ├── utils/ # Preprocesamiento y logger
│ └── config.py # Parámetros y rutas globales
└── src/artifacts/ # Resultados y artefactos generados
| Archivo | Qué hace |
|---|---|
| 01_exploracion_datos.ipynb | Analiza columnas, outliers, tipos de datos y muestra gráficas descriptivas. |
| 02_preprocesamiento.ipynb | Agrupa categorías de columnas (job_title, company_location, etc.) y exporta mapeos CSV a Outputs/. |
Contiene toda la configuración global del proyecto:
DATASET_PATH,PRONOS_SRC: rutas base de datosYEARS: años usados como estadosXGB_GRID: rejilla de hiperparámetros para XGBoostQ_PARAMS: parámetros del agente Q-learning (epsilon,alpha,gamma, etc.)ARTIFACT_DIR: dónde se guarda todo
Define el agente Q-learning:
- Tabla Q (
self.Q) - Política
epsilon-greedyconepsilon_decay - Método
update()para actualizar los valores de Q - Método
decay_epsilon()para reducir la exploración con el tiempo
Define el entorno Gym personalizado:
- Cada
step()corresponde a un año (work_year) - Cada acción es un conjunto de hiperparámetros de XGBoost
- Se entrena el modelo y se calcula RMSE como recompensa
- Solo si
update_pronosticos=True, predice sobre “Pronosticos”
- Crea el entorno y el agente
- Ejecuta múltiples episodios de entrenamiento
- Registra las decisiones y recompensa en
training_log.csv - Guarda la Q-table aprendida (
q_table.npy)
- Script principal: ejecuta
Trainer.train()y luego elscoring final
- Carga la Q-table final
- Para cada año, reentrena el mejor modelo encontrado
- Predice los salarios para ese año en la hoja “Pronosticos”
- Guarda:
pronosticos.xlsxrmse_por_anio.csv- Modelos:
best_xgb_<year>.joblib - Gráficas:
plots/convergence_rmse.png,cumulative_reward.png
- Aplica mapeos de clases (
Outputs/) y OneHotEncoding - Maneja categorías desconocidas con
Other_<col> - Se guarda en
feature_pipeline.joblib
- Logger central para dejar registro de eventos (
train.log)
python -m src.training.run_trainingEste único comando hace:
- Entrenamiento del agente RL
- Generación de:
q_table.npytraining_log.csvpronosticos.xlsx←⚠️ predicción final actualizadarmse_por_anio.csv- Gráficas en
src/artifacts/plots/
| Archivo | Qué contiene |
|---|---|
pronosticos.xlsx |
Predicciones del salario salary_in_usd hechas con el mejor modelo para cada año |
rmse_por_anio.csv |
Error (RMSE) final por año |
convergence_rmse.png |
Gráfico de mejora de RMSE por año |
cumulative_reward.png |
Recompensa acumulada por episodio |
- Carpeta:
src/artifacts/ - Nombre del archivo:
pronosticos.xlsx - Pestaña interna:
Pronosticos - Columna con los valores predichos:
salary_in_usd
Al ejecutar:
python -m src.training.run_training
## ✅ Validaciones clave
- Cada predicción usa **solo datos históricos previos** al año objetivo.
- Las categorías desconocidas en el set *Pronosticos* se agrupan como `Other_<col>`.
- El pipeline puede reiniciarse en cualquier momento (artifacts se regeneran).
---