Matriz de Confusión
Desliza para mostrar el menú
Al realizar una predicción para un problema de clasificación binaria, solo existen cuatro posibles resultados:
En la imagen anterior, los valores reales (etiquetas verdaderas) están ordenados de arriba hacia abajo en orden descendente, mientras que los valores predichos están ordenados de izquierda a derecha en orden ascendente. Este es el diseño predeterminado utilizado por scikit-learn al mostrar matrices de confusión.
Diferentes bibliotecas o visualizaciones pueden utilizar una disposición diferente; por ejemplo, colocar los valores reales en el eje x y los valores predichos en el eje y. Sin embargo, la única diferencia es la disposición; los valores en la matriz permanecen iguales.
Estos resultados se denominan verdadero positivo (TP), verdadero negativo (TN), falso positivo (FP) y falso negativo (FN). "verdadero" o "falso" indica si la predicción es correcta, mientras que "positivo" o "negativo" se refiere a si la clase predicha es 1 o 0.
Esto significa que existen dos tipos de errores que se pueden cometer: falsos positivos y falsos negativos. Una predicción de falso positivo también se conoce como error de tipo 1, mientras que una predicción de falso negativo se denomina error de tipo 2.
Matriz de confusión
La primera forma de analizar el rendimiento del modelo es organizar las predicciones en una matriz de confusión como esta:
Puedes construir una matriz de confusión en Python utilizando la función confusion_matrix() de sklearn:
from sklearn.metrics import confusion_matrix
conf_matrix = confusion_matrix(y_true, y_pred)
Para una mejor visualización, puedes usar la función heatmap() de seaborn:
sns.heatmap(conf_matrix)
Ejemplo de cálculo de la matriz de confusión para una predicción de Random Forest en el conjunto de datos Titanic:
12345678910111213141516import pandas as pd import seaborn as sns from sklearn.metrics import confusion_matrix from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split # Read the data and assign the variables df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/titanic.csv') X, y = df.drop('Survived', axis=1), df['Survived'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1) # Build and train a Random Forest and predict target for a test set random_forest = RandomForestClassifier().fit(X_train, y_train) y_pred = random_forest.predict(X_test) # Build a confusion matrix conf_matrix = confusion_matrix(y_test, y_pred) sns.heatmap(conf_matrix, annot=True);
También es posible graficar los porcentajes en lugar del recuento de instancias utilizando el parámetro normalize:
conf_matrix = confusion_matrix(y_true, y_pred, normalize='all')
12345678910111213141516import pandas as pd import seaborn as sns from sklearn.metrics import confusion_matrix from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split # Read the data and assign the variables df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/titanic.csv') X, y = df.drop('Survived', axis=1), df['Survived'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1) # Build and train a Random Forest and predict target for a test set random_forest = RandomForestClassifier().fit(X_train, y_train) y_pred = random_forest.predict(X_test) # Build a confusion matrix conf_matrix = confusion_matrix(y_test, y_pred, normalize='all') sns.heatmap(conf_matrix, annot=True);
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla