{ "cells": [ { "cell_type": "markdown", "id": "1f487beb", "metadata": {}, "source": [ "# Pontificia Universidad Católica del Ecuador\n", "## Facultad de Ingeniería\n", "### Maestría en Sistemas de Información, mención Data Science\n", "### Examen Complexivo — Caso de Estudio 2: Aprendizaje Supervisado\n", "\n", "**Docente:** Charles Escobar\n", "**Estudiante:** Apellido, Nombre\n", "\n", "> Este es el **segundo caso de estudio** de la serie de titulación de la maestría (Caso 1: aprendizaje no supervisado; **Caso 2: aprendizaje supervisado — el presente documento**; Caso 3: caso integrador ante tribunal, combinando AS y ANS)." ] }, { "cell_type": "markdown", "id": "4be14335", "metadata": {}, "source": [ "### Enunciado de la actividad\n", "\n", "Con el siguiente dataset:\n", "\n", "https://www.seracademia.com/academia/Algerian_forest_fires_dataset_UPDATE.csv\n", "\n", "Y usando la metodología de ciencia de datos **CRISP-DM** elabore un script en python con tres modelos de aprendizaje de máquina incluyendo entre ellos una red neuronal.\n", "\n", "En la estructura solicitada, desarrolle en libreta cada uno de los modelos y como comentarios justifique la selección\n", "\n", "Muestre al final del script la comparativa de los tres modelos\n", "\n", "Referencia:\n", "\n", "https://www.seracademia.com/academia/Algerian_forest_fires_dataset_UPDATE.csv" ] }, { "cell_type": "markdown", "id": "bd6efc96", "metadata": {}, "source": [ "**Sobre el dataset:** contiene observaciones diarias de clima y de los componentes del *Fire Weather Index* (FWI) para dos regiones de Argelia (Bejaia y Sidi Bel-Abbès), entre junio y septiembre de 2012. La columna objetivo (`Classes`) indica si ese día hubo o no incendio.\n", "\n", "**Antes de empezar, dedique tiempo a investigar el dominio:** ¿qué es el *Canadian Forest Fire Weather Index (FWI) System*? ¿qué mide cada uno de sus componentes (`FFMC`, `DMC`, `DC`, `ISI`, `BUI`, `FWI`)? ¿cómo se relacionan entre sí y con las variables meteorológicas crudas (`Temperature`, `RH`, `Ws`, `Rain`)? Esta comprensión de dominio es indispensable para tomar buenas decisiones en las fases siguientes." ] }, { "cell_type": "markdown", "id": "7355f694", "metadata": {}, "source": [ "## 0. Entorno de trabajo\n", "\n", "Instale las librerías que necesite. Como mínimo requerirá `pandas`, `numpy`, `matplotlib` y `scikit-learn`; probablemente también `seaborn` para visualización.\n", "\n", "```bash\n", "pip install pandas numpy scikit-learn matplotlib seaborn\n", "```" ] }, { "cell_type": "code", "execution_count": null, "id": "a2c63f67", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "\n", "# Esta instrucción pudiera ser de utilidad\n", "# pd.options.display.max_rows = None\n", "\n", "# Agregue aquí las demás importaciones que vaya necesitando en cada fase\n", "# (scikit-learn, seaborn, etc.). Es buena práctica que cada import aparezca\n", "# cerca de donde se usa por primera vez, o todas juntas aquí: use el estilo\n", "# que prefiera, pero sea consistente.\n", "\n", "URL = 'https://www.seracademia.com/academia/Algerian_forest_fires_dataset_UPDATE.csv'" ] }, { "cell_type": "markdown", "id": "23a2d6c2", "metadata": {}, "source": [ "# Fase 1 (1 punto)\n" ] }, { "cell_type": "markdown", "id": "bb02e57b", "metadata": {}, "source": [ "**Guía para esta fase (Comprensión del negocio):**\n", "- ¿Qué problema de negocio o de política pública se resuelve al anticipar el riesgo de incendio forestal? ¿Quién tomaría decisiones con este modelo y qué decisión sería?\n", "- Formule la pregunta de negocio como una pregunta de aprendizaje supervisado: ¿qué se predice (`target`) y a partir de qué información se predice?\n", "- **Reflexione críticamente sobre las variables disponibles:** el dataset trae tanto variables meteorológicas crudas como los índices del sistema FWI. ¿Todas las columnas disponibles deberían usarse como variables predictoras, o alguna de ellas podría estar relacionada de forma casi directa con la definición de la etiqueta `Classes`? Investigue cómo se construye el sistema FWI antes de responder. Esta decisión debe justificarse aquí y aplicarse en la Fase 3.\n", "- ¿Qué tipo de error es más costoso en este problema: un falso positivo (falsa alarma) o un falso negativo (no anticipar un incendio real)? ¿Cómo debería influir esto en qué métrica de evaluación prioriza en la Fase 5?\n", "- Defina qué modelos comparará (deben ser tres, y uno debe ser una red neuronal) y una hipótesis inicial de por qué podrían comportarse distinto entre sí." ] }, { "cell_type": "markdown", "id": "4a852383", "metadata": {}, "source": [ "### Respuesta\n", "....." ] }, { "cell_type": "markdown", "id": "38bc5b60", "metadata": {}, "source": [ "# Fase 2 (1 punto)\n" ] }, { "cell_type": "markdown", "id": "b5881337", "metadata": {}, "source": [ "**Guía para esta fase (Comprensión de los datos):**\n", "- Describa el origen, tamaño y granularidad del dataset (¿cuántas filas, cuántas regiones, qué periodo cubre?).\n", "- Documente cada variable: nombre, tipo de dato esperado, unidad y significado.\n", "- **Antes de cargar el archivo con `pd.read_csv` de forma directa, inspecciónelo como texto plano** (por ejemplo, abriéndolo con Python o un editor de texto). Verifique: ¿es una sola tabla o contiene más de una? ¿el encabezado de columnas aparece una sola vez? ¿hay líneas que no corresponden a datos (títulos, separadores, líneas en blanco)? Documente lo que encuentre.\n", "- Revise la calidad de los datos: valores nulos, tipos de dato incorrectos, espacios en blanco parásitos en nombres de columnas o en valores de texto, duplicados, filas con formato inconsistente (por ejemplo, un número de columnas distinto al resto).\n", "- Revise el balance de la variable objetivo `Classes` y, si aplica, el balance por región.\n", "- Explore relaciones entre variables (correlaciones, distribuciones por clase) para anticipar qué variables podrían ser más informativas — y para confirmar o descartar la sospecha sobre fuga de información planteada en la Fase 1." ] }, { "cell_type": "markdown", "id": "715e9a90", "metadata": {}, "source": [ "### Respuesta:\n", "......" ] }, { "cell_type": "markdown", "id": "0664ed30", "metadata": {}, "source": [ "# Fase 3 (2 puntos)\n" ] }, { "cell_type": "markdown", "id": "2497ee44", "metadata": {}, "source": [ "**Guía para esta fase (Preparación de los datos):** esta es la fase con más peso (2 puntos) porque de ella depende la validez de todo lo que sigue. Se espera que incluya, con código y explicación:\n", "\n", "1. **Carga y limpieza estructural** del archivo (resolver lo que haya encontrado en la Fase 2: líneas que no son datos, encabezados duplicados, texto con espacios parásitos, filas corruptas, etc.). Escriba una función reutilizable en lugar de limpiar \"a mano\".\n", "2. **Tipado correcto** de cada columna y normalización de las categorías de texto (por ejemplo, `Classes`).\n", "3. **Ingeniería de variables** necesaria: por ejemplo, ¿cómo identificaría a qué región pertenece cada fila si esa información no viene en una columna? ¿qué columnas no aportan información (por ser constantes o irrelevantes) y deberían descartarse?\n", "4. **Verificación de calidad** tras la limpieza (nulos, duplicados, rangos de valores).\n", "5. **Análisis exploratorio** (gráficos de distribución, boxplots por clase, matriz de correlación).\n", "6. **Decisión final y justificada del conjunto de variables predictoras** que entrará a los modelos, retomando la reflexión de la Fase 1 sobre fuga de información. Explique con evidencia (no solo intuición) por qué incluye o excluye cada grupo de variables.\n", "7. **Partición train/test** (justifique la proporción y si corresponde estratificar por la clase) y **escalado** de variables si los modelos que eligió lo requieren (recuerde ajustar el escalador solo con el conjunto de entrenamiento)." ] }, { "cell_type": "markdown", "id": "b23752d0", "metadata": {}, "source": [ "### Respuesta:\n", "......\n" ] }, { "cell_type": "code", "execution_count": null, "id": "dc7632fd", "metadata": {}, "outputs": [], "source": [ "# Inserte aquí el código de la fase 3\n", "# 3.1 Carga y limpieza estructural del archivo" ] }, { "cell_type": "code", "execution_count": null, "id": "958ecbd2", "metadata": {}, "outputs": [], "source": [ "# 3.2 Tipado, normalización e ingeniería de variables" ] }, { "cell_type": "code", "execution_count": null, "id": "4b292de4", "metadata": {}, "outputs": [], "source": [ "# 3.3 Verificación de calidad de datos" ] }, { "cell_type": "code", "execution_count": null, "id": "47423f80", "metadata": {}, "outputs": [], "source": [ "# 3.4 Análisis exploratorio (EDA)" ] }, { "cell_type": "code", "execution_count": null, "id": "4ccf8487", "metadata": {}, "outputs": [], "source": [ "# 3.5 Definición del conjunto de variables predictoras (justifique en la celda de Markdown de arriba)" ] }, { "cell_type": "code", "execution_count": null, "id": "bacce2b7", "metadata": {}, "outputs": [], "source": [ "# 3.6 Partición train/test y escalado" ] }, { "cell_type": "markdown", "id": "88341754", "metadata": {}, "source": [ "# Fase 4 (2 puntos)\n" ] }, { "cell_type": "markdown", "id": "8bea0af5", "metadata": {}, "source": [ "**Guía para esta fase (Modelado):**\n", "- Entrene **tres modelos de aprendizaje supervisado**, uno de ellos obligatoriamente una **red neuronal** (por ejemplo, `MLPClassifier` de scikit-learn, o una red construida con TensorFlow/Keras o PyTorch). Para los otros dos, elija modelos que tengan sentido comparar entre sí — por ejemplo, uno lineal/interpretable (Regresión Logística) y uno no lineal basado en árboles (Random Forest, Gradient Boosting) o de otra familia (SVM, KNN).\n", "- **Justifique con comentarios en el código** (tal como pide el enunciado) por qué eligió cada modelo y cada configuración de hiperparámetros relevante — no basta con instanciar el modelo con los valores por defecto sin explicar.\n", "- Si ajusta hiperparámetros, hágalo con validación cruzada sobre el conjunto de entrenamiento, nunca mirando el conjunto de prueba.\n", "- Entrene los tres modelos sobre el **mismo conjunto de variables** definido en la Fase 3, para que la comparación de la Fase 5 sea justa." ] }, { "cell_type": "code", "execution_count": null, "id": "01dbf7e2", "metadata": {}, "outputs": [], "source": [ "# Inserte aquí el código de la fase 4\n", "# Modelo 1: (nombre y breve justificación en comentario)" ] }, { "cell_type": "code", "execution_count": null, "id": "232f4460", "metadata": {}, "outputs": [], "source": [ "# Modelo 2: (nombre y breve justificación en comentario)" ] }, { "cell_type": "code", "execution_count": null, "id": "9891c72e", "metadata": {}, "outputs": [], "source": [ "# Modelo 3: Red neuronal (nombre/arquitectura y breve justificación en comentario)" ] }, { "cell_type": "markdown", "id": "24d0f10d", "metadata": {}, "source": [ "# Fase 5 (1 punto)\n" ] }, { "cell_type": "markdown", "id": "5e4029d7", "metadata": {}, "source": [ "**Guía para esta fase (Evaluación):**\n", "- Calcule, para los tres modelos, un conjunto de métricas apropiado para clasificación (por ejemplo: accuracy, precisión, recall, F1, ROC-AUC) sobre el conjunto de prueba. Recuerde la reflexión de la Fase 1 sobre qué tipo de error es más costoso: ¿qué métrica debería pesar más en su decisión final?\n", "- Presente una **tabla comparativa** de los tres modelos (obligatoria según el enunciado — \"muestre al final del script la comparativa de los tres modelos\").\n", "- Complemente con matrices de confusión y, si aplica, curvas ROC.\n", "- Evalúe la **estabilidad** de cada modelo (por ejemplo, con validación cruzada), no solo su desempeño en una única partición de prueba.\n", "- Compare también el **costo computacional** de cada modelo (tiempo de entrenamiento, complejidad), insumo para las conclusiones." ] }, { "cell_type": "markdown", "id": "700b599c", "metadata": {}, "source": [ "### Respuesta:\n", "......" ] }, { "cell_type": "code", "execution_count": null, "id": "0caa2bf2", "metadata": {}, "outputs": [], "source": [ "# Inserte aquí el código de la fase 5\n", "# Tabla comparativa de métricas" ] }, { "cell_type": "code", "execution_count": null, "id": "37a0551e", "metadata": {}, "outputs": [], "source": [ "# Matrices de confusión / curvas ROC" ] }, { "cell_type": "code", "execution_count": null, "id": "edd8aba4", "metadata": {}, "outputs": [], "source": [ "# Estabilidad (validación cruzada) y costo computacional" ] }, { "cell_type": "markdown", "id": "651177b1", "metadata": {}, "source": [ "## Fase 6: (N/A)" ] }, { "cell_type": "markdown", "id": "6cd42f62", "metadata": {}, "source": [ "## Conclusiones (3 Puntos)\n", "* Detalle 4 conclusiones\n", " * Una de ellas respecto al procesamiento incial de la data\n", " * Otra respecto al modelo que mejor se ajuste a la data\n", " * Otra respecto a que modelo se ajustaría mejor considerando costo beneficio con el consumo de recursos\n", " * Una cuarta conclusión libre: por ejemplo, alguna lección metodológica relevante que haya encontrado en el camino (calidad de datos, riesgo de fuga de información, limitaciones del tamaño del dataset, etc.)" ] }, { "cell_type": "markdown", "id": "192eedb4", "metadata": {}, "source": [ "# Rúbrica\n", "| Descripción | No resuelve | Resuelva parcialmente | Totalmente |\n", "| :--| :-:| :-:| :-:|\n", "| Conoce como aplicar las fases del modelo CRISP-DM | 0 | 1 | 2 |\n", "| Elige apropiadamente los modelos | 0 | 1 | 2 |\n", "| Evalúa apropiadamente los modelos | 0 | 1 | 2 |\n", "| Conclusiones | 0 | 2 | 4 |\n", "||Total|5 puntos|10 puntos|" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.2" } }, "nbformat": 4, "nbformat_minor": 5 }