Luego de tanto trabajar pudimos dar con la contestación de este dilema que muchos de nuestros lectores de este sitio web tienen. Si tienes algo más que aportar puedes compartir tu información.
Solución:
Suponer que
>>> y_true = [0, 0, 1, 1, 2, 0, 1]
>>> y_pred = [0, 1, 0, 1, 2, 2, 1]
>>> C = confusion_matrix(y_true, y_pred)
>>> C
array([[1, 1, 1],
[1, 2, 0],
[0, 0, 1]])
Luego, para saber cuántas muestras por clase han recibido su etiqueta correcta, necesita
>>> C / C.astype(np.float).sum(axis=1)
array([[ 0.33333333, 0.33333333, 1. ],
[ 0.33333333, 0.66666667, 0. ],
[ 0. , 0. , 1. ]])
La diagonal contiene los valores requeridos. Otra forma de calcularlos es darse cuenta de que lo que está calculando es el recuerdo por clase:
>>> from sklearn.metrics import precision_recall_fscore_support
>>> _, recall, _, _ = precision_recall_fscore_support(y_true, y_pred)
>>> recall
array([ 0.33333333, 0.66666667, 1. ])
Del mismo modo, si divides por la suma de axis=0
obtienes la precisión (fracción de clase-k
predicciones que tienen la etiqueta de verdad básica k
):
>>> C / C.astype(np.float).sum(axis=0)
array([[ 0.5 , 0.33333333, 0.5 ],
[ 0.5 , 0.66666667, 0. ],
[ 0. , 0. , 0.5 ]])
>>> prec, _, _, _ = precision_recall_fscore_support(y_true, y_pred)
>>> prec
array([ 0.5 , 0.66666667, 0.5 ])
De la documentación de sklearn (ejemplo de trama)
cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
donde cm es la matriz de confusión proporcionada por sklearn.
asumo que M[i,j]
representa Element of real class i was classified as j
. Si es al revés, necesitará transponer todo lo que digo. También voy a usar la siguiente matriz para ejemplos concretos:
1 2 3
4 5 6
7 8 9
Hay esencialmente dos cosas que puedes hacer:
Encontrar cómo se ha clasificado cada clase
Lo primero que te puedes preguntar es qué porcentaje de elementos de clase real i
aquí clasificados como cada clase. Para ello, tomamos una fila fijando el i
y divide cada elemento por la suma de los elementos de la fila. En nuestro ejemplo, los objetos de la clase 2 se clasifican como clase 1 4 veces, se clasifican correctamente como clase 2 5 veces y se clasifican como clase 3 6 veces. Para encontrar los porcentajes simplemente dividimos todo por la suma 4 + 5 + 6 = 15
4/15 of the class 2 objects are classified as class 1
5/15 of the class 2 objects are classified as class 2
6/15 of the class 2 objects are classified as class 3
Encontrar qué clases son responsables de cada clasificación
Lo segundo que puede hacer es mirar cada resultado de su clasificador y preguntar cuántos de esos resultados se originan en cada clase real. Va a ser similar al otro caso pero con columnas en lugar de filas. En nuestro ejemplo, nuestro clasificador devuelve “1” 1 vez cuando la clase original es 1, 4 veces cuando la clase original es 2 y 7 veces cuando la clase original es 3. Para encontrar los porcentajes dividimos por la suma 1 + 4 + 7 = 12
1/12 of the objects classified as class 1 were from class 1
4/12 of the objects classified as class 1 were from class 2
7/12 of the objects classified as class 1 were from class 3
—
Por supuesto, los dos métodos que proporcioné solo se aplican a una columna de una sola fila a la vez y no estoy seguro de si sería una buena idea modificar su matriz de confusión de esta forma. Sin embargo, esto debería dar los porcentajes que está buscando.
Nos puedes secundar nuestra faena exponiendo un comentario y valorándolo te damos la bienvenida.