情報検索における適合率、再現率、F値
情報検索の精度向上をするために、ユーザーの情報要求、つまり検索クエリに対する結果を評価する必要があります。
その評価において使われる指標を少し整理しようと思います。
比較する集合の定義
- 検索クエリによって得られたドキュメント集合(Res と表現する)
- 関連があると想定していたドキュメント集合(Rel と表現する)
Rel については予め定めておく必要があります。
再現率(recall)
関連するドキュメントの中で検索結果に現れるドキュメントの割合です。
情報要求に対する検索結果の網羅性を測定しています。
単純にすべてのドキュメント集合を結果として返せば再現率は100%になります。
ただし、ほとんどの検索決結果は無関係のドキュメントになってしまうでしょう。
なので、網羅性が高ければよいという訳ではないです。
文献検索や法律文書検索などで、取りこぼしがあると大きな問題がでるものは網羅率が高い必要があります。
一方で、「Go make slice」などの検索においては、公式ドキュメント以外に様々なブログ、SNSの記事などがヒットするとそれはそれでノイズで公式ドキュメントなどの少数に質の高いドキュメントが結果として出れば良い場合もあるかと思います。
再現率の重要性はサービスの性質に応じて検討が必要になると思います。
適合率(precision)
検索結果に現れるドキュメントの中で、関連するドキュメントの割合です。
適合率、再現率は分母が違うだけで分子は同じです。
再現率において、再現率が高いと非関連のものが多くなる可能性があるので、これを補うための評価指標となります。
この適合率は、逆数にすると、関連するドキュメントに合うまでどれくらいの 数 のドキュメントを確認するかの期待値となっています。
F値
再現率と適合率を組み合わせた指標として、F値があります。
さらに、適合率、再現率のどちらかに重みを与えるようなF値もあります。
Google spreadsheetで計算するには
spreadsheetで下記のように計算したいと思うので、その方法を紹介します。

Res と Rel にはそれぞれカンマ区切りで集合のデータをいれます。ここでは重複なしとしています。
まずは個数の求め方ですが、下記のような関数で計算します。
=COUNTA(UNIQUE(SPLIT(REGEXREPLACE(C4, "\s*,\s*", ","), ",")))
カンマ前後のスペースは取り除いていますが、a,b,,c, のような空が入っているものは除いていません。
=LET(
a, SPLIT(REGEXREPLACE(C4, "\s*,\s*", ","), ","),
b, SPLIT(REGEXREPLACE(D4, "\s*,\s*", ","), ","),
Aset, UNIQUE(FILTER(a, a<>"")),
Bset, UNIQUE(FILTER(b, b<>"")),
COUNTA(UNIQUE(FILTER(Aset, COUNTIF(Bset, Aset)>0)))
)
それぞれの個数と積集合の個数が求められれば、あとは計算するだけです!
参照
Discussion