• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

NDCG

date: 2022-06-16 excerpt: NDCGについて

tag: 機械学習NDCGランキング


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

参考

  • Evaluate your Recommendation Engine using NDCG
  • sklearn.metrics.ndcg_score/sklearn


機械学習NDCGランキング Share Tweet