##概要##
機械学習で分類問題をするときに、複数のラベルについての予想をしたい場合があります。この際にも分類問題と同じようにRecall, Precision, F値を使用するようです。例えばScikit-learnにも同様に関数は実装されていますし、マルチラベルに対応しています。ただマルチラベルのF値については
- binary
- micro
- macro
- weighted
- samples
など、様々な指標が存在するようです。そこで、論文で多く使われているように見えるmicro-F1とmacro-F1が学習データの変化でどう振る舞うのか調べてみました。Excelで(出落ち)。
なお、micro-F1とmacro-F1の計算方法についてはsa-wa-mさんの分類器の学習方法と評価方法1(指標の説明)に纏められています。
##パターン1:初期状態##
計算結果が1000事例、クラスが10個で、各クラスに正解が100個あるとします。
全クラスに90%の精度で分類が成功したとするとFNとFPは10個ずつとなりますね。
TP | FN | FP | TN | SUM | Recall | Precision | F measure | |
---|---|---|---|---|---|---|---|---|
1 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
2 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
3 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
4 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
5 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
6 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
7 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
8 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
9 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
10 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
SUM | 900 | 100 | 100 | 8900 | 10000 |
この場合でのF値は次にように計算されます。前述したリンクでもあるように
- Macro-F1:クラスごとのF値の平均
- (0.9+0.9+...+0.9)/10=0.9
- Micro-F1:全体のTP,FN.FP,TNを和にしてからF値を計算したもの
- 2Micro-RMicro-P/(Micro-R+Micro-P)=0.9
となります。
Recall | Precision | F measure | |
---|---|---|---|
Micro | 0.9 | 0.9 | 0.9 |
Macro | 0.9 | 0.9 | 0.9 |
##パターン2:クラス1だけ割り当てられる事例が極端に多い##
テストデータ1000個のうち、クラス1に割り当てられるものが600個と極端に多い場合を考えます。正解率は90%固定です。
TP | FN | FP | TN | SUM | Recall | Precision | F measure | |
---|---|---|---|---|---|---|---|---|
1 | 540 | 60 | 60 | 340 | 1000 | 0.9 | 0.9 | 0.9 |
2 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
3 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
4 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
5 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
6 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
7 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
8 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
9 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
10 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
SUM | 1350 | 150 | 150 | 8350 | 10000 |
Recall | Precision | F measure | |
---|---|---|---|
Micro | 0.9 | 0.9 | 0.9 |
Macro | 0.9 | 0.9 | 0.9 |
クラス1だけ極端に増えましたが、比率が変化しないのでMicro, Macro共に変化はありません。
##パターン3:クラス1だけ割り当てられる事例が極端に多く、かつクラス1の正答率だけ極端にいい場合##
TP | FN | FP | TN | SUM | Recall | Precision | F measure | |
---|---|---|---|---|---|---|---|---|
1 | 890 | 10 | 10 | 90 | 1000 | 0.989 | 0.989 | 0.989 |
2 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
3 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
4 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
5 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
6 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
7 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
8 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
9 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
10 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
SUM | 1700 | 100 | 100 | 8100 | 10000 |
Recall | Precision | F measure | |
---|---|---|---|
Micro | 0.944 | 0.944 | 0.944 |
Macro | 0.909 | 0.909 | 0.909 |
Microは大きく増加しましたが、Macroの方は増加が鈍くなっています。
##パターン4:クラス1の正解率は高いが、割り当てられる数は他と同等の場合##
クラス1の割り当てられる数が他とそこまで変わらないながらも、正解率は抜群に良い場合を考えます。
TP | FN | FP | TN | SUM | Recall | Precision | F measure | |
---|---|---|---|---|---|---|---|---|
1 | 99 | 1 | 1 | 899 | 1000 | 0.99 | 0.99 | 0.99 |
2 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
3 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
4 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
5 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
6 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
7 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
8 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
9 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
10 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
SUM | 909 | 91 | 91 | 8909 | 10000 |
Micro, Macroともに同じぐらいの値になりました。
Recall | Precision | F measure | |
---|---|---|---|
Micro | 0.909 | 0.909 | 0.909 |
Macro | 0.909 | 0.909 | 0.909 |
##パターン5:クラス1の割当数大、正解率大、クラス2の正解率小
TP | FN | FP | TN | SUM | Recall | Precision | F measure | |
---|---|---|---|---|---|---|---|---|
1 | 890 | 10 | 10 | 90 | 1000 | 0.989 | 0.989 | 0.989 |
2 | 10 | 90 | 90 | 800 | 990 | 0.1 | 0.1 | 0.1 |
3 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
4 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
5 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
6 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
7 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
8 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
9 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
10 | 90 | 10 | 10 | 890 | 1000 | 0.9 | 0.9 | 0.9 |
SUM | 1620 | 180 | 180 | 8010 | 9990 |
MicroではまぁまぁのF値を保持していますが、Macroでは随分落ち込んでしまいました。
Recall | Precision | F measure | |
---|---|---|---|
Micro | 0.9 | 0.9 | 0.9 |
Macro | 0.829 | 0.829 | 0.829 |
##まとめ##
パターン3, 4からScikit-learnのMacro-F1の説明や、前述のリンク先でも説明されている通り、Micro-F1はクラスサイズを考慮して、Macro-F1がクラスのサイズを考慮しないことが分かったと思います。
一方で、パターン5で示したように、Macro-F1を使うとクラスサイズが小さくてMicro-F1では見えないような、一部分で性能が落ち込んでいる時に評価が可能となるようです。
2つの指標の使い分けが良くわかっていない部分も多いので、マサカリがありましたら、宜しくお願い致します。
##参考##