折扣累积增益(DCG)是一种用于评估多标签分类或实体排序任务性能的指标。它通过将真实标签按照预测分数排序,并应用对数折扣来计算。如果真实标签的排名较高,则该指标会得到较高的值。通常,人们更倾向于使用归一化折扣累积增益(NDCG),它是通过将DCG除以理想折扣累积增益(即完美排名下的DCG)来计算的,以便得到一个介于0到1之间的分数。
在进行DCG计算时,需要考虑以下几个参数:
y_true: 真实目标的数组,形状为(n_samples, n_labels),表示多标签分类的真实标签,或者是待排序实体的真实分数。
y_score: 目标分数的数组,形状为(n_samples, n_labels),可以是概率估计、置信度值,或者是某些分类器的“决策函数”返回的未经阈值处理的决策度量。
k: 整数,默认为None,表示只考虑排名最高的k个分数。如果为None,则使用所有输出。
log_base: 浮点数,默认为2,表示用于折扣的对数的底数。值越低,表示折扣越陡峭(顶部结果更重要)。
sample_weight: 样本权重的数组,形状为(n_samples,),默认为None,表示所有样本具有相同的权重。
ignore_ties: 布尔值,默认为False,表示假设y_score中没有平局,以提高效率。
DCG的计算结果是一个浮点数,表示平均样本DCG分数。
在实际应用中,可以通过设置k的值来截断求和,只有前k个答案会贡献分数。例如,如果预测了一些答案的分数,并且想要计算DCG分数,可以这样做:
import numpy as np
from sklearn.metrics import dcg_score
# 假设有一些答案的真实相关性
true_relevance = np.asarray([[10, 0, 0, 1, 5]])
# 预测了答案的分数
scores = np.asarray([[.1, .2, .3, 4, 70]])
# 计算DCG分数
dcg_score(true_relevance, scores)
# 输出: np.float64(9.49...)
如果想要设置k的值来截断求和,只考虑前k个答案,可以这样做:
dcg_score(true_relevance, scores, k=2)
# 输出: np.float64(5.63...)
如果预测中存在平局,可以通过设置ignore_ties参数为True来忽略平局,以获得更快的结果。但是,只有在确信分数中没有平局时,才能这样做,否则可能会得到错误的结果:
scores = np.asarray([[1, 0, 0, 0, 1]])
dcg_score(true_relevance, scores, k=1)
# 输出: np.float64(7.5) # 默认情况下,平局会被平均处理
dcg_score(true_relevance, scores, k=1, ignore_ties=True)
# 输出: np.float64(5.0) # 忽略平局