我正在做一个涉及使用归一化分布累积增益( NDCG )的项目,我了解该方法的基本计算。
因此,我从sklearn.metrics导入了ndcg_score,然后将一个基本实值数组和另一个数组传递给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函数的错误,或者是我的代码出了什么问题?
发布于 2021-03-14 17:10:39
我假设你正在尝试为这个问题预测六个不同的类别(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_nd和y_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.]])https://stackoverflow.com/questions/66619605
复制相似问题