Curva AUC – ROC en Python

Para calcular y graficar la curva AUC-ROC en Python, generalmente se utiliza la biblioteca scikit-learn, que proporciona herramientas para trabajar con aprendizaje automático y evaluación de modelos. Aquí tienes un ejemplo de cómo calcular y graficar la curva AUC-ROC para un clasificador en Python:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc

# Datos de ejemplo para la curva ROC
y_true = np.array([0, 1, 0, 1, 1, 0, 1])
y_scores = np.array([0.1, 0.9, 0.3, 0.7, 0.8, 0.2, 0.6])

# Calcular la curva ROC
fpr, tpr, thresholds = roc_curve(y_true, y_scores)
roc_auc = auc(fpr, tpr)

# Graficar la curva ROC
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label='Curva ROC (área = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Tasa de Falsos Positivos')
plt.ylabel('Tasa de Verdaderos Positivos')
plt.title('Curva ROC')
plt.legend(loc="lower right")
plt.show()

En este ejemplo, estamos utilizando datos sintéticos generados con make_classification, pero puedes reemplazarlos con tus propios datos. También utilizamos una Regresión Logística como clasificador, pero puedes usar otros clasificadores según tus necesidades.

Curva Auc Roc en Python

La curva AUC-ROC representa la tasa de verdaderos positivos (True Positive Rate, TPR) frente a la tasa de falsos positivos (False Positive Rate, FPR) para diferentes umbrales de clasificación.

La línea punteada en la gráfica representa el rendimiento esperado al azar (un clasificador inútil), y el área bajo la curva (AUC) mide el rendimiento del clasificador. Un valor de AUC cercano a 1 indica un buen clasificador, mientras que un valor cercano a 0.5 indica un clasificador que es comparable a la clasificación aleatoria.


Ejemplo Curva AUC – ROC en Python

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import roc_curve, auc

# Cargar el dataset de Iris
data = load_iris()
X = data.data
y = data.target
y_binary = np.where(y == 2, 1, 0)

# Dividir el dataset en conjuntos de entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y_binary, test_size=0.3, random_state=42)

# Entrenar el clasificador SVM
classifier = SVC(probability=True, random_state=42)
classifier.fit(X_train, y_train)
y_scores = classifier.predict_proba(X_test)[:, 1]

# Calcular la curva ROC
fpr, tpr, thresholds = roc_curve(y_test, y_scores)
roc_auc = auc(fpr, tpr)

# Graficar la curva ROC
plt.figure()
plt.plot(fpr, tpr, color='blue', lw=2, label='Curva ROC (área = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='gray', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Tasa de Falsos Positivos')
plt.ylabel('Tasa de Verdaderos Positivos')
plt.title('Curva ROC (Clasificador SVM)')
plt.legend(loc="lower right")
plt.show()

Este ejemplo muestra cómo cargar el conjunto de datos Iris, entrenar un clasificador SVM, calcular la curva ROC y representarla gráficamente.


Probabilidades

Consideremos dos conjuntos de probabilidades generadas por modelos hipotéticos. En el primer conjunto, las probabilidades no son tan ‘seguras’ al predecir las dos clases; estas probabilidades tienden a estar cerca de 0.5, lo que indica una mayor incertidumbre en las predicciones. En el segundo conjunto, las probabilidades son más ‘seguras’ al predecir las dos clases, ya que tienden a estar cerca de los extremos 0 o 1. Esto sugiere que el segundo modelo tiene más confianza en sus predicciones.

Al evaluar estos modelos, podemos calcular la precisión y el AUC para cada uno. El AUC proporciona una medida cuantitativa de la capacidad de discriminación del modelo, teniendo en cuenta la capacidad del modelo para distinguir entre las clases. Luego, podemos visualizar las curvas ROC de ambos modelos para una comparación visual de su rendimiento en la tarea de clasificación.»

Este texto se adapta al contexto de tu ejemplo y explica cómo el AUC se relaciona con la confianza en los modelos de clasificación, utilizando conjuntos de probabilidades hipotéticos como referencia.

import numpy as np
from sklearn.metrics import accuracy_score, roc_auc_score, roc_curve
import matplotlib.pyplot as plt

# Generar datos hipotéticos
n = 10000
y = np.array([0] * n + [1] * n)

# Datos de probabilidad del modelo 1
y_prob_1 = np.array(
    np.random.uniform(0.1, 0.4, n//2).tolist() +
    np.random.uniform(0.3, 0.6, n).tolist() +
    np.random.uniform(0.5, 0.9, n//2).tolist()
)

# Datos de probabilidad del modelo 2
y_prob_2 = np.array(
    np.random.uniform(0.2, 0.5, n//2).tolist() +
    np.random.uniform(0.4, 0.7, n).tolist() +
    np.random.uniform(0.6, 0.95, n//2).tolist()
)

# Calcular la precisión y el AUC para ambos modelos
accuracy_1 = accuracy_score(y, y_prob_1 > 0.5)
accuracy_2 = accuracy_score(y, y_prob_2 > 0.5)
auc_1 = roc_auc_score(y, y_prob_1)
auc_2 = roc_auc_score(y, y_prob_2)

print("Precisión del modelo 1:", accuracy_1)
print("Precisión del modelo 2:", accuracy_2)
print("AUC del modelo 1:", auc_1)
print("AUC del modelo 2:", auc_2)

# Graficar la curva ROC del modelo 1
fpr_1, tpr_1, _ = roc_curve(y, y_prob_1)
plt.plot(fpr_1, tpr_1, 'Modelo 1')

# Graficar la curva ROC del modelo 2
fpr_2, tpr_2, _ = roc_curve(y, y_prob_2)
plt.plot(fpr_2, tpr_2, 'Modelo 2')

# Configurar la gráfica
plt.xlabel('Tasa de Falsos Positivos')
plt.ylabel('Tasa de Verdaderos Positivos')
plt.title('Curva ROC')
plt.legend(['Modelo 1', 'Modelo 2'])

# Mostrar la gráfica
plt.show()

Resultado:

visualizar precisión del modelo curva auc-roc