NDCGについて
概要
- ランキングの評価指標の一つ
- /MAP/は関連度を考慮しないが
NDCG
は順番に優先順位がつく- 上に来てほしいものほど、大きい値が設定される
定義
CG(Cumulative Gain)の定義
\(\begin{align*} SetA = [1, 3, 2] \\ GC_{SetA} = 1 + 3 + 2 = 5 \end{align*}\)
DCG(Discounted Cumulative Gain)の定義
\(\begin{align*} SetA = [1, 3, 2] \\ DGC_{SetA} = \frac{1}{log_{2}{1 + 1}} + \frac{3}{log_{2}{1 + 2}} + \frac{2}{log_{2}{1 + 3}} = 3.89 \end{align*}\)
NDCG(Normalized Discounted Cumulative Gain)の定義
\(NDCG = \frac{DCG}{iDCG}\)
- \(iDCG\); 最大となる理想の並び順のときの\(DCG\)
実装例
import numpy as np
from sklearn.metrics import ndcg_score
# キーワードごとの実際の関連度と予測されたスコア
true_relevance_list = [
np.asarray([3, 2, 3, 0, 1, 2]), # キーワード1に対する関連度
np.asarray([2, 3, 0, 1, 3, 2]), # キーワード2に対する関連度
np.asarray([1, 0, 2, 3, 2, 3]) # キーワード3に対する関連度
]
scores_list = [
np.asarray([0.9, 0.8, 0.7, 0.1, 0.4, 0.6]), # キーワード1に対するスコア
np.asarray([0.8, 0.9, 0.1, 0.4, 0.7, 0.6]), # キーワード2に対するスコア
np.asarray([0.4, 0.1, 0.6, 0.8, 0.7, 0.9]) # キーワード3に対するスコア
]
# 各キーワードに対するNDCGスコアを計算
k = 3
ndcg_scores = [ndcg_score([true_relevance], [scores], k=k) for true_relevance, scores in zip(true_relevance_list, scores_list)]
# NDCGスコアの平均を計算
average_ndcg = np.mean(ndcg_scores)
print(f'Average NDCG@{k}: {average_ndcg}') # Average NDCG@3: 0.9851875744203364