3.5 推荐系统评价指标详解:准确率、召回率、F1、NDCG,如何选择

引言

推荐系统的评估指标直接影响模型优化方向。准确率、召回率、F1、NDCG等指标各有特点,选择合适的指标至关重要。本文将深入解析这些指标的含义、计算方法和选择原则。

一、分类指标

1.1 准确率和召回率

# 准确率和召回率
from sklearn.metrics import precision_score, recall_score, f1_score

def calculate_classification_metrics(y_true, y_pred):
    """
    计算分类指标
    """
    precision = precision_score(y_true, y_pred)
    recall = recall_score(y_true, y_pred)
    f1 = f1_score(y_true, y_pred)
    
    print(f"准确率(Precision): {precision:.4f}")
    print(f"召回率(Recall): {recall:.4f}")
    print(f"F1分数: {f1:.4f}")
    
    return precision, recall, f1

print("分类指标计算函数已准备")

1.2 指标解释

# 指标解释
def metrics_explanation():
    """
    指标解释
    """
    print("=" * 60)
    print("指标解释")
    print("=" * 60)
    
    explanations = {
        '准确率(Precision)': {
            '定义': '推荐中用户喜欢的比例',
            '公式': 'TP / (TP + FP)',
            '关注': '推荐质量'
        },
        '召回率(Recall)': {
            '定义': '用户喜欢的被推荐的比例',
            '公式': 'TP / (TP + FN)',
            '关注': '推荐覆盖度'
        },
        'F1分数': {
            '定义': '准确率和召回率的调和平均',
            '公式': '2 * (Precision * Recall) / (Precision + Recall)',
            '关注': '平衡准确率和召回率'
        }
    }
    
    for metric, details in explanations.items():
        print(f"\\n{metric}:")
        for key, value in details.items():
            print(f"  {key}: {value}")
    
    return explanations

metrics_explanation()

二、排序指标

2.1 NDCG

# NDCG计算
def calculate_ndcg(y_true, y_pred_scores, k=10):
    """
    计算NDCG@K
    """
    # 排序
    sorted_indices = np.argsort(y_pred_scores)[::-1]
    sorted_true = y_true[sorted_indices][:k]
    
    # 计算DCG
    dcg = np.sum(sorted_true / np.log2(np.arange(2, len(sorted_true) + 2)))
    
    # 计算IDCG(理想DCG)
    ideal_sorted = np.sort(y_true)[::-1][:k]
    idcg = np.sum(ideal_sorted / np.log2(np.arange(2, len(ideal_sorted) + 2)))
    
    # NDCG
    ndcg = dcg / idcg if idcg > 0 else 0
    
    return ndcg

print("NDCG计算函数已准备")

2.2 MAP和MRR

# MAP和MRR
def calculate_map_mrr(y_true, y_pred_scores, k=10):
    """
    计算MAP和MRR
    """
    # 排序
    sorted_indices = np.argsort(y_pred_scores)[::-1][:k]
    sorted_true = y_true[sorted_indices]
    
    # MAP(平均精度均值)
    relevant_count = 0
    precision_sum = 0
    
    for i, is_relevant in enumerate(sorted_true, 1):
        if is_relevant:
            relevant_count += 1
            precision_sum += relevant_count / i
    
    map_score = precision_sum / np.sum(y_true) if np.sum(y_true) > 0 else 0
    
    # MRR(平均倒数排名)
    mrr_score = 0
    for i, is_relevant in enumerate(sorted_true, 1):
        if is_relevant:
            mrr_score = 1.0 / i
            break
    
    return map_score, mrr_score

print("MAP和MRR计算函数已准备")

三、指标选择

3.1 选择指南

# 指标选择指南
def metric_selection_guide():
    """
    指标选择指南
    """
    print("=" * 60)
    print("指标选择指南")
    print("=" * 60)
    
    guide = {
        '选择准确率当': [
            '关注推荐质量',
            '推荐数量有限',
            '用户对错误推荐敏感'
        ],
        '选择召回率当': [
            '关注推荐覆盖度',
            '希望推荐更多物品',
            '用户对遗漏敏感'
        ],
        '选择F1当': [
            '需要平衡准确率和召回率',
            '单一指标不够',
            '综合评估'
        ],
        '选择NDCG当': [
            '关注排序质量',
            'Top-K推荐',
            '考虑位置权重'
        ],
        '选择MAP当': [
            '关注平均精度',
            '多查询场景',
            '综合评估'
        ]
    }
    
    for condition, scenarios in guide.items():
        print(f"\\n{condition}:")
        for scenario in scenarios:
            print(f"  - {scenario}")
    
    return guide

metric_selection_guide()

四、业务指标

4.1 业务指标

# 业务指标
def business_metrics():
    """
    业务指标
    """
    print("=" * 60)
    print("业务指标")
    print("=" * 60)
    
    metrics = {
        '点击率(CTR)': {
            '定义': '推荐被点击的比例',
            '计算': '点击数 / 曝光数',
            '价值': '衡量推荐吸引力'
        },
        '转化率(CVR)': {
            '定义': '推荐转化为购买的比例',
            '计算': '购买数 / 点击数',
            '价值': '衡量推荐商业价值'
        },
        'GMV': {
            '定义': '成交总额',
            '计算': '推荐带来的总成交额',
            '价值': '直接商业价值'
        },
        '用户满意度': {
            '定义': '用户对推荐的满意度',
            '计算': '通过评分、反馈等',
            '价值': '长期用户价值'
        }
    }
    
    for metric, details in metrics.items():
        print(f"\\n{metric}:")
        for key, value in details.items():
            print(f"  {key}: {value}")
    
    return metrics

business_metrics()

五、总结与思考

5.1 核心要点

  1. 分类指标:准确率、召回率、F1
  2. 排序指标:NDCG、MAP、MRR
  3. 业务指标:CTR、CVR、GMV
  4. 选择原则:根据业务需求选择

5.2 思考题

  1. 如何选择合适的评估指标?
  2. 如何平衡多个指标?
  3. 如何将技术指标与业务指标结合?

5.3 实践建议

  1. 多指标评估:使用多个指标综合评估
  2. 业务结合:结合业务指标
  3. A/B测试:用实际效果验证
  4. 持续优化:根据指标优化模型

下一节预告:我们将学习推荐系统架构设计,如果让你设计推荐系统,你会如何架构?

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐