计算折扣累积增益(Discounted Cumulative Gain)

折扣累积增益(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) # 忽略平局
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485