ml-evaluation について
機械学習システムを導入前・運用中・導入後に評価するためのガイドです。指標やデータ分割を意思決定に合わせ、不確実性や誤りを調べ、本番環境での確認を計画できます。
主な機能
- 01意思決定に沿った指標選択
- 02グループ別・時系列分割の設計
- 03信頼区間と対応検定による比較
- 04エラーの層別分析と堅牢性評価
- 05導入評価とドリフト監視の計画
活用シーン
- 01データ分割間の漏洩防止
- 02共通テスト例でのモデル比較
- 03ユーザー群ごとの性能確認
- 04導入前の監視・ロールバック基準の設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ josiahsiegel/ claude-plugin-marketplace --skill ml-evaluationインストール後、Claude Code で/ml-evaluationを入力して読み込まれたか確認します。
詳細
ML 評価
概要
このスキルは、デプロイ前、デプロイ中、デプロイ後に機械学習システムを評価する際に使用します。妥当な評価では、モデルを使ってどのような判断を行うのか、どのデータ分布が重要なのか、どのような失敗コストがあるのか、それらのコストをどの指標で表すのか、そして測定された改善がデータリーク、分散、検証データへの過学習によるものではなく、本物なのかを明らかにします。
評価設計チェックリスト
- 予測の単位と、独立性の単位を定義します。例が相関している場合は、ユーザー、アカウント、患者、デバイス、ドキュメント、セッション、時間ごとに分割します。
- 単純なヒューリスティック、既存のモデル、または線形モデルや決定木モデルを使ってベースライン性能を確立します。
- 手軽なデフォルト値ではなく、判断に合致した指標を選びます。
- 最終評価までテストデータを固定し、調整には検証データを使用します。
- ラベル、地域、デバイス、言語、適切な場合は人口統計グループ、データソース、期間、既知の難しいケースごとに評価します。
- サンプルサイズが限られている場合は、信頼区間や反復 CV を使って不確実性を報告します。
- モデルの複雑さを高める前に、定性的な誤り分析を行います。
分割戦略
ランダムな層化分割は、例が独立している iid データに限って使用します。複数の行が同じエンティティを共有する場合は、グループ分割を使用します。予測、レコメンデーション、不正検出、ログ、および将来のデータが過去のデータと異なるデプロイでは、時間ベースの分割を使用します。ハイパーパラメーターと性能推定の両方で偏りをなくす必要がある場合は、ネストした交差検証を使用します。小規模なデータセットでは、層化 CV を繰り返すことで分散を減らせますが、重要度の高い用途では、最終的なテストセットを未使用のまま保持してください。
データリークを防ぐための包括的なチェックリスト
- 分割してから適合:
scaler.fit()、imputer.fit()、エンコーダーの適合は、トレーニングサブセットに対してのみ行います。データセット全体に対して適合してはいけません。 - 時間的単調性:時系列分割では、検証/テストのインデックスがトレーニングのインデックスよりも時間的に厳密に後であることを確認します。
- グループの分離:共通のグループ要因(患者 ID、会社 ID、セッション ID など)を共有するデータポイントが、トレーニングセットとテストセットの両方にまたがっていないことを確認します。
- ターゲットリーク:予測時点より後に発生するイベントを表す列(解約モデルにおける「refunded_date」など)がないか確認します。
- 分割前のデータ拡張は禁止:少数クラスのオーバーサンプリング(SMOTE など)やデータ拡張は、分割後に行います。分割前にオーバーサンプリングすると、合成された重複データが境界をまたいで配置されます。
指標の選択
| タスク | 推奨指標 | 注意点 |
|---|---|---|
| バランスの取れた分類 | Accuracy、macro F1、log loss | Accuracy ではキャリブレーションや少数クラスの誤りが見えません |
| 不均衡分類 | PR-AUC、適合率を指定した再現率、F-beta、コスト効用 | ROC-AUC が高くても、陽性の適合率が低い場合があります |
| 確率分類 | Log loss、Brier score、キャリブレーション曲線 | 閾値ベースの指標では確率の品質を評価できません |
| 回帰 | MAE、RMSE、RMSLE、pinball loss、R2 | RMSE は外れ値を過度に重視し、MAPE はゼロ付近で機能しません |
| ランキング/検索 | NDCG、MAP、MRR、recall@k、precision@k | オフラインの負例が本番環境の候補と一致しない場合があります |
| 予測 | sMAPE、MASE、pinball loss、coverage | ランダム分割では将来のパターンがリークします |
| 生成 | タスク固有の人間/評価モデル用ルーブリックと自動チェック | BLEU/ROUGE だけでは、有用性や安全性を見落とすことがよくあります |
| Embeddings/RAG | Recall@k、MRR、回答の忠実性、根拠の確かさ、レイテンシ | 検索と生成の失敗は分けて評価する必要があります |
重要度の高い判断では、混同行列とコスト曲線を使って運用閾値を評価します。検証データで閾値を最適化してから、固定した閾値でのテスト性能を報告します。判断に確率を使用する場合は、確率をキャリブレーションします。
統計的比較
単純な指標の差を、証明とみなしてはいけません。同じ例でモデルを評価する場合は、対応のある比較を使用します。
ブートストラップ信頼区間(Python のレシピ)
import numpy as np
from sklearn.metrics import f1_score
def bootstrap_metric_ci(
y_true: np.ndarray,
y_pred: np.ndarray,
metric_fn = f1_score,
n_bootstrap: int = 1000,
confidence_level: float = 0.95
):
bootstrapped_scores = []
rng = np.random.default_rng(seed=42)
n_samples = len(y_true)
for _ in range(n_bootstrap):
# Sample with replacement
indices = rng.choice(n_samples, size=n_samples, replace=True)
score = metric_fn(y_true[indices], y_pred[indices])
bootstrapped_scores.append(score)
sorted_scores = np.sort(bootstrapped_scores)
alpha = 1.0 - confidence_level
lower_idx = int(np.floor(alpha / 2.0 * n_bootstrap))
upper_idx = int(np.ceil((1.0 - alpha / 2.0) * n_bootstrap))
return sorted_scores[lower_idx], sorted_scores[upper_idx]
対応のある分類器を比較するためのマクネマー検定
マクネマー検定は、2 つのモデルの不一致が有意かどうかを評価します。
import numpy as np
from scipy.stats import chi2_contingency
def mcnemar_test(y_true: np.ndarray, pred_model_a: np.ndarray, pred_model_b: np.ndarray):
# Contingency Table:
# Model B Correct Model B Incorrect
# Model A Correct n00 n01
# Model A Incorrect n10 n11
correct_a = (pred_model_a == y_true)
correct_b = (pred_model_b == y_true)
n01 = np.sum(correct_a & ~correct_b) # A correct, B incorrect
n10 = np.sum(~correct_a & correct_b) # A incorrect, B correct
# Calculate chi-squared with continuity correction
if n01 + n10 == 0:
return 1.0 # Perfect agreement
statistic = (abs(n01 - n10) - 1)**2 / (n01 + n10)
# 1 degree of freedom
from scipy.stats import chi2
p_value = 1 - chi2.cdf(statistic, df=1)
return p_value
ロジットのキャリブレーションのための温度スケーリング(PyTorch)
import torch
import torch.nn as nn
import torch.optim as optim
class TemperatureScaler(nn.Module):
def __init__(self):
super().__init__()
# Initial temperature parameter of 1.0 (no scaling)
self.temperature = nn.Parameter(torch.ones(1))
def forward(self, logits: torch.Tensor):
return logits / self.temperature
def fit(self, val_logits: torch.Tensor, val_labels: torch.Tensor, max_iter: int = 50):
# Optimizes temperature parameter on validation set
nll_criterion = nn.CrossEntropyLoss()
optimizer = optim.LBFGS([self.temperature], lr=0.01, max_iter=max_iter)
def eval_loss():
optimizer.zero_grad()
loss = nll_criterion(self.forward(val_logits), val_labels)
loss.backward()
return loss
optimizer.step(eval_loss)
return self.temperature.item()
エラー分析
ランダムな失敗を調べるのではなく、体系的なエラー分類を作成します。偽陽性、偽陰性、高信頼度のエラー、低信頼度ながら正解したケース、分布外の例、欠損値、希少ラベル、ロングテールのエンティティ、プロンプトのカテゴリ、レイテンシ/タイムアウトに分けて分析します。
エラー分析は、具体的な改善策につなげます。データ収集、再ラベル付け、分割方法の変更、損失関数の変更、特徴量の追加、検索の改善、しきい値のキャリブレーション、モデルの簡素化、サービングパイプラインの調整などが挙げられます。
責任ある AI と堅牢性
関連する人口統計、地域、言語、アクセシビリティ、運用上の各スライスにおけるモデルの挙動を評価します。ドメインに適した公平性指標を選択します。たとえば、人口統計的パリティ、等化オッズ、機会均等、グループ別キャリブレーション、反実仮想一貫性などです。トレードオフを説明します。公平性指標同士が相反することがあります。ユーザーが理由を必要とする場合は、解釈可能なモデルや説明可能性ツールを使用します。ただし、説明の安定性と妥当性を検証してください。
欠損フィールド、スキーマの変更、敵対的またはノイズの多い入力、LLM/RAG システムへのプロンプトインジェクション、画像の破損、テキストの誤字、分布シフト、データの少ないスライスに対する堅牢性をテストします。データドリフト、性能ドリフト、キャリブレーションドリフト、安全性インシデントを監視する計画を立てずにデプロイしてはいけません。
本番環境での評価
オフライン指標は必要ですが、それだけでは不十分です。リリース前に、実行可能な範囲でシャドー評価、バックテスト、バッチ再生、またはカナリアリリースを実施します。同じ例を使って、学習時とサービング時の前処理結果を比較します。ロールバックのしきい値、アラートの送信先、再学習の基準、担当者を定義します。A/B テストでは、レイテンシ、コスト、ユーザーへの危害、公平性スライス、ビジネス上の制約、サポートの負荷などのガードレール指標を含めます。
よくある評価の失敗
- 検証では優れているのに、本番環境では性能が低い:データリーク、分布シフト、サービング時のずれ、しきい値の不一致、または代表性のない検証データが原因です。
- ROC-AUC は高いのに、ユーザーにとっての価値が低い:不均衡データやしきい値に基づく判断に適さない指標を使用しています。
- 平均指標は改善しているのに、重要なユーザーに悪影響が出る:スライス評価が不足しています。
- テストセットを繰り返し使用する:ベンチマークに対する隠れた過学習が生じます。
- LLM の評価結果は良好なのに、回答が幻覚を含む:自動化された語彙指標では、根拠の有無、引用の品質、拒否の挙動を測定できていません。
参考資料
- scikit-learn のモデル評価:https://scikit-learn.org/stable/modules/model_evaluation.html
- TensorFlow Model Analysis:https://www.tensorflow.org/tfx/model_analysis
- Google ML crash course の評価ガイダンス:https://developers.google.com/machine-learning/crash-course/classification
- Fairlearn のドキュメント:https://fairlearn.org/
- Evidently AI の ML モニタリングと評価の概念:https://docs.evidentlyai.com/