Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
0
respuestas

Desafío: hora de la práctica

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import (accuracy_score, precision_score, recall_score, f1_score,
classification_report, RocCurveDisplay, PrecisionRecallDisplay, auc, roc_curve)
import matplotlib.pyplot as plt

--- Pasos Previos: Carga, División y Entrenamiento de los Modelos ---

Cargar el dataset

df = pd.read_csv('diabetes.csv')

Separar en variables explicativas (X) y variable objetivo (y)

X = df.drop('diabetes', axis=1)
y = df['diabetes']

División en Entrenamiento, Validación y Prueba (misma división que en la clase 1)

X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size=0.05, random_state=42, stratify=y)
X_train, X_val, y_train, y_val = train_test_split(X_train_val, y_train_val, test_size=0.25, random_state=42, stratify=y_train_val)

Entrenar los dos modelos de la clase anterior

Modelo 1: Árbol de Decisión

dt_modelo = DecisionTreeClassifier(max_depth=3, random_state=42)
dt_modelo.fit(X_train, y_train)
y_pred_dt = dt_modelo.predict(X_val)

Modelo 2: Bosque Aleatorio (Random Forest)

rf_modelo = RandomForestClassifier(max_depth=2, random_state=42)
rf_modelo.fit(X_train, y_train)
y_pred_rf = rf_modelo.predict(X_val)

--- 1. Extracción de Métricas de Clasificación ---

print("--- 1. Métricas de Clasificación (sobre datos de validación) ---")

Métricas para el Árbol de Decisión

precision_dt = precision_score(y_val, y_pred_dt)
recall_dt = recall_score(y_val, y_pred_dt)
f1_dt = f1_score(y_val, y_pred_dt)

Métricas para el Random Forest

precision_rf = precision_score(y_val, y_pred_rf)
recall_rf = recall_score(y_val, y_pred_rf)
f1_rf = f1_score(y_val, y_pred_rf)

Crear un DataFrame para comparar

metrics_df = pd.DataFrame({
'Métrica': ['Precisión', 'Recall', 'F1-Score'],
'Árbol de Decisión': [precision_dt, recall_dt, f1_dt],
'Random Forest': [precision_rf, recall_rf, f1_rf]
})

print(metrics_df.round(4))
print("\n" + "="*50 + "\n")

--- 4. Generación del Informe de Clasificación ---

(Se adelanta el paso 4 por ser un resumen de las métricas del paso 1)

print("--- 4. Informe de Clasificación - Árbol de Decisión ---")
print(classification_report(y_val, y_pred_dt, target_names=['No Diabetes', 'Diabetes']))
print("\n" + "="*50 + "\n")

print("--- 4. Informe de Clasificación - Random Forest ---")
print(classification_report(y_val, y_pred_rf, target_names=['No Diabetes', 'Diabetes']))
print("\n" + "="*50 + "\n")

--- 2. Curva ROC y Métrica AUC ---

print("--- 2. Generando Curva ROC ---")
fig, ax = plt.subplots(figsize=(8, 6))

Curva para el Árbol de Decisión

RocCurveDisplay.from_estimator(dt_modelo, X_val, y_val, name='Árbol de Decisión', ax=ax)

Curva para el Random Forest

RocCurveDisplay.from_estimator(rf_modelo, X_val, y_val, name='Random Forest', ax=ax)

ax.set_title('Curva ROC para ambos modelos')
plt.savefig('roc_curve_comparison.png')
plt.show()
print("\n" + "="*50 + "\n")

--- 3. Curva de Precisión x Recall y Métrica AP ---

print("--- 3. Generando Curva Precisión vs. Recall ---")
fig, ax = plt.subplots(figsize=(8, 6))

Curva para el Árbol de Decisión

PrecisionRecallDisplay.from_estimator(dt_modelo, X_val, y_val, name='Árbol de Decisión', ax=ax)

Curva para el Random Forest

PrecisionRecallDisplay.from_estimator(rf_modelo, X_val, y_val, name='Random Forest', ax=ax)

ax.set_title('Curva Precisión vs. Recall para ambos modelos')
plt.savefig('precision_recall_curve_comparison.png')
plt.show()