Este proyecto es una mejora del trabajo final de Talento Tech. El objetivo fue aplicar un proceso de machine learning completo sobre un problema de clasificación binaria: identificar registros asociados a incendios forestales a partir de información climática y geográfica de Estados Unidos.
El proyecto empezó con una comparación de modelos y terminó con la optimización de HistGradientBoosting. El resultado final logró detectar una mayor proporción de incendios, aunque la cantidad de falsas alarmas sigue siendo alta. Por eso, el trabajo debe entenderse como un proyecto de aprendizaje y no como un sistema listo para utilizarse en un contexto real.
Elegí este tema porque los incendios forestales son un problema real y porque el dataset permite trabajar con variables como temperatura, humedad, viento, precipitación e índices relacionados con el comportamiento del fuego.
El desafío principal apareció en la distribución de la variable objetivo. Solo alrededor del 5 % de los registros corresponde a incendios. En un caso así, un modelo puede obtener un accuracy alto simplemente prediciendo casi siempre la clase mayoritaria. Por ese motivo, durante el proyecto presté especial atención al recall, la precisión, F1, F2, AUC y Average Precision.
Se utilizó el US Wildfire Dataset (2014-2025), disponible en Kaggle.
| Característica | Descripción |
|---|---|
| Registros originales | 9.509.925 |
| Columnas originales | 19 |
| Variable objetivo | Wildfire, transformada a 1 y 0 |
| Clase positiva | Aproximadamente 5,3 % |
| Registros después de la limpieza | 9.470.280 |
| Variables predictoras finales | 15 |
El archivo original ocupa aproximadamente 1 GB y no se incluye en el repositorio. pipeline.ipynb lo descarga mediante KaggleHub y lo guarda dentro de data/.
El trabajo se divide en dos notebooks.
En pipeline.ipynb se realiza el proceso principal:
- carga y exploración del dataset;
- conversión de la fecha y de la variable objetivo;
- revisión de valores faltantes, valores extremos y registros anómalos;
- creación de la variable
mes; - análisis de correlaciones y eliminación de
petpor su alta redundancia conetr; - división estratificada en 70 % para entrenamiento y 30 % para prueba;
- construcción de pipelines con imputación, escalado y balanceo de clases;
- comparación de cuatro modelos de clasificación;
- exportación del dataset limpio y guardado del modelo baseline.
Los modelos comparados fueron:
- Regresión logística
- Árbol de decisión
- Random Forest
- HistGradientBoosting
En hgb_optimization.ipynb se continúa el trabajo con HistGradientBoosting:
- búsqueda reproducible de 20 configuraciones con
ParameterSampler; - comparación inicial sobre una muestra estratificada del conjunto de entrenamiento;
- validación cruzada de los candidatos más prometedores;
- generación de probabilidades out-of-fold;
- elección de una configuración y un umbral con una restricción mínima de recall;
- entrenamiento definitivo con todo el conjunto de entrenamiento;
- evaluación del modelo optimizado sobre el conjunto de prueba, que no participó en la búsqueda ni en la elección del umbral;
- guardado del pipeline junto con su umbral y sus variables predictoras.
Estos fueron los resultados obtenidos antes de optimizar HistGradientBoosting:
| Modelo | Accuracy | Precisión | Recall | F1 | AUC |
|---|---|---|---|---|---|
| Regresión logística | 55,31 % | 7,04 % | 61,03 % | 12,63 % | 0,6122 |
| Árbol de decisión | 60,55 % | 8,58 % | 66,89 % | 15,21 % | 0,6942 |
| Random Forest | 60,05 % | 8,43 % | 66,39 % | 14,96 % | 0,6876 |
| HistGradientBoosting | 60,85 % | 8,88 % | 69,07 % | 15,73 % | 0,7113 |
HistGradientBoosting obtuvo el mejor resultado general y también mantuvo el mayor recall promedio durante la validación cruzada. Por eso fue elegido para la segunda etapa.
La configuración ganadora utilizó un umbral de decisión de 0,4799. Este valor se definió antes de evaluar el modelo final sobre el conjunto de prueba.
| Métrica | HGB baseline | HGB optimizado |
|---|---|---|
| Accuracy | 60,85 % | 59,75 % |
| Balanced Accuracy | 64,74 % | 67,28 % |
| Precisión | 8,88 % | 9,32 % |
| Recall | 69,07 % | 75,70 % |
| F1 | 15,73 % | 16,60 % |
| F2 | 29,32 % | 31,22 % |
| AUC | 0,7113 | 0,7407 |
| Average Precision | 0,1281 | 0,1438 |
El objetivo de mantener un recall mínimo de 70 % se cumplió. El modelo final detectó aproximadamente 76 de cada 100 incendios del conjunto de prueba.
Sin embargo, la precisión fue de solo 9,32 %. Esto significa que una gran parte de las alertas positivas fueron falsas. La reducción del accuracy también es esperable porque el umbral elegido favorece la detección de incendios y clasifica más observaciones como positivas.
La optimización mejoró el modelo, pero no solucionó la falta de poder predictivo de las variables disponibles. El resultado es útil para estudiar el problema y entender los intercambios entre métricas, pero no sería suficiente para implementar un sistema de alertas.
Este proyecto me ayudó a entender mejor varios puntos que al principio solo conocía de forma teórica:
- El accuracy puede ser engañoso cuando las clases están muy desbalanceadas.
- Mejorar el recall suele aumentar la cantidad de falsos positivos.
- La validación cruzada y las predicciones out-of-fold ayudan a tomar decisiones sin ajustar todo sobre el conjunto de prueba.
- Un ajuste de hiperparámetros puede mejorar las métricas, pero no puede crear información que el dataset no contiene.
- Guardar el preprocesamiento y el modelo dentro del mismo pipeline facilita su reutilización.
También aprendí que un proyecto no termina cuando una métrica mejora. Es necesario interpretar los errores, reconocer las limitaciones y explicar con claridad qué puede y qué no puede hacer el modelo.
machine-learning-wildfires/
├── pipeline.ipynb # Análisis, limpieza y comparación de modelos
├── hgb_optimization.ipynb # Optimización y evaluación final de HGB
├── data/ # Datos descargados y procesados, no versionados
├── models/ # Modelos joblib generados, no versionados
├── results/ # Resultados CSV generados, no versionados
├── pyproject.toml # Dependencias y configuración del proyecto
├── poetry.lock # Versiones instaladas por Poetry
├── LICENSE
└── README.md
- Python 3.12
- pandas
- scikit-learn
- Matplotlib
- Seaborn
- Jupyter
- KaggleHub
- Poetry
git clone https://github.com/JackyDye/machine-learning-wildfires.git
cd machine-learning-wildfiresEl proyecto requiere Python 3.12 y Poetry.
poetry env use 3.12
poetry install --with devPrimero se debe ejecutar pipeline.ipynb, ya que genera el dataset limpio y el modelo baseline que utiliza el segundo notebook.
poetry run jupyter labDentro de Jupyter:
- abrir
pipeline.ipynby ejecutar todas las celdas; - abrir
hgb_optimization.ipynby ejecutar todas las celdas.
Los notebooks usan Path.cwd(), por lo que Jupyter debe iniciarse desde la raíz del repositorio. La primera ejecución puede tardar y consumir varios GB de memoria debido al tamaño del dataset.
- El dataset está muy desbalanceado y las variables tienen una relación débil con la clase positiva.
- La precisión final continúa siendo demasiado baja para un uso real.
- La división de los datos es aleatoria y estratificada. No se realizó una validación específica por período o región.
- La búsqueda de hiperparámetros se hizo sobre una muestra del entrenamiento para mantener un costo computacional razonable.
HistGradientBoosting fue el mejor de los modelos evaluados. Después de optimizar sus hiperparámetros y ajustar el umbral, el recall aumentó de 69,07 % a 75,70 % y también mejoraron AUC, Average Precision, F1 y F2.
Aun así, la precisión final de 9,32 % muestra que el modelo genera muchas falsas alarmas. La conclusión principal no es que se haya encontrado una solución para predecir incendios, sino que se logró construir, evaluar y mejorar un modelo de forma ordenada, sin ocultar sus limitaciones.
Para mí, el mayor valor del proyecto estuvo en recorrer el proceso completo y entender por qué una mejora numérica no siempre convierte a un modelo en una buena solución para el problema real.
El código se distribuye bajo la licencia MIT. El dataset pertenece a su fuente original y está sujeto a las condiciones indicadas en Kaggle.
Augusto Valles · JackyDye
GitHub · LinkedIn
Proyecto realizado como parte de mi formación en machine learning y análisis de datos.