二値分類における評価指標
二値分類の問題
二値分類:データを2つのクラスに分類する問題
第1種の誤り・第2種の誤りでも例に出した、「検査結果をもとにある病気の診断をする(「病気である」か「病気でない」かのどちらかに分類する)」などは典型的な二値分類の例 以下のようなデータで、x1が数学の点数、x2が英語の点数で、「●」を合格、「×」を不合格して合否を決める問題、こういうものも二値分類の例
https://gyazo.com/da3f6ba67c0e5f54f3dbd9a1489ad4bb
正例(陽性)と負例(陰性)
2つのクラスに属するデータは正例(positive example)および負例(negative example)と呼ぶ
正例を「陽性」、負例を「陰性」と呼ぶこともある
検査の場合など、場合によってはこっちのほうがイメージしやすいかも)
実際のデータでは、「+」と「-」(たとえばcredit approvalのデータ)のように、何らかの名義尺度の値が入っていることがほとんどだが、どちらが正例かは人間が決める(アプリオリには決まっていない)ものなので、あらかじめ決めておく必要がある
2つのクラスに意味があり、いずれかのクラスをとくに発見したいのであればそちらを正例にすることが多い
たとえば、病気の診断(「病気である」か「病気でない」か)の場合は、病気を発見したいので、「病気である」のクラスを正例(陽性)とする
上の合否の分類の例では、「合格」を発見したいのか、「不合格」を発見したいのかは目的によるので、どちらを正例(陽性)とするかはそれ次第
多くのアルゴリズムでは、「正例か負例か」そのものを予測する(predict()メソッド)こともできれば、「正例である確率」を計算して出力(predict_proba()メソッド)することもできる それぞれに応じて評価指標が考えられる
機械学習モデルによる分類と誤分類
上の合否のデータで決定木モデルを学習すると以下のようになったとする
https://gyazo.com/946c91cfc664d60f3b79afc061382592 https://gyazo.com/8da866d590e2323f4de36f4df9bd28f6
データが青い領域にあれば、モデルは「●」と分類する
青い領域にある「×」の点は、「モデルは●と分類したが、実際は×だった」という誤分類をしたことになる
データが赤い領域にあれば、モデルは「×」と分類する
赤い領域にある「●」の点は、「モデルは×と分類したが、実際は●だった」という誤分類をしたことになる
さて、このモデルの「良さ」を評価するには、どうすればよいか?
Accuracy(正答率)だけをみていてよいだろうか?
二値分類結果に基づく評価指標
混同行列
まず評価を行うための前提として、各データに対する「予測(分類)結果」が正解かどうかに関して、以下の4つの数を計算する
予測(分類)が正解の場合
TP(True Positive;真陽性):「正例(陽性)」だと予測して、それが正しい場合の数
TN(True Negative;真陰性):「負例(陰性)」だと予測して、それが正しい場合の数
予測(分類)が不正解の場合
FP(False Positive;偽陽性):「正例(陽性)」だと予測して、それが誤っている場合の数
推測統計でいう第1種の誤り(Type-I error)に相当
FN(False Negative;偽陰性):「負例(陰性)」だと予測して、それが誤っている場合の数
推測統計でいう第2種の誤り(Type-II error)に相当
上の例での、テストデータに対する分類結果でこれらを計算すると・・・
https://gyazo.com/8da866d590e2323f4de36f4df9bd28f6
ここで、「●」と「×」のうち、「×」を正例(陽性)と考えることにすると・・・
まず、実際のクラスの正例(陽性、「×」)は16個、負例(陰性、「●」)は9個ある
TP, TN, FP, FNは・・・
TPは「×と予測(赤い領域)して実際に×だった数」なので15個
TNは「●と予測(青い領域)して実際に●だった数」なので7個
FPは「×と予測(赤い領域)したが実際は●だった数」なので2個
FNは「●と予測(青い領域)したが実際は×だった数」なので1個
これらの数を用いて、混同行列(confusion matrix)を計算するのが評価の基本になる
https://gyazo.com/db915a38adeeddec8c4c8ce62277189b
このような感じで計算結果を表示できる
https://gyazo.com/76789bfb07366860b8684396610e812e
二値分類結果に基づくさまざまな評価指標
accuracy(正答率、正確度)とerror rate(誤答率)
$ \textrm{accuracy} = \frac{TP + TN}{TP + TN + FP + FN}
$ \textrm{error rate} = 1 - \textrm{accuracy}
つまり、正負問わず予測が正解だった割合を示す、単純な指標
上の例では、$ (15+7)/(15+7+2+1) = 0.88
error rateはaccuracyの裏返しなので、どちらも本質的には同じものを示す。場合によって使い分ける
直感的にはこれを評価すれば十分に思えるかもしれないが、不均衡データの場合はこの指標だけでは不十分であるなど、これ単独で評価することはほとんどない
たとえば、データ全体のうち、正例が10%、負例が90%の割合で含まれていた場合、「すべてのデータを無条件で負例だと分類」すれば、accuracyは0.9になってしまう!(これはほとんど意味がない)
false positive rate(偽陽性率)とtrue positive rate(真陽性率)
$ \textrm{false positive rate} = \frac{FP}{FP + TN}
実際に負例(陰性)だったもののうち、正例(陽性)と予測したものの割合
0から1の値をとり、0に近いほど「良い」
$ \textrm{true positive rate} = \frac{TP}{TP + FN}
実際に正例(陽性)だったもののうち、正例(陽性)と予測したものの割合
0から1の値をとり、1に近いほど「良い」
precision(適合率)とrecall(再現率)
$ \textrm{precision} = \frac{TP}{TP + FP}
precision(適合率)は、正例と予測したもののうち、真の値も正例である割合(正例と予測した場合の正解率)
上の例では、$ 15/(15+2)=0.88...
要するに、モデルが「陽性だよ!」と言った場合にそれが当たっている割合を示す
第1種の誤り(偽陽性)を起こさない確率のようなもの
$ \textrm{recall} = \frac{TP}{TP + FN}
recall(再現率)は、真の値が正例のもののうち、どの程度を正例の予測として含めることができているかの割合(正例の発見率)
上の例では、$ 15/(15+1) = 0.94....
要するに、「本当は陽性であるデータをどれくらい発見できたか」を示す
第2種の誤り(偽陰性)を起こさない確率のようなもの
いずれも、0から1の値をとり、1に近いほど「良い」
どちらかを高くしようとすると、もう一方の値は低くなる
F1-score(F値)
precisionとrecallの調和平均
$ \textrm{F}_1 = \frac{2}{\frac{1}{\textrm{recall}}+\frac{1}{\textrm{precision}}} = 2 \frac{\textrm{precision}・\textrm{recall}}{\textrm{precision}+\textrm{recall}}
precisionとrecallの両方がそれなりに良い値だとF1-scoreも良くなるので、precisionとrecallのバランスをとりたい場合にはこの指標がよく用いられる
Classification Reportについて
scikit-learnでは、metrics.classification_reportによって、上の指標の評価結果を一覧にする便利機能がある
https://gyazo.com/0c2d7b41ff126ea1dffcbf9684886104
各クラスについて、「そのクラスを陽性としたときの」Precision、Recall、F1-scoreが計算される
たとえば上は「0(つまり「×」)」クラスのprecisionは0.88でrecallは0.94、「1(つまり「●」)」クラスのprecisionは0.88でrecallは0.78、といったことを示す
「support」は各クラスのデータの数を示す
「accuracy」はどちらのクラスを陽性にしても変わらないので、ひとつだけ表示される
(参考)「macro avg」、「weighted avg」は、各クラスの各指標を平均したもので、モデルの(ある種の)総合的な性能をみるための指標。「macro avg」は全クラスの平均、「weighted avg」は「support(各クラスのデータ数)」で重みをつけた平均。
学習データとテストデータのそれぞれについてClassification Reportをみておくとよい
https://gyazo.com/2932fbfcce466461b70efc6331f5b7f3
https://gyazo.com/0c2d7b41ff126ea1dffcbf9684886104
たとえばこの場合は、いずれのクラスも、そしてどの指標も、学習データは値が高く、テストデータはそれにくらべて値が低い。これは、このモデルはどの指標でみても過学習の傾向にあることを示唆している。
バリデーションやパラメータチューニングにおける指標
ただし、scikit-learnのcross_val_scoreなどのクロスバリデーションのメソッドを使う場合、デフォルトではAccuracyが使用されるので注意
scoringパラメータを指定すると、precision、recall、F1-scoreといったさまざまな評価指標を用いたバリデーションを行うことができるので、「何をもって良いと言いたいか」を考慮したうえで評価指標を選択する
cross_validateを用いると複数の評価指標を同時に使ったクロスバリデーションができる