良い検索かどうかは、数で言える
適合率と再現率は、検索の結果が良いかどうかを、数で表す2つの物差しです。適合率は「出てきたもののうち、当たりの割合」、再現率は「当たりのうち、見つかった割合」です。
検索が速くても、関係のない文書ばかり出れば役に立ちません。2つの数を見れば、どこが悪いか分かります。
このレッスンのゴール
メモ
検索の結果から、適合率と再現率を計算し、その検索の良し悪しを言うことができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 適合 | 検索した人にとって、関係がある文書であること | |
| 適合率 | 見つけた文書のうち、適合した文書の割合 | 2 ÷ 4 |
| 再現率 | 適合する全部のうち、見つけられた文書の割合 | 2 ÷ 3 |
| 上位k件の適合率 | 上から k 件だけを見たときの適合率 | |
| F値 | 適合率と再現率を、1つにまとめた数 |
学生が入力するセルは、このプレビューでは空白です。
「関係がある」と決めるのは人
まず、人が、検索語に対して、関係がある文書に印をつけておきます。この「関係がある」ことを、適合と言います。
検索の結果と、この印を見比べて、数にします。お知らせ8枚で「電車の遅れ」を探し、3、4、7が適合だとします。
例: 検索の結果と、人がつけた印
| 順位 | 見つけた文書 | 適合か |
|---|---|---|
| 1 | 3 | 適合 |
| 2 | 5 | 外れ |
| 3 | 4 | 適合 |
| 4 | 1 | 外れ |
学生が入力するセルは、このプレビューでは空白です。
適合率は正確さ、再現率は取りこぼしの少なさ
適合率は、見つけた文書のうち、適合した割合です。表では 2 ÷ 4 で 0.5 です。
再現率は、適合する全部のうち、見つけられた割合です。適合は全部で3枚あり、2枚を見つけたので、2 ÷ 3 で 0.667 です。
適合率と再現率を計算
docker exec jupyter python3 -c "print(2 / 4, round(2 / 3, 3))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
当たりを数えて割る
retrieved = [2, 6, 1]
relevant = [1, 2, 5, 9]
hits = 0
for number in retrieved:
if number in relevant:
hits = hits + 1
print("当たり:", hits)
print("適合率:", round(hits / len(retrieved), 3))
print("再現率:", round(hits / len(relevant), 3))
# retrieved に 5 と 9 を足して、2つの値がどう動くか見てください。
2つの数は、片方を上げるともう片方が下がる
8枚すべてを返せば、適合を取りこぼさないので、再現率は 1 です。でも、適合率は低くなります。
逆に、いちばん自信のある1枚だけを返せば、適合率は高くなります。でも、再現率は低くなります。そこで、2つをまとめたF値(2 × 適合率 × 再現率 ÷ (適合率 + 再現率))も使います。
例: 返し方による2つの数
| 返し方 | 適合率 | 再現率 |
|---|---|---|
| 8枚すべて | 3 ÷ 8 = 0.375 | 3 ÷ 3 = 1.0 |
| 文書3の1枚だけ | 1 ÷ 1 = 1.0 | 1 ÷ 3 = 0.333 |
| 上の表の4枚 | 2 ÷ 4 = 0.5 | 2 ÷ 3 = 0.667 |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
適合率が高ければ、良い検索だと考えがちです。1枚しか返さなければ、適合率は 1 にできます。適合を取りこぼしていないか、再現率も必ず見てください。
さらに挑戦: 順位を考える
同じ2枚の当たりでも、1位と2位に並ぶ場合と、9位と10位に並ぶ場合があります。上位k件の適合率は、この違いを数にします。
precision_at_k を、k = 1、3、5 で呼び、変化を表にしてください。