Model Evaluator について
Model Evaluatorは、機械学習モデルを厳密に評価・比較するためのスキルです。予測性能、効率、頑健性、公平性、キャリブレーションを扱い、評価設計、統計検定、LLM固有の評価も支援します。
主な機能
- 01タスクに適した評価指標の選定
- 02テストセットと評価手順の設計
- 03モデル比較と有意性の検定
- 04LLMの品質と効率の評価
- 05頑健性、公平性、キャリブレーションの分析
活用シーン
- 01分類や生成タスクの指標選定
- 02候補モデルの比較とレポート作成
- 03LLMの精度、レイテンシ、コストの評価
- 04分布変化やサブグループ別のモデル挙動確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jmsktm/ claude-settings --skill model-evaluatorインストール後、Claude Code で/model-evaluatorを入力して読み込まれたか確認します。
詳細
モデル評価
モデル評価スキルは、複数の観点から機械学習モデルの性能を厳密に評価・比較するのに役立ちます。適切な指標の選択、評価プロトコルの設計、よくある統計上の落とし穴の回避、データに基づくモデル選択の判断をサポートします。
適切なモデル評価には、精度スコアの確認だけでは不十分です。このスキルでは、予測性能、計算効率、堅牢性、公平性、キャリブレーション、本番環境への適合性まで、幅広い観点から評価します。「どのモデルが最適か」だけでなく、「自分の具体的なユースケースや制約に最適なモデルはどれか」という問いにも答えられるよう支援します。
LLM、分類器、カスタムモデルのいずれを比較する場合も、このスキルを使えば、評価方法が妥当で、信頼できる結論を導き出せます。
コアワークフロー
ワークフロー 1:評価プロトコルの設計
- 評価目標を定義します:
- 主な目標(精度、速度、コストなど)
- 副次的な制約
- テストする障害モード
- シミュレーションする実環境の条件
- 適切な指標を選択します:
タスクの種類 主な指標 副次的な指標 分類 正解率、F1、AUC-ROC 適合率、再現率、混同行列 回帰 RMSE、MAE、R-squared 残差分析、予測区間 ランキング NDCG、MRR、MAP Precision@k、Recall@k 生成 BLEU、ROUGE、BERTScore 人間による評価、忠実性 LLM タスク固有の正解率 レイテンシ、コスト、一貫性 - テストセットを設計します:
- ホールドアウトテストデータ
- エッジケースのコレクション
- 敵対的な例
- 分布シフトテスト
- 統計的手法を計画します:
- 統計的有意性を検証するためのサンプルサイズ
- 信頼区間
- 多重比較の補正
ワークフロー 2:比較評価の実施
- 評価インフラストラクチャを準備します:
class ModelEvaluator: def __init__(self, test_data, metrics): self.test_data = test_data self.metrics = metrics self.results = {} def evaluate(self, model, model_name): predictions = model.predict(self.test_data.inputs) scores = {} for metric in self.metrics: scores[metric.name] = metric.compute( predictions, self.test_data.labels ) self.results[model_name] = scores return scores def compare(self): return statistical_comparison(self.results) - すべてのモデルで一貫した方法で評価を実行します
- 信頼区間を算出します
- 統計的有意性を検定します
- 比較レポートを作成します
ワークフロー 3:LLM 固有の評価
- 評価の観点を定義します:
- タスクの正確性(事実性、推論、コーディング)
- 回答の質(一貫性、関連性、スタイル)
- 安全性とアラインメント
- 効率性(トークン数、レイテンシ、コスト)
- 評価データセットを作成します:
- 代表的なプロンプト
- 正解データ(該当する場合)
- 人間の選好データ
- LLM 評価を実装します:
- 自動評価指標(完全一致、意味的類似度)
- LLM-as-judge による評価
- 人間による評価プロトコル
- 複数の観点から結果を分析します
- トレードオフを踏まえた推奨事項を提示します
クイックリファレンス
| 操作 | コマンド/トリガー |
|---|---|
| 評価を設計する | 「[model type] をどのように評価すればよいですか」 |
| 指標を選択する | 「[task type] にはどの指標を使えばよいですか」 |
| モデルを比較する | 「これらのモデルを比較してください:[list]」 |
| LLM を評価する | 「LLM の性能を評価してください」 |
| 統計的検定 | 「この差は有意ですか」 |
| バイアス評価 | 「モデルにバイアスがないか確認してください」 |
ベストプラクティス
-
複数の指標を使用する:単一の指標では全体像を把握できません
- 集約指標と詳細指標の両方を含めます
- 点推定値だけでなく、信頼区間も報告します
- サブグループごとの性能を示します
-
現実的なデータでテストする:評価データは本番環境と一致している必要があります
- 実際の入力と同じ分布にします
- エッジケースや難しい例を含めます
- モデルが見たことのないデータでテストします
-
ばらつきを考慮する:モデルとデータにはランダム性があります
- 学習ベースの評価では、複数のシードを使って実行します
- ブートストラップ法で信頼区間を算出します
- 比較には適切な統計検定を使用します
-
あらゆるコストを考慮する:性能は精度だけではありません
- 推論のレイテンシとスループット
- メモリと計算リソースの要件
- ホスト型モデルの API コスト
- メンテナンスと更新の負担
-
堅牢性をテストする:モデルは困難な状況にどのように対処するでしょうか?
- 入力の摂動やノイズ
- 分布シフト
- 敵対的サンプル
- 欠損した入力や不正な形式の入力
-
公平に評価する:モデル間の公平な比較を確保します
- すべてのモデルに同じテストデータを使用します
- 前処理を統一します
- ハイパーパラメーター調整にかける労力を同等にします
- 利点と欠点をすべて記録します
高度な手法
多次元評価
複数の軸でモデルを採点します:
def multi_dim_evaluate(model, test_data):
return {
"accuracy": compute_accuracy(model, test_data),
"latency_p50": measure_latency(model, test_data, percentile=50),
"latency_p99": measure_latency(model, test_data, percentile=99),
"memory_mb": measure_memory(model),
"cost_per_1k": compute_cost(model, n=1000),
"robustness": adversarial_accuracy(model, test_data),
"fairness": demographic_parity(model, test_data)
}
LLM-as-Judge プロトコル
LLM を使って LLM の出力を評価します:
Prompt template:
"Rate the following response on a scale of 1-5 for:
- Accuracy: Is the information correct?
- Helpfulness: Does it address the user's need?
- Clarity: Is it easy to understand?
Question: {question}
Response: {response}
Ground truth (if available): {ground_truth}
Provide scores and brief justification."
A/B テストのフレームワーク
本番環境での評価に使用します:
class ABTest:
def __init__(self, model_a, model_b, traffic_split=0.5):
self.models = {"A": model_a, "B": model_b}
self.split = traffic_split
self.results = {"A": [], "B": []}
def serve(self, request):
variant = "A" if random.random() < self.split else "B"
response = self.models[variant].predict(request)
return response, variant
def record_outcome(self, variant, success):
self.results[variant].append(success)
def compute_significance(self):
return statistical_test(self.results["A"], self.results["B"])
キャリブレーション分析
予測確率に意味があることを確認します:
- Expected Calibration Error (ECE)
- Reliability diagrams
- Brier score decomposition
- Temperature scaling for recalibration
避けるべきよくある落とし穴
- 評価を繰り返してテストセットに過剰適合する
- モデル比較における統計的有意性を無視する
- タスクに不適切な指標を使用する(クラスの不均衡がある場合の正解率など)
- 学習データに似すぎたデータで評価する
- モデル選定で計算コストを無視する
- 分布シフトに対する堅牢性をテストしない
- A/B テストで相関と因果関係を混同する
- 統計検定で多重比較を考慮しない