オフライン評価
「モデルを本番に出す前に、手元のデータで徹底的に検証する。これがオフライン評価だ。」
田中VPoEが評価レポートを見せる。
「オフライン評価はコストゼロで何度でも試行できる。ただし、オフラインで良い結果がオンラインでも良いとは限らない。その限界も理解した上で使いこなそう。」
オフライン評価の手法
| 手法 | 特徴 | 適用場面 |
|---|---|---|
| ホールドアウト | 時間分割で学習/テストを分離 | 時系列データ |
| K-Fold | 交差検証で安定性を確認 | データ量が少ない場合 |
| Leave-One-Out | 1件ずつ取り出して評価 | 精緻な評価 |
| リプレイ評価 | 過去ログで新モデルをシミュレーション | A/Bテスト前の事前評価 |
時系列分割による評価
def temporal_split_evaluation(interactions, model, test_ratio=0.2):
"""時系列分割でモデルを評価"""
# タイムスタンプでソート
sorted_data = interactions.sort_values('timestamp')
# 時系列分割
split_idx = int(len(sorted_data) * (1 - test_ratio))
train_data = sorted_data.iloc[:split_idx]
test_data = sorted_data.iloc[split_idx:]
# 学習
model.fit(train_data)
# 評価
results = {}
for user_id in test_data['user_id'].unique():
user_test = test_data[test_data['user_id'] == user_id]
true_items = user_test['item_id'].tolist()
recommended = model.recommend(user_id, n=20)
rec_items = [r['item_id'] for r in recommended]
results[user_id] = {
'ndcg@10': ndcg_at_k(rec_items, true_items, 10),
'hit_rate@10': 1 if any(i in true_items for i in rec_items[:10]) else 0,
'precision@10': precision_at_k(rec_items, true_items, 10),
'recall@10': recall_at_k(rec_items, true_items, 10),
}
# 全ユーザー平均
avg_metrics = {
metric: np.mean([r[metric] for r in results.values()])
for metric in ['ndcg@10', 'hit_rate@10', 'precision@10', 'recall@10']
}
return avg_metrics
モデル比較レポート
def generate_comparison_report(models, test_data):
"""複数モデルの比較レポートを生成"""
report = []
for name, model in models.items():
metrics = temporal_split_evaluation(test_data, model)
metrics['model'] = name
report.append(metrics)
# DataFrameで比較
import pandas as pd
df = pd.DataFrame(report).set_index('model')
print("=== モデル比較レポート ===")
print(df.round(4).to_string())
print(f"\n推奨モデル: {df['ndcg@10'].idxmax()}")
return df
オフライン評価の限界
| 限界 | 説明 | 対策 |
|---|---|---|
| 表示バイアス | 過去に表示された商品しか評価できない | 傾向スコア補正 |
| ポジションバイアス | 上位表示の商品がクリックされやすい | ポジション補正モデル |
| 新規アイテム | テストデータにない商品は評価不能 | コールドスタート評価 |
| ユーザー反応 | 実際の行動変容は測れない | オンライン評価で補完 |
まとめ
| 項目 | ポイント |
|---|---|
| 時系列分割 | 推薦システムは必ず時間方向で分割 |
| 複数指標 | NDCG, Hit Rate, Precision, Recallで多角的に評価 |
| モデル比較 | 統一条件で複数モデルを比較 |
| 限界認識 | オフラインの限界を理解しオンライン評価で補完 |
チェックリスト
- 時系列分割の重要性を説明できる
- NDCG, Hit Rate等の指標を計算できる
- 複数モデルの比較レポートを作成できる
- オフライン評価の限界と対策を理解した
次のステップへ
オフライン評価を学んだ。次はオンライン評価を学ぼう。
推定読了時間: 30分