はじめに
本記事では多クラス分類(マルチクラス分類)における評価値の考え方・計算方法について説明します.具体的には,最も重要な混同行列の作成方法から始まり,適合率(Precision),再現率(Recall),F1スコア,マクロ平均,およびマイクロ平均を扱います.
想定読者
- 混同行列(FPとかTPとか)よく分かんね〜という方
- 2値分類の混同行列は分かるけど多クラス分類だとイメージ湧かね〜という方
目次
混同行列
多クラス分類における評価指標を理解するには,混同行列を理解することが重要です.むしろ,混同行列さえ理解できれば冒頭で挙げた評価値は全て理解できます.
いきなりですが,混同行列は「真のクラス」を一つ決めて初めて作成できます.例えば,クラスA,Bを予測する2値分類を考えると,「クラスAを真とした混同行列」,「クラスBを真とした混同行列」が作れます.つまり,混同行列はクラスの数だけ作れるのです.この考えは,多クラス分類へ応用する際に非常に重要になります.
ただ多くの場合,混同行列が解説されるときには,暗に真のクラスを決めた後の状況を仮定しています.よって,真のクラスという認識はあまりなく,混同行列がクラスの数だけ作れるということに驚く人もいるかもしれません.
以降は,そういった感覚に基づいて,混同行列の理解を深めます.
TPとかFNとかって何
まずはTPなどの記号の意味をおさらいします.
TP: True Positive,真のものを真と予測した(正解)
FP: False Positive,偽のものを真と予測した(間違い)
TN: True Negative,偽のものを偽と予測した(正解)
FN: False Negative,真のものを偽と予測した(間違い)
4つだけなので覚えるのも良いですが,この表記はTrue/False
とPositive/Negative
の組み合わせであることに注目すると,理解しやすいと思います.
True/False
は,予測が正解かどうかです.正解できたらTrueだし,間違えたらFalseです.
Positive/Negative
は,予測が真かどうかです.予測が真ならPositiveだし,偽ならNegativeです.
これを組み合わせた表記なので,予測結果とその正誤をみれば,4つのうちどれに当てはまるかはすぐに分かると思います.
2値分類における混同行列
まずは2値分類を考えます.2値分類は,2つのクラスがあって,入力がどちらに分類されるのかを推定するものです.代表例として,文章がポジティブ,ネガティブのどちらなのかを推定するタスクが挙げられます.この節ではこの例を使うことにします.
混同行列を作成するためには,「真のクラス」を決める必要があります.一旦,上の例を用いて,真のクラスをポジティブとしてみます.このとき.混同行列は次のように作成できます.
本当の正解 pos(真) neg(偽) モデルの pos(真) TP FP 推定結果 neg(偽) FN TN
pos
はpositive,neg
はnegativeのつもりです.ポジティブを真と決めたので,ネガティブは偽になります.このように,2値分類では2x2の混同行列になります.これは,一般的な混同行列の説明でよく見る形でもあります.
一方,真のクラスをネガティブにした場合は次のようになります.
本当の正解 pos(偽) neg(真) モデルの pos(偽) TN FN 推定結果 neg(真) FP TP
このように,どのクラスを真のクラスと捉えるかで,混同行列は見た目が変わることがわかると思います.ただし,このような混同行列を図示するときには,TPが左上に来るように行や列を入れ替えることが一般的なのかもしれません.今回はあえてそのままにしています.
多クラス分類における混合行列
次に3値分類を考えましょう.3つのクラスがあって,入力がどれに分類されるのかを推定します.例えば,文章をポジティブ,ネガティブ,それからニュートラル(特に感情が無いようなもの)に分類するタスクが考えられます.この節ではこの例を使うことにします.
混同行列を作成するためには「真のクラス」を決めないといけないので,一旦,真のクラスをポジティブとします.このとき,混同行列は次のように作成できます.
本当の正解 pos(真) neg(偽) neu(偽) モデルの pos(真) TP FP FP 推定結果 neg(偽) FN TN TN neu(偽) FN TN TN
neu
はニュートラルのつもりです.
真のクラスをポジティブと決めたので,それ以外のクラスは全て偽になることに注意してください.
FN
,FP
,TN
は行列中に複数存在していますが,ラベルの付け方次第で一つの要素にまとめることができます.いま,混同行列の行ラベルや列ラベルは,pos
のようなクラス名になっています.現在は3値分類を考えているので,クラス名も3種類であり,混同行列も3x3にならざるを得ません.一方で,真偽に注目すると,当然ながら2種類です.よって,真偽に注目して要素をまとめると,混同行列は2x2のサイズに凝縮できます.これはすなわち,FP
,FN
,TN
を合計して一つの要素にまとめたとも言い換えられます.
真: posに分類される 偽: posに分類されない 本当の正解 真 偽 モデルの 真 TP FP 推定結果 偽 FN TN
さて,改めて上記の混同行列は,真のクラスをポジティブと決めたときのものです.これと同じように,真のクラスをネガティブとした場合や,ニュートラルとした場合も混同行列が作れます.少しくどいかもしれませんが,ネガティブの場合もざっくりやってみましょう.
まず,3x3の混同行列は次のようになります.
本当の正解 pos(偽) neg(真) neu(偽) モデルの pos(偽) TN FN TN 推定結果 neg(真) FP TP FP neu(偽) TN FN TN
これを真偽に注目してまとめると,
真: negに分類される 偽: negに分類されない 本当の正解 真 偽 モデルの 真 TP FP 推定結果 偽 FN TN
となって,「真のクラスがネガティブ」バージョンが完成しました.3x3の混同行列を2x2に凝縮できたことが,次に紹介する評価値の計算を行う上で嬉しいポイントです.
まとめると,混合行列は,真とするクラスを決めて初めて作成できるものであり,各クラスに対して作成できるものでした.また,分類候補が何クラスになっても混同行列は作れますし,真偽に注目してまとめると必ず2x2の行列に凝縮できます.
適合率と再現率,F1スコア
評価値の計算方法を紹介します.混同行列さえ作成できれば,計算は一瞬です.評価値は混同行列から計算するので,評価値は各クラスに対して計算できることに注意します.例えば,クラスAの適合率,クラスBの適合率,というように計算できます.
いま,混同行列が次のようにあるとしましょう.
本当の正解 真 偽 モデルの 真 TP FP 推定結果 偽 FN TN
このとき,適合率は
で計算できます.また,再現率は
で計算できます.
適合率は,「モデルが真と予測した中でいくつ正解できた?」という指標です.TPとFPを使うので,(両方Pがついていることからも)分母はモデルが真と予測した数です.
再現率は,「正解が真であるものの中でいくつ正解できた?」という指標です.分母は正解が真であるものの数です.TPとFNの和がなぜそのような解釈になるのかはちょっと難しいですが,「TP: 真だと言ったら正解だった = そのデータは真」,「FN: 偽であると言ったら間違いだった = そのデータは真」というような説明から解釈できそうです.
F1スコアは,適合率と再現率の調和平均です.
適合率と再現率は,トレードオフの関係であることが知られています.適合率を伸ばすためには,できるだけ確信度が高いものだけを真だと予測すればいいですが,そうすると正解の集合を網羅できず,再現率が伸びません.一方,再現率を伸ばすのは簡単で,全部のデータについて問答無用で真と予測すれば100%を達成できます.しかし,多くの偽であるデータに対しても真と予測するので,適合率は伸びません.この2つの指標を良い感じにまとめてくれるのがF1スコアです.
マクロ平均とマイクロ平均
マクロ平均とマイクロ平均は,全クラスを対象にしたときの評価値を計算する方法です.
マクロ平均
マクロ平均は,各クラスの評価値を計算した後に平均する方法です.単純に評価値を足して,クラスの数で割ります.例えば,クラスA,B,Cの3値分類を考えたとき,各クラスの適合率をとすると,マクロ平均は
で計算できます.再現率やF1スコアについても,同じように計算できます.
マイクロ平均
マイクロ平均は,各クラスの混同行列を,要素ごとに全部足してから評価値を計算します.つまり,TPはTPだけで合計し,FNもFNだけで合計し,TNもFPもそれぞれ合計して一つの混同行列にまとめます.その後,そこから評価値を計算します.例えば,クラスA,B,Cの3値分類を考えたとき,各クラスのTPとFPを,およびとすると適合率のマイクロ平均は
で計算できます.
ざっくりした違い
マクロ平均とマイクロ平均の大きな違いとして,事例数が少ないクラスに対する頑健さがあります.事例数とはデータの数のことです.例えば,極端な場合として,事例数が1つしかないクラスを考えます.このクラスの評価値は正解すれば1,間違えれば0になるため非常に極端です.マクロ平均はこの影響を強く受けます.一方,マイクロ平均はあまり影響を受けません.評価値の分母分子に1が足されるかどうかという程度です.
pythonでの実装
pythonでの実装では,sklearnのclassification_report
を使うのが便利です.詳しくは以下の記事を参照してください.