归一化折扣累积增益(Normalized Discounted Cumulative Gain,简称NDCG)是一种衡量信息检索系统性能的指标。它通过计算在预测得分排序下的真实标签得分,再应用对数折扣,然后将结果除以最佳可能得分(理想DCG,即完美排序下得到的DCG),从而得到一个介于0和1之间的得分。如果真实标签的得分在预测得分排序中排名较高,该排名指标将返回较高的值。
NDCG计算参数
在计算NDCG时,需要考虑以下几个参数:
y_true: 真实目标数组,形状为(n_samples, n_labels),表示多标签分类的真实目标,或者待排序实体的真实得分。如果y_true中包含负值,可能会导致输出值不在0和1之间。
y_score: 目标得分数组,形状为(n_samples, n_labels),可以是概率估计、置信度值,或者是某些分类器的“决策函数”返回的未阈值化的决策度量。
k: 整数,默认为None。只考虑排名最高的k个得分。如果为None,则使用所有输出。
sample_weight: 样本权重数组,默认为None。如果为None,则所有样本权重相同。
ignore_ties: 布尔值,默认为False。假设y_score中没有平局(如果y_score是连续的,则很可能是这种情况)以提高效率。
NDCG返回值
归一化折扣累积增益计算将返回一个浮点数,表示所有样本的平均NDCG得分,范围在[0.0, 1.0]之间。
NDCG的应用
NDCG在信息检索和机器学习领域有着广泛的应用。它可以用来评估搜索引擎、推荐系统等的性能。通过比较不同模型或算法的NDCG得分,可以确定哪个模型或算法在特定任务上表现更好。
import numpy as np
from sklearn.metrics import ndcg_score
# 假设有一些答案的真实相关性
true_relevance = np.asarray([[10, 0, 0, 1, 5]])
# 预测了一些答案的得分(相关性)
scores = np.asarray([[.1, .2, .3, 4, 70]])
print(ndcg_score(true_relevance, scores)) # 输出: 0.69...
# 可以设置k来截断求和;只有前k个答案有贡献
print(ndcg_score(true_relevance, scores, k=4)) # 输出: 0.35...
# 如果预测中有平局
scores = np.asarray([[1, 0, 0, 0, 1]])
print(ndcg_score(true_relevance, scores, k=1)) # 输出: 0.75...