我正在使用python来解决学习排名问题,并且正在使用以下DCG和NDCG代码(来自http://nbviewer.ipython.org/github/ogrisel/notebooks/blob/master/Learning%20to%20Rank.ipynb)评估我的成功程度

def dcg(relevances, rank=20):
    relevances = np.asarray(relevances)[:rank]
    n_relevances = len(relevances)
    if n_relevances == 0:
        return 0.
    discounts = np.log2(np.arange(n_relevances) + 2)
    return np.sum(relevances / discounts)

def ndcg(relevances, rank=20):
    best_dcg = dcg(sorted(relevances, reverse=True), rank)
    if best_dcg == 0:
        return 0.
    return dcg(relevances, rank) / best_dcg

以下是3个项目中没有重复等级的最佳和最坏情况的DCG值...
>>> ndcg(np.asarray([3,2,1]))
1.0
>>> ndcg(np.asarray([1,2,3]))
0.78999800424603583

我们可以使用此指标比较两个排名,看看哪个更好。但是,如果我为4个项目列表计算最坏的情况,则...
>>> ndcg(np.asarray([1,2,3,4]))
0.74890302967841715

4项列表似乎不再与3项列表可比。

我还计算了两个替代的NDCG。 NDCG2比较已实现的DCG和bot最佳和最差情况...
def ndcg2(relevances, rank=20):
    best_dcg = dcg(sorted(relevances, reverse=True), rank)
    worst_dcg=dcg(sorted(relevances, reverse=False),rank)
    if best_dcg == 0:
        return 0.
    return (dcg(relevances, rank)-worst_dcg) / (best_dcg-worst_dcg)

NDCG将我的实际排名列表随机化50次,每次计算dcg,然后将其与我的实际DCG进行比较。
def ndcg3(relevances, rank=20):
    shuffled=np.copy(relevances)
    rands=[]
    for i in range(50):
        np.random.shuffle(shuffled)
        rands.append(dcg(shuffled,rank))
    avg_rand_dcg=np.mean(np.asarray(rands))
    return dcg(relevances, rank) / avg_rand_dcg

在我的各种列表中,我得到以下指标...
  • NDCG:平均值为.87(听起来不错)
  • Spearman排名:.25左右(不令人惊讶,但那里有些东西)
  • NDCG2:.58(平均而言,最好的dcg比最差的dcg稍微近一点)
  • NDCG3:1.04(比随机排序的列表略好)

  • 老实说,我无法得出这些结果的正面或反面。我的NDCG值似乎不错,但它们在各个列表中是否具有可比性?替代指标是否更有意义?

    编辑:在我的第一次随机比较中,我没有使用np.copy()。因此,我的随机分数几乎总是0.99。现在已解决,结果更有意义。

    最佳答案

    有人认为可能会误导您的是标准化NDCG的方法。通常,您要排序的文档数量很多,但是NDCG会在文档数量较少的情况下被截断(例如NCDG @ 3)。在您的代码中,这取决于参数“等级”。

    假设您要对5个相关性为R = [1、2、3、4、0]的文档进行排名,并计算NDCG @ 3。如果您的算法认为最佳顺序为[doc1,doc2,doc3,doc4,doc5],那么您将拥有:

    NDCG@3 = DCG([1, 2, 3]) / DCG([4, 3, 2])
    

    并不是
    NDCG@3 = DGC([1, 2, 3]) / DCG([3, 2, 1])   # Incorrect
    

    因此,从某种意义上说,NDCG([1、2、3]]和NDCG([1、2、3、4])是不可比较的。分子是完全相同的,但是分母是完全不同的。如果要使NDCG具有直观的含义,则必须设置
    “等级”小于或等于您的文档数。

    10-01 18:08