Macierz nieporozumień jest sposobem na zestawienie liczby błędnych klasyfikacji, tj. Liczby przewidywanych klas, które trafiły do niewłaściwego koszyka klasyfikacyjnego w oparciu o prawdziwe klasy.
Chociaż sklearn.metrics.confusion_matrix zapewnia macierz numeryczną, bardziej użyteczne jest wygenerowanie „raportu” przy użyciu następujących elementów:
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)
Co skutkuje w:
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
To pozwala nam zobaczyć, że:
- Elementy ukośne pokazują liczbę poprawnych klasyfikacji dla każdej klasy: 3, 1 i 3 dla klas 0, 1 i 2.
- Elementy nie przekątne zapewniają błędne klasyfikacje: na przykład 2 z klasy 2 zostały błędnie zaklasyfikowane jako 0, żaden z klasy 0 nie został błędnie zaklasyfikowany jako 2 itd.
- Łączna liczba klasyfikacji dla każdej klasy w obu
y_true
i y_pred
z sum częściowych „Wszystkie”
Ta metoda działa również w przypadku etykiet tekstowych, a dla dużej liczby próbek w zestawie danych można rozszerzyć, aby dostarczać raporty procentowe.
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())
Dane wyjściowe to:
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
gdzie liczby reprezentują teraz procent (a nie liczbę przypadków) wyników, które zostały sklasyfikowane.
Należy pamiętać, że dane sklearn.metrics.confusion_matrix
wyjściowe można bezpośrednio wizualizować za pomocą:
import matplotlib.pyplot as plt
conf = sklearn.metrics.confusion_matrix(y_true, y_pred)
plt.imshow(conf, cmap='binary', interpolation='None')
plt.show()