Goalist Developers Blog

「正解率」でモデルを評価することは危険(かもしれません)!

こんにちは、ゴーリストのチナパです! 機会学習の中によくあるクラシフィケーション問題を作りながら必ず「正解率」と出会うでしょう。しかし、アルゴリズムを評価する方法は他でもあります。ここにはいくつかを調べて見ます。

まず、問題を定義しましょう。簡単な可塑的な問題です。10人の中、誰が赤が好き、そして誰が青いが好きを何かの情報を見て予想したい設定を使います。 つまり、一番の人から10番の人まで、「赤」か「青」というラベルを付けたいということになります。

f:id:c-pattamada:20180208192435p:plain

では、こんな結果がでたとしましょう。 一番自然な評価は正解率だと思いますので、まずはそこを見ていきましょう ここは7回●、3回✖️なので、正解率は70%ですね。

ただし、よく見るとこのアルゴリズムが青を全然よく判断してありません。それは、もしかして青が少数だからかもしれませんが、この問題をもっとひどくした場合に こういうことも見れます。

f:id:c-pattamada:20180208192502p:plain

ここも正解率70%です 単なる毎回「赤」と言っているじゃないですか、こんなことをするたみにアルゴリズム作る必要もないです。 70%正しいでも、本当の状況について何も行ってくれません。

これは正解率の弱点です、クラス(この場合、赤と青)の割合がほぼ同じだった場合なら問題ないかもしれませんが現実の世界では 数が多いクラスと数が少ないクラスが大抵のものです。

では正解率より良い方法があるのでしょうか?

一つの方法は正解と間違った率に加えて偽陽性と偽陰性の割合も見ることです。 自分は辞書から探し出した言葉なので説明します(難しい言葉がどうかわかりません) 「赤」の偽陽性はアルゴリズムが「赤」だと思ってて間違ってた時 「赤」の偽陰性はアルゴリズムが「赤」ではないと思ったが実は赤でした時

2番目の例には、青の偽陰性が100%なので一目で問題があるとわかります。 1番目の例の場合の詳しい計算をします、都合よくするためにもう一回貼ります

f:id:c-pattamada:20180208192435p:plain

赤: 答えた数:8 実は赤だった数:7 正解数:6 偽陽性数:2 偽陰性数:1 こんな感じでも表せられます。

f:id:c-pattamada:20180208192539p:plain

こういう情報も分類するモデルの作成の時にとても便利です。(緑は正しかった時、オレンジは間違ってた時.....ここも赤と青使ってたら混乱しますねw)

では、比べられるために一つの数値で表せられませんか? 様々な方法があると思いますが、私は便利だ思うのはf-value (か、f1-value)と言われます。

(precision・精度) = 偽陽性数 / 答えた数 = 2 / 8 => 25%
(recall・再現率)= 正解数 / 実は赤だった数 = 6 / 7 => 86%

赤の再現率はアルゴリズムが「赤だ」ということをどれだけ上手く予想できるかを測る数字 赤の精度はアルゴリズムが「赤ではない」ということをどれだけ上手くわかるかを測る数字

この両方は高ければ、アルゴリズムが「赤」をよく予想できると言えるでしょう。 では、どう組み合わせますか?

f-valueは精度と再現率の調和平均です。

つまり

f-value = 1 / ((1 / 精度) + (1 / 再現率))

この場合の赤のf-valueは39%です。 ちなみに、青のf-valueは40%です。それぞれのクラスのf-valueの平均をとればアルゴリズムのf-value を表せます。この場合、はもちろん40%以下です、70%の正解率をみるより焦りますね。

f:id:c-pattamada:20180208193402j:plain

(写真はbimbimkhaより)