LESSON

オフライン評価

「モデルを本番に出す前に、手元のデータで徹底的に検証する。これがオフライン評価だ。」

田中VPoEが評価レポートを見せる。

「オフライン評価はコストゼロで何度でも試行できる。ただし、オフラインで良い結果がオンラインでも良いとは限らない。その限界も理解した上で使いこなそう。」

オフライン評価の手法

手法特徴適用場面
ホールドアウト時間分割で学習/テストを分離時系列データ
K-Fold交差検証で安定性を確認データ量が少ない場合
Leave-One-Out1件ずつ取り出して評価精緻な評価
リプレイ評価過去ログで新モデルをシミュレーション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分