kaeken(嘉永島健司)のTech探究ブログ

主に情報科学/情報技術全般に関する知見をポストします。(最近は、特にData Science、機械学習、深層学習、統計学、Python、数学、ビッグデータ)

Python/scikit-learn/分類精度の評価指標について

f:id:kaeken:20180203200300p:plain


前回は、機械学習のクラス分類精度を評価するために、まず混同行列 (Confusion matrix)についてまとめました。

Python/scikit-learn/分類精度を評価する際に使われる混同行列 (Confusion matrix)について - データサイエンティストへの修行日記

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

あらためて、混同行列のテーブルを見ていきます。

f:id:kaeken:20180202131648p:plain

前回、以下のようにパターンが存在することを示しました。

パターン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, 陰):誤答が予測された状態

これらのパターンを用いて、精度を評価するための指標があります。

Confusion matrix - Wikipedia

今回は、主に4つの以下をとりあげます。

  • 正解率 (Accuracy)
  • 適合率 (Precision) ※精度とも言う
  • 検出率 (Recall)
  • F値 (f-score)

それぞれの指標の定義は、以下の通りです。

正解率 (Accuracy) = TP+TN / 全体

→全体のうち、予測通り正誤分類できた割合

真陽性: TP (True-Positive)
真陰性: TN (True-Negative)


適合率 (Precision) = TP / (TP + FP)

→予測が正答だった中で、予測通り正答分類できた割合

真陽性: TP (True-Positive)
偽陽性: FP (False-Positive)


検出率 (Recall) = TP / (TP + FN)

→実際に正答だった中で、予測も正答だった割合

真陽性: TP (True-Positive)
偽陰性: FN (False-Negative)


F値 (f-score) = 適合率と検出率の調和平均

→ 適合率と検出率の調和平均を求めて、極端に振れないようにする値です。
F1 score - Wikipedia


以上が主な分類精度の評価指標となります。

それぞれの実装は、scikit-learnでメソッドになっていますので、以下で実装例が確認できます。

  • 正解率 (Accuracy) : sklearn.metrics.accuracy_score
  • 適合率 (Precision) : sklearn.metrics.precision_score
  • 検出率 (Recall) : sklearn.metrics.recall_score
  • F値 (f-score) : sklearn.metrics.f1_score

API Reference — scikit-learn 0.19.1 documentation

Classification metrics


また、上記のうち、適合率・検出率・F値をまとめて表示する
sklearn.metrics.classification_report
が定義されていますので、便利です。

#sklearn.metrics.classification_report
from sklearn.metrics import classification_report
y_true = [0, 1, 2, 2, 2]
y_pred = [0, 0, 2, 2, 1]
target_names = ['class 0', 'class 1', 'class 2']
print(classification_report(y_true, y_pred, target_names=target_names))
実行結果
             precision    recall  f1-score   support

    class 0       0.50      1.00      0.67         1
    class 1       0.00      0.00      0.00         1
    class 2       1.00      0.67      0.80         3

avg / total       0.70      0.60      0.61         5

以上で、主な分類精度の評価指標についてまとめました。

機械学習では、必ず精度を評価しながら、過学習に陥らず、精度を上げていくことが重要になります。