除了推荐任务,在二分类任务中,也可以计算该指标,代码如下:
# ndcg
def get_dcg(y_pred, y_true, k):
#注意y_pred与y_true必须是一一对应的,并且y_pred越大越接近label=1(用相关性的说法就是,与label=1越相关)
df = pd.DataFrame({"y_pred":y_pred, "y_true":y_true})
df = df.sort_values(by="y_pred", ascending=False) # 对y_pred进行降序排列,越排在前面的,越接近label=1
df = df.iloc[0:k, :] # 取前K个
dcg = (2 ** df["y_true"] - 1) / np.log2(np.arange(1, df["y_true"].count()+1) + 1) # 位置从1开始计数
dcg = np.sum(dcg)
def get_ndcg(df, k):
# df包含y_pred和y_true
dcg = get_dcg(df["y_pred"], df["y_true"], k)
idcg = get_dcg(df["y_true"], df["y_true"], k)
ndcg = dcg / idcg
return ndcg