マルチラベル分類器の評価指標(Micro-F1/Macro-F1)の振る舞い

##概要##
機械学習で分類問題をするときに、複数のラベルについての予想をしたい場合があります。この際にも分類問題と同じようにRecall, Precision, F値を使用するようです。例えばScikit-learnにも同様に関数は実装されていますし、マルチラベルに対応しています。ただマルチラベルのF値については

* binary
* micro
* macro
* weighted
* samples

など、様々な指標が存在するようです。そこで、論文で多く使われているように見えるmicro-F1とmacro-F1が学習データの変化でどう振る舞うのか調べてみました。Excelで(出落ち)。

なお、micro-F1とmacro-F1の計算方法についてはsa-wa-mさんの[分類器の学習方法と評価方法1(指標の説明)](http://qiita.com/sa-wa-m/items/6a4b7728f5a18f8b58b5#%E6%AD%A3%E8%A7%A3%E7%8E%87)に纏められています。

##パターン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値を計算したもの
    * 2*Micro-R*Micro-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つの指標の使い分けが良くわかっていない部分も多いので、マサカリがありましたら、宜しくお願い致します。

##参考##
* [分類器の学習方法と評価方法1(指標の説明)](http://qiita.com/sa-wa-m/items/6a4b7728f5a18f8b58b5#%E8%A4%87%E6%95%B0%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%B8%E3%81%AE%E5%88%86%E9%A1%9E%E3%81%AE%E5%A0%B4%E5%90%88)
* [sklearn.metrics.f1_score](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html)
*