Skip to content

About

Clasificación de incendios forestales con Python y scikit-learn. Comparación de modelos y optimización de HistGradientBoosting sobre datos desbalanceados.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

🔥 Predicción de incendios forestales en EE.UU.

Python scikit-learn Jupyter Poetry License

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.

Introducción

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.

Dataset

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/.

Desarrollo del proyecto

El trabajo se divide en dos notebooks.

1. Análisis y comparación de modelos

En pipeline.ipynb se realiza el proceso principal:

  1. carga y exploración del dataset;
  2. conversión de la fecha y de la variable objetivo;
  3. revisión de valores faltantes, valores extremos y registros anómalos;
  4. creación de la variable mes;
  5. análisis de correlaciones y eliminación de pet por su alta redundancia con etr;
  6. división estratificada en 70 % para entrenamiento y 30 % para prueba;
  7. construcción de pipelines con imputación, escalado y balanceo de clases;
  8. comparación de cuatro modelos de clasificación;
  9. 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

2. Optimización del modelo elegido

En hgb_optimization.ipynb se continúa el trabajo con HistGradientBoosting:

  1. búsqueda reproducible de 20 configuraciones con ParameterSampler;
  2. comparación inicial sobre una muestra estratificada del conjunto de entrenamiento;
  3. validación cruzada de los candidatos más prometedores;
  4. generación de probabilidades out-of-fold;
  5. elección de una configuración y un umbral con una restricción mínima de recall;
  6. entrenamiento definitivo con todo el conjunto de entrenamiento;
  7. evaluación del modelo optimizado sobre el conjunto de prueba, que no participó en la búsqueda ni en la elección del umbral;
  8. guardado del pipeline junto con su umbral y sus variables predictoras.

Comparación inicial

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.

Resultado final

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.

Lo que aprendí

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.

Estructura del repositorio

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

Tecnologías utilizadas

  • Python 3.12
  • pandas
  • scikit-learn
  • Matplotlib
  • Seaborn
  • Jupyter
  • KaggleHub
  • Poetry

Instalación y ejecución

1. Clonar el repositorio

git clone https://github.com/JackyDye/machine-learning-wildfires.git
cd machine-learning-wildfires

2. Instalar las dependencias

El proyecto requiere Python 3.12 y Poetry.

poetry env use 3.12
poetry install --with dev

3. Ejecutar los notebooks

Primero se debe ejecutar pipeline.ipynb, ya que genera el dataset limpio y el modelo baseline que utiliza el segundo notebook.

poetry run jupyter lab

Dentro de Jupyter:

  1. abrir pipeline.ipynb y ejecutar todas las celdas;
  2. abrir hgb_optimization.ipynb y 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.

Limitaciones

  • 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.

Conclusión

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.

Licencia

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.

Autor

Augusto Valles · JackyDye
GitHub · LinkedIn

Proyecto realizado como parte de mi formación en machine learning y análisis de datos.

About

Clasificación de incendios forestales con Python y scikit-learn. Comparación de modelos y optimización de HistGradientBoosting sobre datos desbalanceados.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages