正解率の高い予測が必ずしも良い予測ではない

タイトルのとおりなんですが、何かしらの予測に対してその良さを語るために「正解率90%」とか「精度90%」とかよく表現されますね。

で、今回は「正解率が高ければ良いというわけじゃない」という話です。

正解率 (accuracy)

正解率の定義は、当然、正解数を問題数で割った数値です。

 \displaystyle \frac{正解数}{問題数}

予測を評価するための数値として、きわめて真っ当に見えます。しかし、必ずしもそうではないのです。

コンピューターウィルスを予測する

「PC 内のファイルがコンピューターウィルスかそうでないか」という問題を考えてみましょう。

通常、 PC 内のファイルはほとんどがウィルスではありません。仮に、 0.01 % のファイルがウィルスだったとしましょう(かなり多いですが)。 そうすると、「全てのファイルはウィルスではない」という予測ですら、正解率は 99.99% になってしまいます。

数値は高いですが、これでは何の意味もありません。

ではこのとき、どういった数値をみる必要があるのでしょうか?

適合率 (recall)

コンピューターウィルスを予測するときは、ウィルスでないファイルをウィルスであるという誤検知が多少あったとしても、ウィルスであるファイルを確実にウィルスである、と予測したいでしょう。

 \displaystyle \frac{正しくウィルスであると予測できた数}{実際のウィルスファイル数}

正解率との違いがわかるでしょうか?表現を変えると以下のようになります。

 \displaystyle \frac{実際にウィルスであり、ウィルスだと予測できた数}{実際にウィルスであり、ウィルスだと予測できた数 + 実際にウィルスだが、ウィルスだと予測できなかった数}

このような尺度を適合率 (recall) と呼びます。

精度 (precision)

話は変わります。冒頭で、「正解率90%」と並べて「精度90%」と表現しました。実は、精度 (precision) という尺度が正解率と別に定義されています。

 \displaystyle \frac{実際にAである数}{Aであると予測した数}

さきほどのコンピューターウィルスの例を使いまわすと、以下のようになります。

 \displaystyle \frac{正しくウィルスであると予測できた数}{ウィルスだと予測し、実際にウィルスだった数 + ウィルスだと予測し、ウィルスではなかった数}

適合率と精度

さて、コンピューターウィルスを予測する際は適合率を高くしたいという話がありました。しかし、ここでも罠があります。やはり、「全てのファイルがウィルスである」という予測をすると、適合率が100%になってしまいます。確かに全てのコンピューターウィルスを検知できたのですが、これでは役に立ちません。

そこで、適合率と精度を組み合わせるという手段があります。

こんな表を用意します。ここで T : True (実際に正解), F : False (実際に不正解), P : Positive (正解と予測), N : Negative (不正解と予測) を意味します。

実際は正解 実際は不正解
正解と予測 TP FP
不正解 TN FN

ぱっと見、なんだかややこしい気がしますが、さきほどのコンピューターウィルスの例と同じです。

 適合率 = \displaystyle \frac{TP}{TP + TN}

 \displaystyle \frac{TP}{TP + FP}

これのちょうどいいバランスをとりたいわけです。例えばこんな感じだとどうでしょう。

 精度 = \displaystyle \frac{2 \times 適合率 \times 精度}{適合率 + 精度}

これは調和平均と呼ばれる平均の一種です。普通の平均だとダメなの?という疑問が湧くと思いますが、今回は割愛します。

この数値自体は F 値 (F-measure) と呼ばれます。

まとめ

というわけで、「正解率が高ければ良いというわけじゃない」という話でした。

しかし、「F値こそが正義!」というわけでもありません。単純に適合率と精度の真ん中らへんをとっているというだけですから、実際はどのあたりのバランスが「現実的に嬉しいのか」を考える必要があります。コンピューターウィルスの例では、おそらく、精度よりも適合率の方を重視した尺度を用意すべきように思います。

また、他にも ROC curve だったり AUC だったり、今回みた以外にもいろいろな尺度があります。奥が深いですね。

専門家ではないのでこのへんで。