La matrice di confusione è un modo per tabulare il numero di classificazioni errate, cioè il numero di classi previste che sono finite in un contenitore di classificazione errato basato sulle classi vere.
Mentre sklearn.metrics.confusion_matrix fornisce una matrice numerica, trovo più utile generare un "rapporto" usando quanto segue:
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)
che si traduce in:
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
Questo ci consente di vedere che:
- Gli elementi diagonali mostrano il numero di classificazioni corrette per ogni classe: 3, 1 e 3 per le classi 0, 1 e 2.
- Gli elementi fuori diagonale forniscono le classificazioni errate: ad esempio, 2 della classe 2 sono stati classificati erroneamente come 0, nessuno della classe 0 è stato classificato erroneamente come 2, ecc.
- Il numero totale di classificazioni per ciascuna classe in entrambi
y_true
e y_pred
, dai totali parziali "Tutti"
Questo metodo funziona anche per le etichette di testo e per un gran numero di campioni nel set di dati può essere esteso per fornire rapporti percentuali.
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())
L'output quindi è:
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
dove i numeri ora rappresentano la percentuale (anziché il numero di casi) dei risultati che sono stati classificati.
Sebbene si noti che l' sklearn.metrics.confusion_matrix
output può essere visualizzato direttamente usando:
import matplotlib.pyplot as plt
conf = sklearn.metrics.confusion_matrix(y_true, y_pred)
plt.imshow(conf, cmap='binary', interpolation='None')
plt.show()