混同マトリックスは、誤分類の数、つまり、真のクラスに基づいて誤った分類ビンになった予測クラスの数を集計する方法です。
sklearn.metrics.confusion_matrixは数値行列を提供しますが、次を使用して「レポート」を生成する方が便利だと思います。
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)
結果:
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
これにより、次のことがわかります。
- 対角要素は、各クラスの正しい分類の数を示します。クラス0、1、2の場合は3、1、3です。
- 非対角要素は誤分類を提供します。たとえば、クラス2の2は0として誤分類され、クラス0のいずれも2として誤分類されません。
- 「すべて」の小計からの
y_true
およびの両方の各クラスの分類の総数y_pred
この方法はテキストラベルでも機能し、データセット内の多数のサンプルを拡張して割合レポートを提供できます。
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())
出力は次のとおりです。
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
ここで、数値は、分類された結果の割合(ケース数ではなく)を表します。
ただし、sklearn.metrics.confusion_matrix
出力は次を使用して直接視覚化できることに注意してください。
import matplotlib.pyplot as plt
conf = sklearn.metrics.confusion_matrix(y_true, y_pred)
plt.imshow(conf, cmap='binary', interpolation='None')
plt.show()