ソフトウェアの品質を学びまくる

ソフトウェアの品質、ソフトウェアテストなどについて学んだことを記録するブログです。

判定器の「よしあし」に関するメトリクスを確認しておく - その2

 機械学習の分類性能の指標として、「AUROC」「AUR-ROC」という言葉もよく出てくるので、Excelでいじってみました。
 AUROCとは、「受信者操作特性曲線の下の面積」という直訳になりますが、意味不明ですね。

 では前回に続いて、陽性か陰性かを分類するプログラムを考えてみます。

www.kzsuzuki.com

判定の閾値と性能メトリクスの変化

 この分類がゼロイチではなく、「75%の確率で陽性」といった「確信度」で表現される場合、これを陽性に倒すか陰性に倒すか、閾値を設けることになります。
 閾値を「50%以上」と設定すれば、75%の分類は「陽性」判定。閾値を「80%以上」と設定すれば、「陰性」判定になります。閾値が100%であれば、確信度100%の分類以外はすべての分類を陰性と扱う。

 閾値を変化させていくことで、精度・適合率・再現度・特異度がどのように変化していくかを見てみましょう。
 下のグラフは、50個のサンプルのうち5個が陽性という集団に対し、それなりに分類性能が高い場合の例です。

f:id:kz_suzuki:20191227170330p:plain
性能メトリクスの変化

 まず青い線の精度を見てください。グラフの右に行く=閾値を高める=陰性判定しやすくなる、ということで、陰性比率が低い集団では精度が上がっていきます*1

 オレンジ色の線の適合率は、「陽性と判断したもののうち、本当に陽性だったもの」でした。閾値を高めていくと、陽性扱いすること自体が減るので、分母が小さくなっていきます。また「誤って陽性判断する」(偽陽性)ことも減るので、精度と同様数値が上がっていく傾向にあります。
 今回のサンプルでは、「100%の確信で陽性」というものがあったため、閾値100%でも「正しく」陽性扱い、つまり真陽性となり、適合率も100%となります。

 黄色の線の特異度は、「現実に陰性であるもののうち、正しく陰性であると扱えたもの」です。今回のサンプルには陰性が多いので、精度と同様、閾値を高くして陰性判定してれば、どんどん上がっていくことが見て取れます。

 一方、再現度はどうでしょう。再現度は「現実に陽性であるもののうち、正しく陽性であると扱えたもの」です。閾値を上げるととにかく陽性扱いがどんどん減っていくので、再現度はどんどん下がっていくことがわかります。先ほどと同様、「100%の確率で陽性」というデータがあったので、何とか再現度ゼロになるのを踏みとどまっています。

真陽性率と偽陽性率

 別名の多い分類性能メトリクスですが、上述の再現度は、「真陽性率」と呼ばれることもあります。繰り返しますが、「現実に陽性であるもののうち、正しく陽性であると扱えたもの」でしたね。
 一方この逆に、「偽陽性率」は、「現実に陰性であるもののうち、誤って陽性であると扱ったもの」と定義できます。閾値を上げれば上げるほど偽陽性は減っていきますので、最終的にはゼロになります。これは 1 - 特異度 でもあるため、特異度とは逆に、閾値を下げるとともに下がっていきます。

 バランスの取れた判定性能を実現するためには、真陽性率を高く保ちつつ、偽陽性率は低く保ちたい。これを可視化するために、2つのメトリクスをパラメタとして、散布図を描いてみます。

f:id:kz_suzuki:20191227170906p:plain
ROC曲線

 この右肩上がりの散布図が、ROCです。Wikipediaによると

信号処理の概念で、観測された信号からあるものの存在を判定する際の基準となる特性である。

ということで、レーダー技術から開発され(そのため「受信」といった言葉が出てくる)、臨床の現場で用いられ、判定器の性能評価に用いられているわけですね。

 3つのケースをプロットしてみました。
 まずは緑の線。このデータは、「強い確信度で正しく判定できている」ケースです。50個のうち2つのケースでだけ、「陰性に対して80%の確信で陽性判断」、「陽性に対して50%の確信で陽性判断」という「ミス」を混ぜています。  このケースでは、いきなり垂直に立ち上がって、ほぼそのまま上限に達しています。グラフを解釈すると「閾値を下げることで偽陽性率を上げなくても、真陽性率を十分に高く維持できる」ということで、優秀なモデルということができます。

 オレンジ色の線は「それなり」のケース。「真陽性率を上げるためには、閾値を下げて、偽陽性率の上昇を受け入れる必要がある」ということです。
 グレーの線は、ランダムに判定したもの。真陽性率を80%にするには偽陽性率が62%になってしまう。言い換えると、「現実の5個の陽性のうち4個を正しく陽性判定できる代わりに、「陽性と判定した5個のデータのうち、3個が現実には陰性」という「うっかりものの誤り」を受け入れることになります。

 つまりモデルの良しあしは、このROCがいかに早く立ち上がるかで決まる。言い換えると、曲線の下にある面積の大きさ、積分ともいえます。これがAUC、Area Under the Curve というわけです。

 各性能メトリクスを個別にみるのではなく、真陽性と偽陽性のバランスを視覚的に表現してモデルの良しあしを直観的に認識することができ、かつ閾値をどこに置くのが適切かという議論の土台にもなるツールなんですね。

 勉強が進むのが、とっても遅いです。

参考

techblog.gmo-ap.jp www.randpy.tokyo

*1:この例では、閾値を100%にした時点で「95%の確率で陽性」とした判定まで「陰性」に倒しているため、再度に精度が下がっていますね。