本文へスキップ
ひもとくAI

正解率だけでは分からない:F値と、多クラスの平均

レッスン 1/6

この章で学ぶこと:「正解率が高い = よいAI」とは限らない

第8章までで、モデルを作り、過学習を防ぎ、交差検証で設定を選べるようになりました。この章では、作ったモデルを 正しく評価し、正しく使う ための考え方を学びます。

  • 評価の落とし穴(このレッスンと次のレッスン)
  • データリーク(レッスン3)
  • 再現性(レッスン4)
  • 公平性(レッスン5)
  • 説明性(レッスン6)

どれも、正解率の数字だけを見ていると気づけない問題です。

本物のデータで確かめる:「9かどうか」を当てる

第5章で、「クラスの数に大きな偏りがあるデータ(不均衡データ)では、正解率だけでは評価できない」ことを学びました。手書き数字のデータで、実際に確かめます。「9かどうか」の2クラスの分類にすると、テストデータ450枚のうち、9は47枚(10.4%)だけです。

モデル正解率再現率(9を見つけた割合)
いつも「9ではない」と答える0.8960
ロジスティック回帰0.9800.809

何も学習せず「9ではない」と答えるだけで、正解率は約9割になります。ロジスティック回帰は正解率0.980ですが、混同行列を見ると、9を47枚中9枚見逃していました。

予測: 9ではない予測: 9
本当は9ではない(403枚)4030
本当は9(47枚)9(見逃し)38

正解率0.980という数字からは、「9の約5枚に1枚を見逃している」ことは読み取れません。

出典: Alpaydin, E. & Kaynak, C. (1998). Optical Recognition of Handwritten Digits [Dataset]. UCI Machine Learning Repository. https://doi.org/10.24432/C50P49 ライセンス: CC BY 4.0

F値と、多クラスの平均のとり方

F値:適合率と再現率を、1つの数にまとめる

第5章で学んだとおり、適合率(予測した中で本当に当たっていた割合)と再現率(本当の中で見つけられた割合)は、片方を上げるともう片方が下がりやすい関係にあります。2つの数を1つにまとめて比べたいときに使うのが F値 です。

F値=2×適合率×再現率適合率+再現率\text{F値} = \frac{2 \times \text{適合率} \times \text{再現率}}{\text{適合率} + \text{再現率}}

前のスライドのロジスティック回帰は、適合率1.000、再現率0.809なので、F値は次のようになります。

2×1.000×0.8091.000+0.809=1.6181.809≈0.894\frac{2 \times 1.000 \times 0.809}{1.000 + 0.809} = \frac{1.618}{1.809} \approx 0.894

F値は、ふつうの平均(この場合 1.000+0.8092≈0.905\frac{1.000 + 0.809}{2} \approx 0.905)より、小さい方の値に引っ張られる 性質があります。例えば、適合率1.0、再現率0.0なら、ふつうの平均は0.5ですが、F値は0です。「どちらかが極端に悪いモデル」を、高く評価しないための工夫です。

多クラスのときの平均:micro平均とmacro平均

クラスが3つ以上あるときは、クラスごとに適合率・再現率を求め、それをまとめます。まとめ方は2通りあります。

  • micro平均: 全部のデータをまとめて数えてから計算する。データの多いクラスの結果が強く効く
  • macro平均: クラスごとに計算してから、クラスの数で平均する。どのクラスも同じ重さで効く

例えば、3クラスのデータで、次のような結果だったとします。

クラスデータの数正しく見つけた数再現率
A80780.975
B1590.600
C510.200
  • micro平均の再現率: 78+9+180+15+5=88100=0.88\frac{78 + 9 + 1}{80 + 15 + 5} = \frac{88}{100} = 0.88(この場合、正解率と同じ)
  • macro平均の再現率: 0.975+0.600+0.2003≈0.592\frac{0.975 + 0.600 + 0.200}{3} \approx 0.592

micro平均では0.88と高く見えますが、macro平均は0.592で、数の少ないクラスCをほとんど見つけられていない ことが表れます。数の少ないクラスこそ大事な場面(めずらしい病気、不正な取引など)では、macro平均やクラスごとの値を必ず確かめます。

(補足)数値を予測する回帰の評価指標

ここまでは分類の話でした。数値を予測する回帰(第4章)では、第4章の 平均二乗誤差(MSE、誤差の2乗の平均)のほかに、次の指標もよく使います。

  • RMSE: 平均二乗誤差の平方根。2乗したものを元に戻すので、予測したい値と同じ単位(円、cmなど)で「だいたいどれくらい外れるか」を表せる
  • MAE(平均絶対誤差): 誤差の絶対値の平均。2乗しないので、大きく外れた少数のデータに引っ張られにくい

例えば誤差が (1,−1,4)(1, -1, 4) なら、MSEは 1+1+163=6\frac{1 + 1 + 16}{3} = 6、RMSEは 6≈2.45\sqrt{6} \approx 2.45、MAEは 1+1+43=2\frac{1 + 1 + 4}{3} = 2 です。

Pythonで評価指標を求める、よくある誤解と振り返り

scikit-learnの metrics には、評価指標を求める関数がそろっています。

from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score

y_true = [0, 0, 0, 1, 1, 1, 1, 0]      # 本当の正解
y_pred = [0, 0, 1, 1, 1, 0, 1, 0]      # モデルの予測

print(confusion_matrix(y_true, y_pred))   # → [[3, 1], [1, 3]]
print(precision_score(y_true, y_pred))    # → 0.75(予測した4件のうち3件が当たり)
print(recall_score(y_true, y_pred))       # → 0.75(本当の4件のうち3件を見つけた)
print(f1_score(y_true, y_pred))           # → 0.75

多クラスのときは、recall_score(y_true, y_pred, average="macro") のように、average でまとめ方を指定します("micro" か "macro")。

confusion_matrix の結果は、行が本当の正解、列が予測です。[[3, 1], [1, 3]] は、「本当は0で予測も0が3件、本当は0で予測は1が1件、本当は1で予測は0が1件、本当は1で予測も1が3件」という意味です。

よくある誤解

  • 「正解率0.98なら、ほとんど間違えない」: 「9かどうか」の例では、正解率0.980でも、9の約5枚に1枚を見逃していました。何をどれくらい間違えているかは、混同行列を見ないと分かりません
  • 「F値は、適合率と再現率のふつうの平均」: F値は、小さい方の値に引っ張られる特別な平均です
  • 「多クラスなら、micro平均を見れば十分」: micro平均は、数の多いクラスの結果に強く引っ張られます。数の少ないクラスの結果は、macro平均やクラスごとの値で確かめます

振り返り

  • 不均衡なデータでは、正解率は当てにならない。混同行列で、何をどれくらい間違えているかを見る
  • F値は、適合率と再現率をまとめた数。どちらかが極端に悪いと小さくなる
  • 多クラスでは、micro平均(全部まとめて計算)とmacro平均(クラスごとに計算して平均)を使い分ける

演習

演習を読み込んでいます…