tratamos con algoritmos de clasificación En el aprendizaje automático, como la regresión logística, los vecinos K-nears, los clasificadores de vectores de soporte, etc., no utilizamos métricas de evaluación como error absoluto medio (MAE), error medio cuadrado (MSE) o error cuadrático medio (RMSE).
En cambio, generamos una matriz de confusión, y basada en la matriz de confusión, un informe de clasificación.
En este blog, nuestro objetivo es comprender qué es una matriz de confusión, cómo calcular la precisión, la precisión, el recuerdo y la puntuación F1, y cómo seleccionar la métrica relevante basada en las características de los datos.
Para comprender la matriz de confusión y las métricas de clasificación, usemos el Conjunto de datos de cáncer de mama Wisconsin.
Este conjunto de datos consta de 569 filas, y cada fila proporciona información sobre diversas características de un tumor junto con su diagnóstico, ya sea maligno (canceroso) o benigno (no canceroso).
Ahora creemos un modelo de clasificación para estos datos para clasificar los tumores en función de sus características.
Ahora aplicamos regresión logística para capacitar a un modelo en este conjunto de datos.
Código:
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, classification_report
import seaborn as sns
import matplotlib.pyplot as plt
# Load the dataset
column_names = [
"id", "diagnosis", "radius_mean", "texture_mean", "perimeter_mean", "area_mean", "smoothness_mean",
"compactness_mean", "concavity_mean", "concave_points_mean", "symmetry_mean", "fractal_dimension_mean",
"radius_se", "texture_se", "perimeter_se", "area_se", "smoothness_se", "compactness_se", "concavity_se",
"concave_points_se", "symmetry_se", "fractal_dimension_se", "radius_worst", "texture_worst",
"perimeter_worst", "area_worst", "smoothness_worst", "compactness_worst", "concavity_worst",
"concave_points_worst", "symmetry_worst", "fractal_dimension_worst"
]
df = pd.read_csv("C:/wdbc.data", header=None, names=column_names)
# Drop ID column
df = df.drop(columns=["id"])
# Encode target: M=1 (malignant), B=0 (benign)
df["diagnosis"] = df["diagnosis"].map({"M": 1, "B": 0})
# Split features and target
X = df.drop(columns=["diagnosis"])
y = df["diagnosis"]
# Train-test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=42)
# Scale the features
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# Train logistic regression
model = LogisticRegression(max_iter=10000)
model.fit(X_train, y_train)
# Predict
y_pred = model.predict(X_test)
# Confusion Matrix and Classification Report
conf_matrix = confusion_matrix(y_test, y_pred, labels=[1, 0]) # 1 = Malignant, 0 = Benign
report = classification_report(y_test, y_pred, labels=[1, 0], target_names=["Malignant", "Benign"])
# Display results
print("Confusion Matrix:\n", conf_matrix)
print("\nClassification Report:\n", report)
# Plot Confusion Matrix
sns.heatmap(conf_matrix, annot=True, fmt="d", cmap="Purples", xticklabels=["Malignant", "Benign"], yticklabels=["Malignant", "Benign"])
plt.xlabel("Predicted")
plt.ylabel("Actual")
plt.title("Confusion Matrix")
plt.tight_layout()
plt.show()
Aquí, después de aplicar la regresión logística a los datos, generamos una matriz de confusión y un informe de clasificación para evaluar el rendimiento del modelo.
Primero entendamos la matriz de confusión
De la matriz de confusión anterior
’60’ representa el Tumores malignos predicho correctamentea los que nos referimos como “Verdaderos positivos”.
‘4’ representa el tumores benignos predichos incorrectamente que en realidad son tumores malignosa los que nos referimos como “Falsos negativos”.
‘1’ representa el tumores malignos predichos incorrectamente que en realidad son tumores benignosa los que nos referimos como “Falsos positivos”.
‘106’ representa el tumores benignos predichos correctamente, a los que nos referimos como “Verdaderos negativos”.
Ahora veamos qué podemos hacer con estos valores.
Para eso consideramos el informe de clasificación.
Del informe de clasificación anterior, podemos decir que
Para maligno:
– La precisión es 0.98, lo que significa que cuando el modelo predice el tumor como maligno, es correcto el 98% del tiempo.
– El recuerdo es 0.94, lo que significa que el modelo identificó correctamente el 94% de todos los tumores malignos.
-La puntuación F1 es 0.96, lo que equilibra tanto la precisión como la recuerdo.
Para benigno:
– La precisión es 0.96, lo que significa que cuando el modelo predice el tumor como benigno, es correcto el 96% del tiempo.
– El recuerdo es 0.99, lo que significa que el modelo identificó correctamente el 99% de todos los tumores benignos.
-La puntuación F1 es 0.98.
Desde el informe podemos observar que la precisión del modelo es del 97%.
También tenemos promedio macro y promedio ponderado, veamos cómo se calculan.
Promedio macro
El promedio de macro calcula el promedio de todas las métricas (precisión, retiro y puntaje F1) en ambas clases que dan el mismo peso a cada clase, independientemente de cuántas muestras contenga cada clase.
Usamos macro promedio, cuando queremos conocer el rendimiento del modelo en todas las clases, ignorando los desequilibrios de clases.
Para estos datos:
Promedio ponderado
El promedio ponderado también calcula el promedio de todas las métricas, pero le da más peso a la clase con más muestras.
En el código anterior, usamos test_size = 0.3lo que significa que reservamos un 30% para las pruebas, lo que significa que estamos usando 171 muestras de un datos de 569 muestras para un conjunto de pruebas.
La matriz de confusión y el informe de clasificación se basan en este conjunto de pruebas.
De 171 muestras de conjunto de pruebas, tenemos 64 tumores malignos y 107 tumores benignos.
Ahora veamos cómo se calcula este promedio ponderado para todas las métricas.
El promedio ponderado nos da una medida de rendimiento más realista cuando tenemos los conjuntos de datos desequilibrados de clase.
Ahora tenemos una idea de cada término en el informe de clasificación y también cómo calcular los promedios macro y ponderados.
Ahora veamos cuál es el uso de la matriz de confusión para generar un informe de clasificación.
En el informe de clasificación tenemos diferentes métricas como precisión, precisión, etc. y estas métricas se calculan utilizando los valores en la matriz de confusión.
De la matriz de confusión tenemos
Verdaderos positivos (TP) = 60
Falsos negativos (fn) = 4
Falsos positivos (fp) = 1
Verdadero negativo (TN) = 106
Ahora calculemos las métricas de clasificación utilizando estos valores.
Así es como calculamos las métricas de clasificación utilizando una matriz de confusión.
Pero, ¿por qué tenemos cuatro métricas de clasificación diferentes en lugar de una métrica como precisión? Es porque las diferentes métricas muestran diferentes fortalezas y debilidades del clasificador basadas en el contexto de los datos.
Ahora volvamos al conjunto de datos de cáncer de mama de Wisconsin que utilizamos aquí.
Cuando aplicamos un modelo de regresión logística a estos datos, obtuvimos una precisión del 97% que es alta, lo que puede hacernos pensar que el modelo es eficiente.
Pero consideremos otra métrica llamada ‘RetRark’, que es 0.94 para este modelo, lo que significa que de todos los tumores malignos que tenemos en el conjunto de pruebas, el modelo pudo identificar el 94% de ellos correctamente.
Aquí el modelo perdió el 6% de los casos malignos.
En escenarios del mundo real, principalmente aplicaciones de atención médica como la detección del cáncer, si perdemos un caso positivo, podría retrasar el diagnóstico y el tratamiento.
Con esto podemos entender que incluso si tenemos una precisión del 97%, debemos mirar más profundos según el contexto de datos considerando diferentes métricas.
Entonces, lo que podemos hacer ahora, si apuntamos a un valor de recuperación de 1.0, lo que significa que todos los tumores malignos se identifican correctamente, pero si empujamos el retiro a 1.0, entonces la precisión cae porque el modelo puede clasificar los tumores más benignos como malignos.
Cuando el modelo clasifica tumores más benignos como malignos, habría ansiedad innecesaria y puede requerir pruebas o tratamientos adicionales.
Aquí debemos apuntar a maximizar el ‘retiro’ manteniendo la ‘precisión’ razonablemente alta.
Podemos hacer esto cambiando los umbrales establecidos por los clasificadores para clasificar las muestras.
La mayoría de los clasificadores establecen el umbral en 0.5, y si lo cambiamos 0.3, estamos diciendo que incluso si tiene un 30% de confianza, clasifíquelo como maligno.
Ahora usemos un umbral personalizado de 0.3.
Código:
# Train logistic regression
model = LogisticRegression(max_iter=10000)
model.fit(X_train, y_train)
# Predict probabilities
y_probs = model.predict_proba(X_test)[:, 1]
# Apply custom threshold
threshold = 0.3
y_pred_custom = (y_probs >= threshold).astype(int)
# Classification Report
report = classification_report(y_test, y_pred_custom, target_names=["Benign", "Malignant"])
# Confusion Matrix
conf_matrix = confusion_matrix(y_test, y_pred_custom, labels=[1, 0])
# Plot Confusion Matrix
plt.figure(figsize=(6, 4))
sns.heatmap(
conf_matrix,
annot=True,
fmt="d",
cmap="Purples",
xticklabels=["Malignant", "Benign"],
yticklabels=["Malignant", "Benign"]
)
plt.xlabel("Predicted")
plt.ylabel("Actual")
plt.title("Confusion Matrix (Threshold = 0.3)")
plt.tight_layout()
plt.show()
Aquí aplicamos un umbral personalizado de 0.3 y generamos una matriz de confusión y un informe de clasificación.
Informe de clasificación:
Aquí, la precisión aumentó al 98% y el retiro de Malignant aumentó al 97% y la precisión siguió siendo la misma.
Anteriormente discutimos que podría haber una disminución en la precisión si intentamos maximizar el retiro, pero aquí la precisión sigue siendo la misma, esto depende de los datos (ya sea equilibrados o no), preprocesar pasos y ajustar el umbral.
Para conjuntos de datos médicos como este, la maximización del retiro a menudo se prefiere sobre precisión o precisión.
Cuando consideramos conjuntos de datos como la detección de spam o la detección de fraude, preferimos la precisión y lo mismo que en el método anterior, intentamos mejorar la precisión al ajustar el umbral de consecuencia y también al equilibrar la compensación entre precisión y recuerdo.
Usamos la puntuación F1 cuando los datos se desequilibran, y cuando preferimos precisión y recordamos dónde ni los falsos positivos ni los falsos negativos pueden ignorarse.
Fuente del conjunto de datos
Conjunto de datos de cáncer de mama de Wisconsin
Wolberg, W., Mangasarian, O., Street, N. y Street, W. (1993). Cáncer de mama Wisconsin (diagnóstico) [Dataset]. Repositorio de aprendizaje automático de UCI. https://doi.org/10.24432/c5dw2b.
Este conjunto de datos tiene licencia bajo un Creative Commons Attribution 4.0 International (CC por 4.0) Licencia y es de uso gratuito para fines comerciales o educativos siempre que se otorgue el crédito adecuado a la fuente original.
Aquí discutimos qué es una matriz de confusión y cómo se usa para calcular las diferentes métricas de clasificación como precisión, precisión, recuperación y puntaje F1.
También exploramos cuándo priorizar qué métrica de clasificación, utilizando el conjunto de datos de cáncer de Wisconsin como ejemplo, donde preferimos maximizar el recuerdo.
Espero que haya encontrado este blog útil para comprender la matriz de confusión y las métricas de clasificación con más claridad.
Gracias por leer.