1. ホーム
  2. python

[解決済み] 精度スコアがメトリクス式と一致しない

2022-03-02 18:02:21

質問

この混同行列をもとに手動でスコアを計算するにはどうしたらよいですか?

この場合、精度スコアはどうすればいいのでしょうか? tp / (tp + fp) は 99% (102 / 103) となります。ですよね?しかし、精度のスコアは98.36%しかありません。以下のスコアが正しいとすると、なぜ精度のスコアが一致しないのでしょうか? (精度のスコアは94.73% (162/171) で正しいです)

この例は、.NETから入手しました。

https://towardsdatascience.com/grid-search-for-model-tuning-3319b259367e


更新しました。

この画像のような出力を得たい場合、ラベルの順序はどうすればよいでしょうか?

解決方法は?

問題は TPFP の混同行列が入れ替わります。

この中で説明されているように の2値分類の場合、ラベルは次のように解釈されます。

真陰性 expected=0, predicted=0

トゥルーポジティブ expected=1, predicted=1

偽陰性 expected=1, predicted=0

偽陽性 expected=0, predicted=1

あなたの例では、これは次のようになります。

##              TN       TP       FN       FP
expected =  [0]*102 + [1]*60 + [1]*8 + [0]*1
predicted = [0]*102 + [1]*60 + [0]*8 + [1]*1 

print ("precision " + '{:.16f}'.format(precision_score(expected, predicted)))
print ("recall    " + '{:.16f}'.format(recall_score(expected, predicted)))
print ("accuracy  " + '{:.16f}'.format(accuracy_score(expected, predicted)))

precision 0.9836065573770492
recall    0.8823529411764706
accuracy  0.9473684210526315

ということで、対策は予想通りです。

その 混同行列 は文書化されています こちら

定義によれば、混同行列は、グループに属することが知られているが、グループに属することが予測されるオブザベーションの数に等しいものです。 したがって,2値分類では,真陰性のカウントは C 0,0 です. 偽陰性はC 1,0、真陽性はC 1,1、偽陽性はC 0,1である。

その結果、次のような結果が得られました。

results = confusion_matrix(expected, predicted)
print('TN ' ,results[0][0])
print('TP ' ,results[1][1])
print('FN ' ,results[1][0])
print('FP ' ,results[0][1])
print(results)


TN  102
TP  60
FN  8
FP  1
[[102   1]
 [  8  60]]

ということで、今回も対策はOKです。ただ、混同行列の位置が、通常のように TP を左上に配置しました。

対処法は簡単で、手動で TPTN

(results[0][0],results[1][1]) = (results[1][1],results[0][0])
print(results)

[[ 60   1]
 [  8 102]]