f1 scoreとは
$$ f1 = \frac{2 \times Recall \times Precision}{Recall + Precision} = \frac{1}{\frac{1}{Recall} \times \frac{1}{Precison}} = \frac{2 \times TP}{2 \times TP + FP + FN}$$
で示されるRecall(再現率、感度)とPrecision(適合度、精度)の兼ね合いの指標である。
調和平均であるのでどちらかが極端に低い場合にはスコアが低くなる。
多クラス分類
簡略化のため、3クラス分類とする(4クラス以上でも同じ考えで行ける)
予想クラス | ||||
---|---|---|---|---|
a | b | c | ||
a | 10 | 3 | 5 | |
正解のクラス | b | 4 | 20 | 3 |
c | 4 | 3 | 15 |
こんな感じの混同行列があったとき、TP、FP、FNを以下のように定義する。
クラス | TP | FP | FN |
---|---|---|---|
a | 10 | 8 | 8 |
b | 20 | 6 | 7 |
c | 15 | 8 | 7 |
FPは縦、FNは横の対角要素以外の和である。
sklearn.metrics.f1_score
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.htmlをみるとオプションに"binary"
,"micro"
,"macro"
,"weighted"
,"samples"
が存在する。(recall_score, precision_scoreも同様)
"binary"
は2値分類で用いるものである。
その他について以下に記す。
"micro"
-
全体でTP,FP,FNを計算する。
TP FP FN 45 22 22 -
求めたTP,FP.FNで計算する
$$f1 = \frac{2 \times TP}{2 \times TP + FP + FN} = \frac{90}{90+22+22} = 0.67164179104\dots$$
"macro"
-
個々のクラスでRecallとPrecisionを算出する
クラス Recall Precision a $\frac{10}{18}$ $\frac{10}{18}$ b $\frac{20}{27}$ $\frac{20}{26}$ c $\frac{15}{22}$ $\frac{15}{23}$ -
平均のRecallとPrecisionを算出する
Recall Precision $\frac{1}{3}\sum{Recall}$ $\frac{1}{3}\sum{Precision}$ -
求めた平均でf1を計算する
$$ \frac{1}{\frac{1}{\frac{1}{3}\sum{Recall}} \times \frac{1}{\frac{1}{3}\sum{Precision}}} $$
(計算は面倒なので省略)
"weighted"
-
各クラスのデータ数を個々のRecall, Precisionに乗算する
クラス Recall Precision a $\frac{10}{18} \times 18$ $\frac{10}{18}\times 18$ b $\frac{20}{27}\times 18$ $\frac{20}{26}\times 18$ c $\frac{15}{22}\times 18$ $\frac{15}{23}\times 18$ -
Recall,Precisionの総和をデータ総数で割る
Recall Precision $\frac{1}{67}\sum{Recall}$ $\frac{1}{67}\sum{Precision}$ -
求めた平均でf1を計算する
$$ \frac{1}{\frac{1}{\frac{1}{67}\sum{Recall}} \times \frac{1}{\frac{1}{67}\sum{Precision}}} $$
(計算は面倒なので省略)
"samples"
よくわかってないので分かり次第加筆予定