ndcg_score#
- sklearn.metrics.ndcg_score(y_true, y_score, *, k=None, sample_weight=None, ignore_ties=False)#
计算归一化折损累积增益。
按照预测分数诱导的顺序对真实分数进行求和, 在应用对数折扣后,然后除以最佳可能 分数(理想DCG,为完美排序所得)以获得一个介于 0和1之间的分数。
该排序指标在
y_score
将真实标签排高时返回高值。- Parameters:
- 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是连续的,这可能是 情况)以提高效率。
- Returns:
- normalized_discounted_cumulative_gain[0., 1.] 之间的浮点数
所有样本的平均NDCG分数。
See also
dcg_score
折损累积增益(未归一化)。
<https://en.wikipedia.org/wiki/Discounted_cumulative_gain>`_
Jarvelin, K., & Kekalainen, J. (2002). Cumulated gain-based evaluation of IR techniques. ACM Transactions on Information Systems (TOIS), 20(4), 422-446.
Wang, Y., Wang, L., Li, Y., He, D., Chen, W., & Liu, T. Y. (2013, May). A theoretical analysis of NDCG ranking measures. In Proceedings of the 26th Annual Conference on Learning Theory (COLT 2013)
McSherry, F., & Najork, M. (2008, March). Computing information retrieval performance measures efficiently in the presence of tied scores. In European conference on information retrieval (pp. 414-421). Springer, Berlin, Heidelberg.
Examples
>>> 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]]) >>> ndcg_score(true_relevance, scores) 0.69... >>> scores = np.asarray([[.05, 1.1, 1., .5, .0]]) >>> ndcg_score(true_relevance, scores) 0.49... >>> # 我们可以设置k来截断求和;只有前k个答案贡献。 >>> ndcg_score(true_relevance, scores, k=4) 0.35... >>> # 归一化考虑了k,所以一个完美的答案 >>> # 仍然会得到1.0 >>> ndcg_score(true_relevance, true_relevance, k=4) 1.0... >>> # 现在我们在预测中有一些平局 >>> scores = np.asarray([[1, 0, 0, 0, 1]]) >>> # 默认情况下平局被平均,所以这里我们得到平均(归一化) >>> # 我们最高预测的真实相关性:(10 / 10 + 5 / 10) / 2 = .75 >>> ndcg_score(true_relevance, scores, k=1) 0.75... >>> # 我们可以选择忽略平局以获得更快的结果,但仅 >>> # 如果我们知道分数中没有平局,否则我们会得到 >>> # 错误的结果: >>> ndcg_score(true_relevance, ... scores, k=1, ignore_ties=True) 0.5...