機械学習の全体地図(4)評価指標と落とし穴
タスク別の評価指標を整理し、閾値を動かして適合率と再現率の関係を確かめます。よくある落とし穴と、うまくいかないときの見直し方もまとめます。
連載 機械学習の全体地図 第4回/全8回
評価指標:タスク別の全パターン
②のタスクごとに使う指標が決まります。分類では、見つけたい側(解約する、病気がある など)を陽性、そうでない側を陰性と呼びます。TP=陽性を正しく陽性、FP=陰性を誤って陽性、FN=陽性を見逃し、TN=陰性を正しく陰性。
confusion_matrix は陰性(0)が先に並ぶため、[[TN, FP], [FN, TP]] とこの図の上下左右が逆になる。| タスク | 指標 | 意味と使い分け |
|---|---|---|
| 回帰 | MAE | 誤差の絶対値の平均。外れ値の影響を受けにくい |
| RMSE | 二乗誤差の平均の平方根。大きな外れを重く罰する | |
| 決定係数 R² Coefficient of determination | 1が最良。平均値で予測するより悪いと負になる | |
| MAPE | 誤差の割合の平均。実測値が0に近いと不安定(scikit-learnは10%を0.1と割合で返す) | |
| 分類 | 混同行列 Confusion matrix | TP・FP・FN・TNの件数表。すべての指標の土台 |
| 正解率 Accuracy | 当たった割合。クラスが偏ると役に立たない(99%が陰性なら全部陰性で99%) | |
| 適合率 Precision | TP÷(TP+FP)。陽性と言ったうち本当に陽性の割合。誤報を避けたいとき | |
| 再現率 Recall | TP÷(TP+FN)。本当の陽性のうち見つけた割合。見逃しを避けたいとき | |
| F1スコア F1 score | 適合率と再現率の調和平均(どちらか低い方に引っ張られる平均) | |
| ROC-AUC/PR-AUC | 閾値によらない総合評価。ROC-AUCは「陽性を陰性より上位に並べられる確率」で、0.5が当てずっぽう、1が完璧。PR-AUCは閾値を動かしたときの適合率と再現率を総合した値。偏りが大きいときはPR-AUCが実態を表しやすい(scikit-learnでは average_precision_score で計算) | |
| 対数損失 Log loss | 予測確率の正確さ。確率そのものを使う場合に重要 | |
| 多クラス | マクロ平均/マイクロ平均 Macro / Micro average | クラスごとの指標を単純平均するか、全件まとめて計算するか。少数クラスを重視するならマクロ |
| ランキング | NDCG・MAP・MRR・Precision@k | 上位に正解が来ているほど高い(Precision@kは、上位k件のうち正解の割合) |
| 構造化予測 | IoU・mAP | IoUは予測した枠と正解の枠の重なりの割合。mAPは、IoUで当たり外れを判定した検出精度を物体の種類ごとに平均したもの |
| F1(要素単位) | 系列ラベリングで、抜き出した人名などが正解と一致した割合。翻訳・要約は下の生成と同じ指標 | |
| クラスタリング | シルエット係数 Silhouette coefficient | 正解なしで、まとまりの良さを測る |
| ARI など | 正解のグループ分けがある場合の一致度 | |
| 次元削減 | 説明分散比・復元誤差 | 元の情報をどれだけ残せたか(説明分散比は、元のばらつきのうち残せた割合)。最終的には、圧縮したデータを使う次の処理(分類など)の成績で判断する |
| 異常検知 | 適合率・再現率・PR-AUC | 一部でも異常ラベルがあれば分類の指標で評価 |
| 相関ルール | 支持度・確信度・リフト | 組み合わせの出現頻度、条件付きの起きやすさ、偶然と比べた起きやすさ(リフトが1を超えると関連あり) |
| 生成 | パープレキシティ・BLEU・ROUGE・FID・人手評価 | 文章は次単語の当てやすさや参照文との一致、画像は本物との分布の近さ。最終的には人手評価が重要 |
| 強化学習 | 累積報酬(平均リターン) | 1回の試行(エピソード)で得た報酬の合計を、複数回の試行で平均したもの |
動かしてみる:判定の閾値を変える
実際に陽性 実際に陰性 判定の誤り
数式で見る:評価指標
ȳ は実測値の平均です。「平均値で予測したとき」と比べて誤差がどれだけ減ったかを表すので、平均値より悪いと負になります。
F1は調和平均なので、適合率と再現率のどちらかが低いと大きく下がります。
理解度チェック
よくある落とし穴
データリーク Data leakage
予測時には手に入らない情報が学習に混ざり、評価だけ異常に良くなる。原因は、標準化などの前処理を全データで計算する、未来の情報を特徴量に入れる、正解から作った特徴量を使う、など。前処理は学習用データだけで計算し、検証・テストに適用する。
偏ったデータを正解率だけで評価する
陽性が1%なら「全部陰性」で正解率99%になる。適合率・再現率・PR-AUCを見る。
テストデータで調整してしまう
テストの結果を見てモデルを直すと、テストにも過学習する。調整は検証データで行い、テストは最後に1回だけ。
時系列データのシャッフル
未来のデータで過去を当てる形になり、本番より良い成績が出る。
相関を因果と取り違える
予測に効く特徴量が、原因であるとは限らない。施策の効果を知りたいなら、因果推論(原因と結果の関係を推定する手法)やA/Bテストが必要。
学習時と本番の分布の違い
季節・利用者層・仕様変更で入力の傾向が変わると精度が落ちる。監視と再学習を運用に組み込む。
困ったとき
よくある困りごとごとに、原因の候補と対処をまとめました。タップすると開きます。
正解ラベルがない、または少ない
原因の候補:予測したい答えのデータが記録されていない、ラベル付けに手間がかかる。
対処:ラベルがないなら、まずクラスタリングや異常検知でデータの構造を見る。予測が目的なら、少量でもラベルを付ける(能動学習で付ける対象を絞る)。少ないなら、学習済みモデルの転移学習、半教師あり学習、データ拡張を使う。文章なら、LLMへのプロンプトで試す方法もある。
データが少ない(数百件以下)
陽性がごく少ない(クラスが偏っている)
学習データでは良いのに、検証データで悪い
学習データでも検証データでも悪い
検証では良かったのに、テストや本番で悪い
本番で精度がだんだん落ちてきた
予測の理由を説明するよう求められた
どのモデルを使えばいいかわからない
LLMの回答が間違う、社内の情報を答えられない
計算に時間がかかりすぎる
原因の候補:データや特徴量が多い、探索する設定の組み合わせが多い。
対処:一部のデータで試してから全体に広げる。大規模データ向けの実装(scikit-learnなら HistGradientBoosting)を使う。設定の探索は、グリッドサーチの代わりにランダムサーチやベイズ最適化を使う。深層学習ならGPUを使う。
Spark