この章で学ぶこと:「正解率が高い = よいAI」とは限らない
第8章までで、モデルを作り、過学習を防ぎ、交差検証で設定を選べるようになりました。この章では、作ったモデルを 正しく評価し、正しく使う ための考え方を学びます。
評価の落とし穴(このレッスンと次のレッスン)
データリーク(レッスン3)
再現性(レッスン4)
公平性(レッスン5)
説明性(レッスン6)
どれも、正解率の数字だけを見ていると気づけない問題です。
本物のデータで確かめる:「9かどうか」を当てる
第5章で、「クラスの数に大きな偏りがあるデータ(不均衡データ)では、正解率だけでは評価できない」ことを学びました。手書き数字のデータで、実際に確かめます。「9かどうか」の2クラスの分類にすると、テストデータ450枚のうち、9は47枚(10.4%)だけです。
何も学習せず「9ではない」と答えるだけで、正解率は約9割になります。ロジスティック回帰は正解率0.980ですが、混同行列を見ると、9を47枚中9枚見逃していました。
正解率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{再現率}} F 値 = 適合率 + 再現率 2 × 適合率 × 再現率
前のスライドのロジスティック回帰は、適合率1.000、再現率0.809なので、F値は次のようになります。
2 × 1.000 × 0.809 1.000 + 0.809 = 1.618 1.809 ≈ 0.894 \frac{2 \times 1.000 \times 0.809}{1.000 + 0.809} = \frac{1.618}{1.809} \approx 0.894 1.000 + 0.809 2 × 1.000 × 0.809 = 1.809 1.618 ≈ 0.894
F値は、ふつうの平均(この場合 1.000 + 0.809 2 ≈ 0.905 \frac{1.000 + 0.809}{2} \approx 0.905 2 1.000 + 0.809 ≈ 0.905 )より、小さい方の値に引っ張られる 性質があります。例えば、適合率1.0、再現率0.0なら、ふつうの平均は0.5ですが、F値は0です。「どちらかが極端に悪いモデル」を、高く評価しないための工夫です。
多クラスのときの平均:micro平均とmacro平均
クラスが3つ以上あるときは、クラスごとに適合率・再現率を求め、それをまとめます。まとめ方は2通りあります。
micro平均 : 全部のデータをまとめて数えてから計算する。データの多いクラスの結果が強く効く
macro平均 : クラスごとに計算してから、クラスの数で平均する。どのクラスも同じ重さで効く
例えば、3クラスのデータで、次のような結果だったとします。
micro平均の再現率: 78 + 9 + 1 80 + 15 + 5 = 88 100 = 0.88 \frac{78 + 9 + 1}{80 + 15 + 5} = \frac{88}{100} = 0.88 80 + 15 + 5 78 + 9 + 1 = 100 88 = 0.88 (この場合、正解率と同じ)
macro平均の再現率: 0.975 + 0.600 + 0.200 3 ≈ 0.592 \frac{0.975 + 0.600 + 0.200}{3} \approx 0.592 3 0.975 + 0.600 + 0.200 ≈ 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) ( 1 , − 1 , 4 ) なら、MSEは 1 + 1 + 16 3 = 6 \frac{1 + 1 + 16}{3} = 6 3 1 + 1 + 16 = 6 、RMSEは 6 ≈ 2.45 \sqrt{6} \approx 2.45 6 ≈ 2.45 、MAEは 1 + 1 + 4 3 = 2 \frac{1 + 1 + 4}{3} = 2 3 1 + 1 + 4 = 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平均(クラスごとに計算して平均)を使い分ける