Mit der Verwirrungsmatrix kann die Anzahl der Fehlklassifizierungen, dh die Anzahl der vorhergesagten Klassen, die auf der Grundlage der wahren Klassen in einen falschen Klassifizierungsbereich gelangt sind, tabellarisch dargestellt werden.
Während sklearn.metrics.confusion_matrix eine numerische Matrix bereitstellt, finde ich es sinnvoller, einen "Bericht" mit den folgenden Methoden zu erstellen:
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)
was in ... endet:
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
Dies ermöglicht es uns zu sehen, dass:
- Die diagonalen Elemente zeigen die Anzahl der korrekten Klassifikationen für jede Klasse: 3, 1 und 3 für die Klassen 0, 1 und 2.
- Die nicht diagonalen Elemente liefern die Fehlklassifizierungen: Zum Beispiel wurden 2 der Klasse 2 als 0, keine der Klasse 0 als 2 usw. falsch klassifiziert.
- Die Gesamtzahl der Klassifizierungen für jede Klasse in beiden
y_true
und y_pred
aus den Zwischensummen "Alle"
Diese Methode funktioniert auch für Textbeschriftungen und kann für eine große Anzahl von Beispielen im Dataset erweitert werden, um Prozentberichte bereitzustellen.
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())
Die Ausgabe ist dann:
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
wobei die Zahlen jetzt den Prozentsatz (und nicht die Anzahl der Fälle) der klassifizierten Ergebnisse darstellen.
Beachten Sie jedoch, dass die sklearn.metrics.confusion_matrix
Ausgabe direkt visualisiert werden kann mit:
import matplotlib.pyplot as plt
conf = sklearn.metrics.confusion_matrix(y_true, y_pred)
plt.imshow(conf, cmap='binary', interpolation='None')
plt.show()