検索の良し悪しを数字にするとき、何件当てたかだけを見ると足りません。1位で当てるのと3位で当てるのでは、使う人の手間が違います。
実際に計算したところ、同じ1件を当てても1位なら100%、3位なら50%という差が出ました。順位を織り込むのがnDCGです。
文書12件と問い5件で実際に計算しました。順位を1つ下げるごとにnDCGは100%、63.1%、50.0%と落ちます。
nDCGが何を捉えているのかを、実際に計算して確かめました。用意したのは社内規程を模した文書12件と、問い5件です。
検索も評価も本当に実行しています。問いごとの正解はコードに書いてあり、そこから適合率・再現率・nDCGを計算しました。
function ndcgAt(ids, rel, k) {
let dcg = 0;
// 1位は 1/log2(2)=1、2位は 1/log2(3)≒0.63、3位は 1/log2(4)=0.5
ids.slice(0, k).forEach((id, r) => { if (rel.includes(id)) dcg += 1 / Math.log2(r + 2); });
// 考えうる最良の並びで割って、0〜1に収める
let idcg = 0;
for (let r = 0; r < Math.min(k, rel.length); r++) idcg += 1 / Math.log2(r + 2);
return idcg ? dcg / idcg : 0;
}
問い 適合率@3 再現率@3 nDCG@3 上位3件
宿泊費の上限は 67% 100% 100.0% 1,5,4(正解 1,5)
日帰りの日当 67% 100% 100.0% 3,9,0(正解 3,9)
前払の申請期限 33% 100% 100.0% 4,6,0(正解 4)
備品の購入 33% 100% 100.0% 7,0,1(正解 7)
報告書の提出期限 33% 50% 61.3% 11,9,10(正解 11,0)
平均 適合率@3 46.7% 再現率@3 90.0% nDCG@3 92.3%
当てた順位 nDCG@3
1位 100.0%
2位 63.1%
3位 50.0%
下の表が分かりやすいはずです。同じ1件を当てても、1位なら100%、3位なら50.0%。当てた事実は同じでも、評価は半分になります。
上の表の平均を見てください。適合率@3は46.7%なのに、nDCG@3は92.3%です。同じ結果を評価して、倍近い開きがあります。
理由は正解の件数です。「前払の申請期限」の正解は1件しかありません。上位3件のうち1件しか当たらないので適合率は33%ですが、その1件が1位なので順位としては最良です。
nDCGの「n」は正規化を指します。考えうる最良の並びを1.0として割ります。
この正規化があるので、正解が1件の問いと2件の問いを同じ土俵で平均できます。割らなければ、正解の多い問いだけが数字を押し上げます。
5件のうち1件だけ61.3%でした。「報告書の提出期限」で、正解2件のうち1件しか上位3件に入っていません。
平均だけを見ると92.3%で問題なさそうに見えます。問いごとに並べて、低い行を探すのが評価の使い方になります。
当てた事実は同じでも、順位で評価は半分になる。
Discounted cumulative gain (DCG) In contrast to the two metrics above, discounted cumulative gain takes both the rank and the rating of the search results into account.原文Elasticsearch Reference「Ranking evaluation」 この内容の有効期限2027-02-18
上位に出た正解ほど高く評価します。順位と、正解の度合いの両方を織り込むのが特徴です。
nDCGは、検索結果の順位まで含めて良し悪しを数字にする指標です。上に出た正解ほど大きく数える形になっています。
他の指標も押さえておきましょう。Elasticsearchの説明では、上位k件のうち正解が占める割合を測る指標と、上位k件に正解がいくつ入ったかを測る指標が並べられています。
そのうえで、この2つと違って、順位と正解の度合いの両方を織り込むものとしてDCGが挙げられています。nDCGはそれを正規化したものです。
見落とされやすい点があります。正解の度合いは段階を付けられます。同じ文書でも「求めていた答えそのもの」と「関係はある」を分けられます。
Elasticsearchでも、文書の評価は、利用者が決めた尺度でその文書の関連度を表す整数であればよいとされています。0と1だけに縛られません。
同じ文書でも、問いが違えば正解かどうかが変わります。ですから正解は問いごとに用意します。
同じ文書では、関連度の判断は、その問いを入力した利用者が何を必要としていたかにもとづくとされています。作る側の都合ではなく、聞いた側の必要で決まります。
計算そのものは短いコードで済みます。手間がかかるのは問いと正解の組を用意する作業でした。実際に聞かれている問いを集めて、正解を人が決める。ここを飛ばすと、どの指標を使っても意味のある数字になりません。
A document rating can be any integer value that expresses the relevance of the document on a user-defined scale.原文Elasticsearch Reference「Ranking evaluation」 この内容の有効期限2027-02-18
1つの指標だけで判断しないことです。前の節では、同じ結果に対して46.7%と92.3%が同時に出ています。
nDCGは順位を織り込むぶん優れた指標ですが、これ1つで全部が分かるわけではありません。
前の節の平均を思い出してください。適合率@3が46.7%、再現率@3が90.0%、nDCG@3が92.3%。同じ検索結果に対する3つの数字です。
どれも間違っていません。測っているものが違うだけです。上位に不要な結果が混じっている状態を見たいなら適合率、取りこぼしを見たいなら再現率になります。
上位何件までを見るかも効きます。上位3件で測るのと上位10件で測るのでは、同じ検索でも数字が変わります。
決め方は用途からです。画面に3件しか出さないなら3件で測ります。AIに渡す文書を選ぶ用途なら、渡す件数に合わせます。
平均92.3%という数字の中に、61.3%の問いが1件混ざっていました。平均だけを見ていると、この1件に気づけません。
問いごとの一覧を残して、低い行を毎回見てください。試験の設計はシミュレーション評価の記事で扱っています。
3つの数字はどれも正しい。測っているものが違うだけ。
Precision at K (P@k) This metric measures the proportion of relevant results in the top k search results.原文Elasticsearch Reference「Ranking evaluation」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る