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()