はだだだだ

定食にサラダは不要だと思う。

MENU

caret::confusionMatrixの出力結果について

機械学習の勉強で「性別を身長から予測する」モデルを以下の記事を見ながら作成しました。

Chapter 28 Introduction to Machine Learning | Introduction to Data Science

モデル精度を測るためにcaret::confusionMatrix関数を使用したところ、出力結果に指標がたくさん出てきたため、意味を調べました。
出力結果は以下です。1つ1つ指標の意味を見ていきます。

>confusionMatrix(data = y_hat, reference = test_set$sex)
Confusion Matrix and Statistics

                 Reference
Prediction Female Male
  Female     69        45
  Male       50       361
                                          
Accuracy : 0.819           
95% CI : (0.7834, 0.8511)
No Information Rate : 0.7733          
P-Value [Acc > NIR] : 0.00616         
                                          
Kappa : 0.4761          
                                          
Mcnemar's Test P-Value : 0.68152         
                                          
Sensitivity : 0.5798          
Specificity : 0.8892          
Pos Pred Value : 0.6053          
Neg Pred Value : 0.8783          
Prevalence : 0.2267 
Detection Rate : 0.1314
Detection Prevalence : 0.2171
Balanced Accuracy : 0.7345
Positive' Class : Female  

confusion matrixについて

テストデータでモデルを検証した結果、下記のようなconfusion matrixが得られます。

prediction \ refefence female male
female 69 45
male 50 361

confusion matrixの各セルの名称は以下です。

prediction \ actural Positive Negative
Positive TP(True Positive) FP(False Positive)
Negative FN(False Negative) TN(True Negative)

2値分類を一般化するために、片方をPositive、もう片方をNegativeとします。ちなみにcaret::confusionMatrix関数では、ファクター型のベクトルを引数に取り、ファクターのラベルをアルファベット順にみて先の方が自動的にPositiveになります。そのため、上記の例では"Female"がPositiveになっています。

TP、FP、FN、TNは以下の意味になります。

  • TP:Positiveと予測して正解がPositiveだった数(当たり)
  • FP:Positiveと予測したが正解はNegativeだった数(外れ)
  • TN:Negativeと予測して正解がNegativeだった数(当たり)
  • FN:Negativeと予測したが正解はPositiveだった数(外れ)

confusion matrixを使用したモデル精度の検証は上記の4項目を使って指標の算出や検定を行います。

accuracy

accuracyは以下の計算方法で求められます。なお、overall accurayなどともよばれます。

 (TP + TN) / (TP + TN + FP + FN) = (69 + 361) / (69 + 361 + 45 + 50) = 0.819

これは訓練で使用したデータのうち、正しく男性、女性を判定できた割合です。
この数値は高ければ高いほど精度が高いといえますが、注意が必要なのが数値例のように、データが片方に偏っている(男性の方がかなり多い)場合、片方の精度が高くてももう片方の精度がよくないことがあります。

実際に男性と女性に分けて以下のように予測精度を見ると、女性のほうの精度が明らかに低いことがわかります。

Femaleのaccuracy :
 TP / (TP + FN) = 69 / (69 + 50) = 0.5798

Maleのaccuracy :
 TN / (TN + FP) = 361 / (361 + 45) = 0.8892

なお、ここで「Femaleのaccuracy」は後段ででてくるsensitivityに、「Maleのaccuracy」はspecificityに対応しています。

95%CI

accuracyの信頼区間です。

caret::confusionMatrixは関数の中でbinom.test関数を呼び出してaccuracyの計算を行っています。
信頼区間は以下の計算結果と一致します。

binom.test((69 + 361), 525, p = 0.5)  

p=0.5というのは仕様で、一般的に二項分布を使用して信頼区間を求める際にはこのようにするようです。以下の記事をご参照ください。

https://oku.edu.mie-u.ac.jp/~okumura/stat/tests_and_CI.html

No Information Rate(NIR)

以下の式で計算されます。
 max(TP + FN, FP + TN) / (TP + TN + FP + FN) = \\ 
max(69 + 50, 45 + 361) / (59 + 50 + 45 + 361) = 0.7733

この値は「ランダムに予測した場合の予測精度」という意味で、最初に計算したaccuracy(overall accuracy)と比較するために使用します。

「ランダムに予測した場合の予測精度」というのは、「全体の男性の割合がNIRなので、適当に対象のNIRの割合を男性、(1 - NIR)の割合を女性に振り分ければNIRの精度は出せるだろう。」というような意味です。

実際には予測する段階ではNIRは不明のため、NIRという概念はaccuracy(overall accuracy)の水準を考えるための擬似的な予測精度です。

上記の場合は男性の方が多いので男性の割合がNIRになっていますが、女性の方が多い場合は女性の割合がNIRになります。

P-Value [Acc > NIR]

accuracy > NIRを帰無仮説とする二項検定のP値です。95%CIと同様、内部でbinom.testを呼び出しています。
引数でp=NIRとなっているのに注意が必要です。

binom.test((69 + 361), 525, p = NIR, alternative = "greater")  


このように、carete::confusionMatrixでは二項分布を使用して信頼区間の計算と仮説検定を行うのですが、分布の平均値pのパラメータが異なっています。
これは仕様なのですが、なぜ違うのか、この違いがどのような影響を与えるかはまだ理解できておりません。

この件については、以下で触れられております。

https://oku.edu.mie-u.ac.jp/~okumura/stat/tests_and_CI.html

Kappa

ここで計算されているのはCohen's kappaです。

Cohen's kappa - Wikipedia

計算式は以下です。

 TOTAL = TP + FP + FN + FN \\
PRA = Probability  of  Random  Agreement \\
PRA = (TP + FP) / TOTAL * (TP + FN) / TOTAL + (FN + TN) / TOTAL * (FP + TN) / TOTAL \\
\kappa = (accuracy - PRA) / (1 - PRA)

計算すると以下です。
 TOTAL = 69 + 45 + 50 + 361 = 525 \\
PRA = (69 + 45) / 525 * (69 + 50) / 525 + (50 + 361) / 525 + (45 + 361) / 525 = 0.654629 \\
\kappa = (0.819 - 0.654) / (1 - 0.654) = 0.4761

probabiliity of random agreementは、accuracyの大きさを評価するために擬似的に用意した指標で、NIRと目的は似ていますが、異なる方法で計算します。

解釈としては以下のようになります。

Femaleに予測した割合が(TP + FP) / TOTALで正解のFemaleの割合が(TP + FN) / TOTALです。
同様に、Maleに予測した割合が、(FN + TN) / TOTALで正解のMaleの割合が(FP + TN) / TOTALです。
つまり、予測する際に男女比だけ決めて後は適当に振り分けた場合の正解確率(TPとTNの領域)がprobabiliity of random agreementです。

confusion matrixで整理すると以下になります。

prediction \ refefence female male
female  (TP + FP) / TOTAL * (TP + FN) / TOTAL -
male -  (FN + TN) / TOTAL * (FP + TN) / TOTAL

 \kappa -inf < \kappa < 1の値を取り、0より大きければランダムな予測よりは精度が高いことになります。

Mcnemar's Test P-Value

Mcnemarの検定をした場合のP値です。caret::confusionMatrix内でmcnemar.test関数が呼び出され \chi^2検定が行われます。

検定統計量は以下のように計算します。

 m = (abs(FP - FN) - 1)^2 / (FP + FN) =  (abs(45 -50) - 1) / (45 + 50) = 0.168421

これは自由度1の \chi^2分布に従うため、 \chi^2分布で検定が行われます。

以下のように計算するとp値の0.68152が再現できます。

# chi^2 test : degree of freedom is 1
pchisq(0.168421, 1, lower.tail = FALSE)

> pchisq(0.168421, 1, lower.tail = FALSE)
[1] 0.6815189

以下の記事もご参照ください。
https://oku.edu.mie-u.ac.jp/~okumura/stat/mcnemar.html
マクネマー検定 - 健康統計の基礎・健康統計学


なお、Mcnemar検定はFNとFPに差があるかを検定しているため、今回の例のようにPositiveとNegativeを入れ替えても問題ない状況では検定する意味がないと思われます。Mcnemar検定を行う状況としては、上記のリンクのように何らかの施策有無の効果検証を行いたいときなどになると思います。

Sensitivity

モデルの有効性指標でFemaleに予測されたサンプルが本当のFemaleのうち何割を占めているかを表わします。
 TP / (TP + FN) = 69 / (69 + 50) = 0.5798

以下の記事もご参照ください。この記事のように以降の指標は疫学の文脈で特に有用と思われます。今回の例ではPositiveとNegativeをそれぞれFemale、Maleとしていますが、入れ替えても問題に本質的な影響はありません。
http://kamiyacho.org/ebm/ce204.html

Sensitivityは日本語で「敏感度」と訳すようです。

Specificity

モデルの有効性指標でMaleに予測されたサンプルが本当のMaleのうち何割を占めているかを表わします。
 TN / (TN + FP) = 361 / (361 + 45) = 0.8892

なお、Specificityは日本語で「特異度」と訳すようです。

Pos Pred Value

以下で計算されます。
 Sensitivity * Prevalence / (Sensitivity * Prevalence + (1 - Specificity) * (1 - Prevalence) \\
= (0.5798 * 0.2267) / (0.5798 * 0.2267 + (1 - 0.8892) * (1 - 0.2267)) \\
= 0.6053

prevalenceの計算式は後ででてきます。

Neg Pred Value

以下で計算されます。
 Specificity * (1 - Prevalence) / (1 - Sensitivity) * Prevalence + Specificity * (1 - Prevalence) \\
= (0.8892 * (1 -0.2267) / (1 - 0.5798) * 0.2267 + 0.8892) * (1 - 0.2267)) \\
= 0.8783

Prevalence

以下で計算されます。
 (TP + FN) / TOTAL = (69 + 50) / (69 + 50 + 45  +361) = 0.2267

Detection Rate

以下で計算されます。
 TP / TOTAL = 69 / (69 + 50 + 45  +361) = 0.1314

Detection Prevalence

以下で計算します。
 (TP + FP) / TOTAL = (69 + 45) / (69 + 50 + 45  +361) = 0.2171

Balanced Accuracy

SensitivityとSpecificityの平均です。
 (Sensitivity + Specificity) / 2 = (0.5798 + 0.8892) / 2 = 0.7345

accuracyよりも小さくなりますが、「性別を身長から予測する」モデルの精度指標としてはBalanced Accuracyの方が有用と思われます。

以上

データサイエンスのための統計学入門 ―予測、分類、統計モデリング、統計的機械学習とRプログラミング

データサイエンスのための統計学入門 ―予測、分類、統計モデリング、統計的機械学習とRプログラミング