PR
スポンサーリンク

【機械学習】Precision, Recallの再入門

プログラミング
スポンサーリンク

クロスバリデーションでAccuracy, Precision, Recallで良い値が出ているのに、どうも実際の精度が良くない。そんなときはTrueとFalseを逆にすると課題が見えてくることがあります。そんな事例の紹介です。

【サンプル】8割正解したサンプルデータ

test_org = [0, 0, 1, 1, 1, 1, 1, 1, 1, 1]
pred_org = [0, 1, 0, 1, 1, 1, 1, 1, 1, 1]

【サンプル】混同行列 TPが7、TNが1

from sklearn.metrics import confusion_matrix

cm = confusion_matrix(test_org, pred_org, labels=[1, 0])
print(cm)

[[7 1]
[1 1]]

左上のTP(True positive)が7、右下のTN(True Negative)はじめ他は1。ちなみに左下はFP(False positive)、右上はFN(False Negative)。

【サンプル】Precision, Recall, F1-scoreが 0.875

from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score

print('accuracy :', accuracy_score(test_org, pred_org))
print('precision:', precision_score(test_org, pred_org))
print('recall   :', recall_score(test_org, pred_org))
print('f1_score :', f1_score(test_org, pred_org))

accuracy : 0.8
precision: 0.875
recall : 0.875
f1_score : 0.875

precisionもrecallも良い感じといえる。念のために検算してみると
precision = TP / (TP + FP) なので 7 / (7 + 1) = 0.875
recall = TP / (TP + FN) なので 7 / (7 + 1) = 0.875

【テスト】10個の値の 0と1を入れ替えてみる

#0 と1 を入れ替えたデータ
test_inv = [1, 1, 0, 0, 0, 0, 0, 0, 0, 0]
pred_inv = [1, 0, 1, 0, 0, 0, 0, 0, 0, 0]

【テスト】入れ替えたデータではTPが1、FNが7

cm = confusion_matrix(test_inv, pred_inv, labels=[1, 0])
print(cm)

[[1 1]
[1 7]]
今度はTPが1、TNが7。

入れ替えたデータでは Precision, Recall, F1-scoreが 0.5まで落ちる

from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score

print('accuracy :', accuracy_score(test_inv, pred_inv))
print('precision:', precision_score(test_inv, pred_inv))
print('recall   :', recall_score(test_inv, pred_inv))
print('f1_score :', f1_score(test_inv, pred_inv))

accuracy : 0.8
precision: 0.5
recall : 0.5
f1_score : 0.5

先ほどまで0.875だったprecision、recall、f1_scoreが 0.5まで落ちている。考えてみれば当然で。
precision = TP / (TP + FP) なので 1 / ( 1 + 1) = 0.5
recall = TP / (TP + FN) なので 1 / ( 1 + 1) = 0.5
その平均であるf1_scoreも0.5になる訳です。

90%が”A”であるデータは何も考えず”A”といえば90%当たる

(今回は70%でテストしましたが)例えば90%が”A”のデータなら、何も考えずに”A”と言えば9割がTPになります。大半を占めているTPが計算式の分子と分母にあれば、そりゃ1/1に近付きますよね。“A”をTPにするか”B”をTPにするかでAccuracy, Precision, Recall, F1-scoreの値が変わってくる、という話でした。

コメント

タイトルとURLをコピーしました