Velvet Theory AIとデータの話を、やわらかく、筋道立てて。

機械学習の全体地図(4)評価指標と落とし穴

タスク別の評価指標を整理し、閾値を動かして適合率と再現率の関係を確かめます。よくある落とし穴と、うまくいかないときの見直し方もまとめます。

連載 機械学習の全体地図 第4回/全8回
  1. 第1回全体像と「学び方」
  2. 第2回タスクとモデル
  3. 第3回作って確かめる手順
  4. 第4回評価指標と落とし穴
  5. 第5回深層学習とLLM
  6. 第6回運用と責任あるAI
  7. 第7回Pythonで書く
  8. 第8回通しチュートリアル:解約予測

評価指標:タスク別の全パターン

②のタスクごとに使う指標が決まります。分類では、見つけたい側(解約する、病気がある など)を陽性、そうでない側を陰性と呼びます。TP=陽性を正しく陽性、FP=陰性を誤って陽性、FN=陽性を見逃し、TN=陰性を正しく陰性。

予測:陽性予測:陰性実際:陽性実際:陰性TP正しく陽性FN見逃しFP誤報TN正しく陰性適合率 = TP ÷ 左の列(陽性と予測した全件)再現率 = TP ÷ 上の行(実際に陽性の全件)
混同行列:分類の結果を4つに数え分けた表。scikit-learnの 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・mAPIoUは予測した枠と正解の枠の重なりの割合。mAPは、IoUで当たり外れを判定した検出精度を物体の種類ごとに平均したもの
F1(要素単位)系列ラベリングで、抜き出した人名などが正解と一致した割合。翻訳・要約は下の生成と同じ指標
クラスタリングシルエット係数
Silhouette coefficient
正解なしで、まとまりの良さを測る
ARI など正解のグループ分けがある場合の一致度
次元削減説明分散比・復元誤差元の情報をどれだけ残せたか(説明分散比は、元のばらつきのうち残せた割合)。最終的には、圧縮したデータを使う次の処理(分類など)の成績で判断する
異常検知適合率・再現率・PR-AUC一部でも異常ラベルがあれば分類の指標で評価
相関ルール支持度・確信度・リフト組み合わせの出現頻度、条件付きの起きやすさ、偶然と比べた起きやすさ(リフトが1を超えると関連あり)
生成パープレキシティ・BLEU・ROUGE・FID・人手評価文章は次単語の当てやすさや参照文との一致、画像は本物との分布の近さ。最終的には人手評価が重要
強化学習累積報酬(平均リターン)1回の試行(エピソード)で得た報酬の合計を、複数回の試行で平均したもの
判定の閾値。分類モデルの多くは「陽性らしさ」を確率で出し、閾値(例:0.5)で陽性か陰性かを決めます。閾値を上げると、再現率は下がるか変わらず(上がることはありません)、適合率はおおむね上がります(必ず上がるとは限りません)。そのため、誤報と見逃しのどちらが業務上高くつくかで閾値を決めます。

動かしてみる:判定の閾値を変える

実際に陽性 実際に陰性 判定の誤り

数式で見る:評価指標
MAE = (1/n) Σ |yi − ŷi|
RMSE = √[ (1/n) Σ (yi − ŷi)2 ]
R2 = 1 − Σ (yi − ŷi)2 / Σ (yi − ȳ)2

ȳ は実測値の平均です。「平均値で予測したとき」と比べて誤差がどれだけ減ったかを表すので、平均値より悪いと負になります。

正解率 = (TP + TN)/全件
適合率 P = TP/(TP + FP)
再現率 R = TP/(TP + FN)
F1 = 2PR/(P + R)

F1は調和平均なので、適合率と再現率のどちらかが低いと大きく下がります。

理解度チェック

よくある落とし穴

データリーク Data leakage

予測時には手に入らない情報が学習に混ざり、評価だけ異常に良くなる。原因は、標準化などの前処理を全データで計算する、未来の情報を特徴量に入れる、正解から作った特徴量を使う、など。前処理は学習用データだけで計算し、検証・テストに適用する。

偏ったデータを正解率だけで評価する

陽性が1%なら「全部陰性」で正解率99%になる。適合率・再現率・PR-AUCを見る。

テストデータで調整してしまう

テストの結果を見てモデルを直すと、テストにも過学習する。調整は検証データで行い、テストは最後に1回だけ。

時系列データのシャッフル

未来のデータで過去を当てる形になり、本番より良い成績が出る。

相関を因果と取り違える

予測に効く特徴量が、原因であるとは限らない。施策の効果を知りたいなら、因果推論(原因と結果の関係を推定する手法)やA/Bテストが必要。

学習時と本番の分布の違い

季節・利用者層・仕様変更で入力の傾向が変わると精度が落ちる。監視と再学習を運用に組み込む。

困ったとき

よくある困りごとごとに、原因の候補と対処をまとめました。タップすると開きます。

正解ラベルがない、または少ない

原因の候補:予測したい答えのデータが記録されていない、ラベル付けに手間がかかる。

対処:ラベルがないなら、まずクラスタリングや異常検知でデータの構造を見る。予測が目的なら、少量でもラベルを付ける(能動学習で付ける対象を絞る)。少ないなら、学習済みモデルの転移学習、半教師あり学習、データ拡張を使う。文章なら、LLMへのプロンプトで試す方法もある。

① 学び方学習済みモデルを使うモデルの選び方

データが少ない(数百件以下)

原因の候補:集められる件数に限りがある。

対処:正則化付きの線形モデルなど単純なモデルを使い、特徴量は業務知識で絞る。評価は交差検証で行い、結果のばらつきを見る。差がわずかなら単純なモデルを選ぶ。画像や文章なら学習済みモデルを使う。

モデルの選び方交差検証コード例:回帰

陽性がごく少ない(クラスが偏っている)

原因の候補:不正・故障・解約など、見つけたい側がまれにしか起きない。

対処:正解率ではなく再現率やPR-AUCで評価する。分割は層化で行う。クラスの重みを付ける、閾値を調整する、学習用データだけでサンプリングする。

閾値を動かすコード例評価指標

学習データでは良いのに、検証データで悪い

原因の候補:過学習。または、学習用と検証用でデータの時期や対象が違う。

対処:正則化を強める、モデルを単純にする、データを増やす、特徴量を減らす。分割方法がデータに合っているかも確認する。

過学習と未学習複雑さを動かすコード例

学習データでも検証データでも悪い

原因の候補:未学習。入力に予測の手がかりが足りない。正解ラベルに誤りが多い。

対処:まずベースラインと比べ、少しでも上回っているかを確認する。モデルを複雑にする、業務知識から特徴量を作る、ラベルの誤りを点検する。手がかりそのものがない場合は、集めるデータから見直す。

過学習と未学習前処理と特徴量コード例:回帰

検証では良かったのに、テストや本番で悪い

原因の候補:データリーク、検証データに合わせすぎたチューニング、データに合わない分割方法、本番データの変化。

対処:前処理を学習用データだけで計算しているか、予測時点で手に入らない情報を使っていないかを確認する。時系列なら時系列分割、同じ人の行が複数あるならグループ分割にする。

よくある落とし穴分割方法運用

本番で精度がだんだん落ちてきた

原因の候補:データドリフト、コンセプトドリフト、学習時と本番の前処理のずれ。

対処:入力と予測の分布を監視し、変化を合図に原因を調べて再学習する。前処理ごとモデルを保存して、学習時と同じ処理を使う。

監視変化の検知保存と予測

予測の理由を説明するよう求められた

原因の候補:複雑なモデルを使っている、説明の相手と目的が決まっていない。

対処:誰に何を説明するかを決める。説明しやすいモデルを選ぶか、特徴量重要度やSHAPを使う。示せるのは「モデルが何を手がかりにしたか」で、因果関係ではないことも伝える。

説明可能性コード例

どのモデルを使えばいいかわからない

原因の候補:選択肢が多く、比べる基準がない。

対処:まずベースラインを作り、データの種類に合った定番モデルを2〜3個、同じ交差検証で比べる。

手法ナビモデルの選び方通しチュートリアル

LLMの回答が間違う、社内の情報を答えられない

原因の候補:ハルシネーション、学習データにない知識、指示があいまい。

対処:関係する文書を検索して渡す(RAG)。指示を具体的にし、望ましい回答の例を示す。重要な内容は人が確認する。

3つの選択肢LLMの限界

計算に時間がかかりすぎる

原因の候補:データや特徴量が多い、探索する設定の組み合わせが多い。

対処:一部のデータで試してから全体に広げる。大規模データ向けの実装(scikit-learnなら HistGradientBoosting)を使う。設定の探索は、グリッドサーチの代わりにランダムサーチやベイズ最適化を使う。深層学習ならGPUを使う。

ハイパーパラメータの探し方Pythonの対応表

Spark