機械学習エンジニア/データサイエンティストの修行日記

主にデータサイエンス/統計、機械学習、深層学習、Python、数学、ビッグデータに関する知見。

Python/scikit-learn/分類精度を評価する際に使われる混同行列 (Confusion matrix)について

f:id:kaeken:20180202131648p:plain

機械学習のクラス分類精度を評価するために、混同行列 (Confusion matrix)が用いられます。

Confusion matrix - Wikipedia

In the field of machine learning and specifically the problem of statistical classification, a confusion matrix, also known as an error matrix,[4] is a specific table layout that allows visualization of the performance of an algorithm, typically a supervised learning one (in unsupervised learning it is usually called a matching matrix).


何かを予測した場合の精度を評価するには、予測した結果と、実際の結果と比較します。

また、結果には、正しい結果と誤った結果があります。

混同行列 (Confusion matrix)では、2つの軸を設定します。

予実の軸:予測 or 実際
正誤の軸:正答 or 誤答

予実と正誤それぞれの状態をかけ合わせると、以下の4通りになります。

パターン1:正答と予測して、実際正答だった場合
パターン2:正答と予測して、実際誤答だった場合
パターン3:誤答と予測して、実際正答だった場合
パターン4:誤答と予測して、実際誤答だった場合

混同行列(Confusion matrix)では、それぞれのパターンを、以下のように表現しています。

パターン1:真陽性: TP (True-Positive)
パターン2:偽陽性: FP (False-Positive)
パターン3:偽陰性: FN (False-Negative)
パターン4:真陰性: TN (True-Negative)

それぞれの頭文字の意味は、以下の通りです。

T(True, 真):予測と実際が一致している状態
F(False, 偽):予測と実際が一致していない状態
P(Positive, 陽):正答が予測された状態
N(Negative, 陰):誤答が予測された状態

TP,FP,FN,TNそれぞれのパターンを表にすれば、以下のようになります。

f:id:kaeken:20180202131648p:plain

縦軸:予測、横軸:実際

では、scikit-learnで混同行列 (Confusion matrix)を使ってみますと、以下のようなコマンドになります。

from sklearn.metrics import confusion_matrix
pred_result = [1, 1, 1, 0]#予測の結果
true_result = [0, 1, 0, 1]#実際の結果
#予実とも1は、1個なのでTP:1
#予測1で実際0なのは、2個なのでFP:2
#予測0で実際1なのは、1個なのでFN:1
#予実とも0は、0個なのでTN:0

tn, fp, fn, tp = confusion_matrix(true_result, pred_result).ravel()#混同行列で解きほぐした結果を取得
(tp, fp, fn, tn)#正正,正誤,誤正,誤誤に順番を整理して表示
実行結果
(1, 2, 1, 0)

他のパラメータは以下に詳述されています。

sklearn.metrics.confusion_matrix — scikit-learn 0.19.1 documentation

sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)


なお、

上記は、正答/誤答といった二値分類でしたが、多値分類でも可能です。

また、縦軸:予測、横軸:実際を逆にして、縦軸:実際、横軸:予測にする表現方法もあります。

それでは、

この混同行列の値TP,FP,FN,TNを使った指標については、後日まとめていきたいと思います。