归一化折损累积增益 (NDCG) 评分#
- sklearn.metrics.ndcg_score(y_true, y_score, *, k=None, sample_weight=None, ignore_ties=False)[source]#
计算归一化折损累积增益。
对根据预测分数排序的真实分数进行对数折扣后求和。然后除以最佳可能分数(理想 DCG,在完美排序的情况下获得)以获得 0 到 1 之间的分数。
如果
y_score
对真实标签进行了高排名,则此排名指标将返回一个高值。- 参数:
- y_true形状为 (n_samples, n_labels) 的类数组
多标签分类的真实目标,或要排序的实体的真实分数。
y_true
中的负值可能导致输出不在 0 到 1 之间。- y_score形状为 (n_samples, n_labels) 的类数组
目标分数,可以是概率估计、置信度值或非阈值决策度量(某些分类器上的“decision_function”返回)。
- kint,默认值=None
仅考虑排名中最高的 k 个分数。如果
None
,则使用所有输出。- sample_weight形状为 (n_samples,) 的类数组,默认值=None
样本权重。如果
None
,则所有样本都具有相同的权重。- ignore_tiesbool,默认值=False
为提高效率,假设 y_score 中没有平局(如果 y_score 是连续的,则很可能如此)。
- 返回:
- normalized_discounted_cumulative_gain[0., 1.] 中的浮点数
所有样本的平均 NDCG 分数。
另请参见
折损累积增益 (DCG) 评分 (dcg_score)
折损累积增益(未归一化)。
参考文献
Jarvelin, K. & Kekalainen, J. (2002)。基于累积增益的 IR 技术评估。ACM 信息系统汇刊 (TOIS), 20(4), 422-446。
Wang, Y., Wang, L., Li, Y., He, D., Chen, W. & Liu, T. Y. (2013, 5月)。NDCG 排名度量的理论分析。在第 26 届年度学习理论会议论文集 (COLT 2013) 中
McSherry, F. & Najork, M. (2008, 3月)。在存在关联分数的情况下有效计算信息检索性能度量。在欧洲信息检索会议 (第 414-421 页) 中。施普林格,柏林,海德堡。
示例
>>> import numpy as np >>> from sklearn.metrics import ndcg_score >>> # we have ground-truth relevance of some answers to a query: >>> true_relevance = np.asarray([[10, 0, 0, 1, 5]]) >>> # we predict some scores (relevance) for the answers >>> scores = np.asarray([[.1, .2, .3, 4, 70]]) >>> ndcg_score(true_relevance, scores) np.float64(0.69...) >>> scores = np.asarray([[.05, 1.1, 1., .5, .0]]) >>> ndcg_score(true_relevance, scores) np.float64(0.49...) >>> # we can set k to truncate the sum; only top k answers contribute. >>> ndcg_score(true_relevance, scores, k=4) np.float64(0.35...) >>> # the normalization takes k into account so a perfect answer >>> # would still get 1.0 >>> ndcg_score(true_relevance, true_relevance, k=4) np.float64(1.0...) >>> # now we have some ties in our prediction >>> scores = np.asarray([[1, 0, 0, 0, 1]]) >>> # by default ties are averaged, so here we get the average (normalized) >>> # true relevance of our top predictions: (10 / 10 + 5 / 10) / 2 = .75 >>> ndcg_score(true_relevance, scores, k=1) np.float64(0.75...) >>> # we can choose to ignore ties for faster results, but only >>> # if we know there aren't ties in our scores, otherwise we get >>> # wrong results: >>> ndcg_score(true_relevance, ... scores, k=1, ignore_ties=True) np.float64(0.5...)