La matriz de confusión es una forma de tabular el número de clasificaciones erróneas, es decir, el número de clases predichas que terminaron en una casilla de clasificación errónea basada en las clases verdaderas.
Aunque sklearn.metrics.confusion_matrix proporciona una matriz numérica, me parece más útil generar un "informe" utilizando lo siguiente:
import pandas as pd
y_true = pd.Series([2, 0, 2, 2, 0, 1, 1, 2, 2, 0, 1, 2])
y_pred = pd.Series([0, 0, 2, 1, 0, 2, 1, 0, 2, 0, 2, 2])
pd.crosstab(y_true, y_pred, rownames=['True'], colnames=['Predicted'], margins=True)
lo que resulta en:
Predicted 0 1 2 All
True
0 3 0 0 3
1 0 1 2 3
2 2 1 3 6
All 5 2 5 12
Esto nos permite ver que:
- Los elementos diagonales muestran el número de clasificaciones correctas para cada clase: 3, 1 y 3 para las clases 0, 1 y 2.
- Los elementos fuera de diagonal proporcionan las clasificaciones erróneas: por ejemplo, 2 de la clase 2 fueron clasificados erróneamente como 0, ninguno de la clase 0 fue clasificado erróneamente como 2, etc.
- El número total de clasificaciones para cada clase en ambos
y_true
y y_pred
de los subtotales "Todos"
Este método también funciona para las etiquetas de texto, y para un gran número de muestras en el conjunto de datos puede ampliarse para proporcionar informes de porcentaje.
import numpy as np
import pandas as pd
# create some data
lookup = {0: 'biscuit', 1:'candy', 2:'chocolate', 3:'praline', 4:'cake', 5:'shortbread'}
y_true = pd.Series([lookup[_] for _ in np.random.random_integers(0, 5, size=100)])
y_pred = pd.Series([lookup[_] for _ in np.random.random_integers(0, 5, size=100)])
pd.crosstab(y_true, y_pred, rownames=['True'], colnames=['Predicted']).apply(lambda r: 100.0 * r/r.sum())
La salida entonces es:
Predicted biscuit cake candy chocolate praline shortbread
True
biscuit 23.529412 10 23.076923 13.333333 15.384615 9.090909
cake 17.647059 20 0.000000 26.666667 15.384615 18.181818
candy 11.764706 20 23.076923 13.333333 23.076923 31.818182
chocolate 11.764706 5 15.384615 6.666667 15.384615 13.636364
praline 17.647059 10 30.769231 20.000000 0.000000 13.636364
shortbread 17.647059 35 7.692308 20.000000 30.769231 13.636364
donde las cifras representan ahora el porcentaje (en lugar del número de casos) de los resultados que fueron clasificados.
Aunque hay que tener en cuenta que el sklearn.metrics.confusion_matrix
La salida se puede visualizar directamente con:
import matplotlib.pyplot as plt
conf = sklearn.metrics.confusion_matrix(y_true, y_pred)
plt.imshow(conf, cmap='binary', interpolation='None')
plt.show()
1 votos
Inicialmente olvídate de sklearn, eso es una pista falsa. El origen de tu malentendido parece más fundamental. Echa un vistazo aquí: es.wikipedia.org/wiki/Matriz de confusión . Concéntrese en la narración del ejemplo 3*3 en la página de la wikipedia. Eso probablemente resolverá lo que sea su confusión.
0 votos
Un hilo relevante: stats.stackexchange.com/a/340079/121522