【问题标题】:sklearn ndcg_score returned incorrect resultsklearn ndcg_score 返回了不正确的结果
【发布时间】:2021-03-13 23:32:34
【问题描述】:

我正在从事一个涉及使用 NDCG(归一化分布式累积增益)的项目,并且我了解该方法的基础计算。

所以我从sklearn.metrics 导入了ndcg_score,然后将一个ground truth 数组和另一个数组传递给ndcg_score 函数来计算它们的NDCG 分数。地面实况数组的值为[5, 4, 3, 2, 1],而另一个数组的值为[5, 4, 3, 2, 0],因此这两个数组中只有最后一个元素不同。

from sklearn.metrics import ndcg_score

user_ndcg = ndcg_score(array([[5, 4, 3, 2, 1]]), array([[5, 4, 3, 2, 0]]))

我预计结果约为 0.96233 (9.88507/10.27192)。然而,user_ndcg 居然返回了1.0,这让我很吃惊。最初我认为这是由于四舍五入造成的,但事实并非如此,因为当我对另一组数组:ndcg_score(array([[5, 4, 3, 2, 1]]), array([[5, 4, 0, 2, 0]])) 进行实验时,它正确返回了 0.98898。

有谁知道这可能是 sklearn ndcg_score 函数的错误,还是我的代码有问题?

【问题讨论】:

  • 基本事实是只有一次观察,还是应该是 5 次观察?
  • @ArturoSbr 基本事实应该是 5 次观察。

标签: scikit-learn ranking recommendation-engine


【解决方案1】:

我假设您正在尝试为这个问题预测六个不同的类别(0、1、2、3、4 和 5)。如果您想针对五个不同的观察评估 ndcg,则必须向函数传递两个形状为 (5, 6) 的数组。

也就是说,您已将基本事实和预测转换为每行五行六列的数组。

# Current form of ground truth and predictions
y_true = [5, 4, 3, 2, 1]
y_pred = [5, 4, 3, 2, 0]
# Transform ground truth to ndarray
y_true_nd = np.zeros(shape=(5, 6))
y_true_nd[np.arange(5), y_true] = 1
# Transform predictions to ndarray
y_pred_nd = np.zeros(shape=(5, 6))
y_pred_nd[np.arange(5), y_pred] = 1
# Calculate ndcg score
ndcg_score(y_true_nd, y_pred_nd)
> 0.8921866522394966

这是y_true_ndy_pred_nd 的样子:

y_true_nd

array([[0., 0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 1., 0., 0.],
       [0., 0., 1., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0.]])

y_pred_nd

array([[0., 0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 1., 0., 0.],
       [0., 0., 1., 0., 0., 0.],
       [1., 0., 0., 0., 0., 0.]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-11
    • 2016-02-06
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    相关资源
    最近更新 更多