情報検索の評価についてメモ(適合率,再現率,F値)

あるモデルによって情報を分類した時に、どのくらいうまく分類しているのか評価するためのメトリクスについてメモ。

テーマを単純にするために、文書から関連する文書を探すような情報検索システムを考える。したがって、関連する・関連しないの二値分類。

Precisionrecall

適合率(precision)

探した文書に含まれる関連文書の割合。
どれだけ正確に関連文書を探せているかを判定。

precision_calc

再現率(recall)

関連文書をどこまで探し出せているか。
網羅性を判定。

recall_calc

F値(F-score, F-measure, F_1 score)

適合率と再現率はトレードオフの関係にあるため、調和平均してバランスを見るのがF値

f_calc

関連するドキュメントは relevant の頭文字をとって R、関連しないドキュメントは
nonrelevant の頭文字をとって N で表すことにする。

3個だけ関連文書があるとする。

R R N R N N N N N N

例1)極端な例として、システムがすべての文書を関連すると判断した場合

正解 R R N R N N N N N N
検索 1 1 1 1 1 1 1 1 1 1

  • 適合率 = 3 / 10 = 0.3
  • 再現率 = 3 / 3 = 1.0
  • F値 ≒ 0.46

当然ながら再現率は 1.0 で逆に適合率は低い。

例2)極端な例として、システムが関連する1文書だけを関連すると判断した場合

正解 R R N R N N N N N N
検索 1 0 0 0 0 0 0 0 0 0

  • 適合率 = 1 / 1 = 1.0
  • 再現率 = 1 / 3 ≒ 0.33
  • F値 = 0.5

当然ながら適合率は 1.0 で逆に再現率は低い。

例3)システムが関連する2文書・関連しない2文書を関連する判断した場合

正解 R R N R N N N N N N
検索 1 0 1 1 1 0 0 0 0 0

  • 適合率 = 2 / 4 = 0.5
  • 再現率 = 2 / 3 ≒ 0.67
  • F値 = 0.57

F値は例3のバランス型が一番高い。

scikit learnで計算してみる

Pythonの機械学習ライブラリscikit learnにはこれらを計算する関数が存在する

上の例で実際に求めてみる。

In [1]: from sklearn.metrics import precision_score, recall_score, f1_score

In [2]: def ir_metrics(y_true, y_pred):
   ...:         print "true  %s " % y_true
   ...:         print "pred  %s " % y_pred
   ...:         print "precision : %.2f" % precision_score(y_true, y_pred, average='binary')
   ...:         print "recall    : %.2f" % recall_score(y_true, y_pred, average='binary')
   ...:         print "F1        : %.2f" % f1_score(y_true, y_pred, average='binary')
   ...:

In [3]: print "ex1"
ex1

In [4]: y_true = [1, 1, 0, 1, 0, 0, 0, 0, 0, 0]

In [5]: y_pred = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

In [6]: ir_metrics(y_true, y_pred)
true  [1, 1, 0, 1, 0, 0, 0, 0, 0, 0]
pred  [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
precision : 0.30
recall    : 1.00
F1        : 0.46

In [7]: print "ex2"
ex2

In [8]: y_pred = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]

In [9]: ir_metrics(y_true, y_pred)
true  [1, 1, 0, 1, 0, 0, 0, 0, 0, 0]
pred  [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
precision : 1.00
recall    : 0.33
F1        : 0.50

In [10]: print "ex3"
ex3

In [11]: y_pred = [1, 0, 1, 1, 1, 0, 0, 0, 0, 0]

In [12]: ir_metrics(y_true, y_pred)
true  [1, 1, 0, 1, 0, 0, 0, 0, 0, 0]
pred  [1, 0, 1, 1, 1, 0, 0, 0, 0, 0]
precision : 0.50
recall    : 0.67
F1        : 0.57

関連リンク

Leave a comment