#初めに
皆様__マシューズ相関係数__をご存知でしょうか。
マシューズ相関係数とは二値分類学習器における評価指標の一つであり、__不均衡データに対しても適切に評価が可能な評価指標__として知られています。
結構マイナー(?)な評価指標の為、私もつい最近仕事で目にするまでその存在を忘れていました。
扨、私が学生時代の話に遡りますが、私が所属していた研究室では「マシューズ相関係数ってゴミなのでは?」と一時期話題になっていました。混同行列とマシューズ相関係数が示す値が感覚的におかしかったのです。
(正確には感覚的におかしかったというより、ただ納得がいかなかっただけですが)
まあ、この話は最後にするとして今回の本題は別になります。
同時期に研究室の人がこんなことを言っていました。
「マシューズ相関係数とピアソン相関係数一緒だったわ」
その時は「はへぇ」くらいにしか思いませんでしたが、久しぶりにマシューズ相関係数に対面して気になったので今回はこれを検証していきたいと思います。
#マシューズ相関係数とは
まずは「マシューズ相関係数なんて初耳!」って方の為に定義を示しておきます。
二値分類モデルの出力の混同行列を下表の通りとしたとき、マシューズ相関係数(MCCと略します)は
MCC=\frac{N_{TP}N_{TN}-N_{FP}N_{FN}}{\sqrt{(N_{TP}+N_{FP})(N_{FN}+N_{TN})(N_{TP}+N_{FN})(N_{FP}+N_{TN})}}
と定義されます。
MCCは$-1$以上$1$以下の実数を取り、最高精度の時$1$、最低精度の時$-1$、ランダム予測の時$0$となります。
#マシューズ相関係数=ピアソン相関係数なのか?
それでは今回の主目的である「マシューズ相関係数とピアソン相関係数は一致するのか」について検証していきます。
一応言っておくとピアソン相関係数とは俗に"相関係数"と呼ばれるやつのことです。
また、混同行列におけるピアソン相関係数とは、$Positive=1$、$Negative=0$としたときの予測データ系列と正解データ系列の相関係数の値となります。
###実際に計算して確かめてみる
まずは適当な混同行列に対してマシュー相関係数とピアソン相関係数を計算し、計算結果が一致するか確かめてみます(言語はPython3)
以下の通り、適当な混同行列と、ピアソン相関係数計算用のデータフレームを作成します。
import numpy as np
import pandas as pd
#混同行列の各要素
N_TP = 1000
N_FP = 200
N_FN = 100
N_TN = 5000
#混同行列を生成して出力
conf_MX = pd.DataFrame({"Positive":[N_TP,N_FN], "Negative":[N_FP,N_TN]},
index=["Positive","Negative"])
print(conf_MX)
"""出力
Positive Negative
Positive 1000 200
Negative 100 5000
"""
TP = [[1,1] for i in range(N_TP)] #[1,1]のデータをTrue Positiveの数だけ作成
FP = [[1,0] for i in range(N_FP)] #[1,0]のデータをFalse Positiveの数だけ作成
FN = [[0,1] for i in range(N_FN)] #以下同様に作成
TN = [[0,0] for i in range(N_TN)]
#予測{0,1}、正解{0,1}をカラムに持ったデータフレームを作成して出力
df = pd.DataFrame(TP + FP + FN + TN, columns=["pred", "truth"])
print(df.head(10))
"""出力
pred truth
0 1 1
1 1 1
2 1 1
3 1 1
4 1 1
5 1 1
6 1 1
7 1 1
8 1 1
9 1 1
データフレームの方はどうなっているかわかりづらいですが、$(1,1)$が$N_{TP}$個、$(1,0)$が$N_{FP}$個、$(0,1)$が$N_{FN}$個、$(0,0)$が$N_{TN}$個の$(N_{TP}+N_{FP}+N_{FN}+N_{TN})$行$×2$列のデータフレームになっています。
これらについてマシュー相関係数とピアソン相関係数をそれぞれ計算すると、、、
mcc = (N_TP*N_TN - N_FP*N_FN) / np.sqrt((N_TP+N_FP)*(N_FN+N_TN)*(N_TP+N_FN)*(N_FP+N_TN))
corr = df.corr()
print("マシューズ相関係数:" + str(mcc))
print("ピアソン相関係数 :" + str(corr["pred"]["truth"]))
"""出力
マシューズ相関係数:0.841696686101643
ピアソン相関係数 :0.8416966861014104
"""
おお、確かに一致しました!!(かなり小さい位で異なっているのは多分誤差でしょう)
###数式で証明してみる
なんとなくマシュー相関係数とピアソン相関係数が一致しそうということは分かったので、数式で厳密に証明していきます。
因みに以下かなりごちゃごちゃした計算が続きますが、平均・分散・共分散・(ピアソン)相関係数あたりの定義を知ってさえいれば中学生でもできる計算になっています。
先に平均、分散、共分散の計算方法だけ書いておきます。
データ系列$x=x_1, x_2, \ldots, x_N$と$y=y_1, y_2, \ldots, y_N$があるとき、$x$の平均値$E(x)$と分散$V(x)$、及び$x$と$y$の共分散$Cov(x,y)$と(ピアソン)相関係数$Corr(x,y)$は以下のように計算されます。
\begin{align}
E(x) & = \frac{1}{N}\sum_i^Nx_i\\\\
V(x) & = E(x^2)-E^2(x)\\\\
Cov(x,y) &= E(xy)-E(x)E(y)\\\\
Corr(x,y) &= \frac{Cov(x,y)}{\sqrt{V(x)V(y)}}
\end{align}
扨、今回使用するデータはこんな感じになっているので、求めるピアソン相関係数は以下になります。
\begin{align}
Corr(Pred,Truth) &= \frac{Cov(Pred,Truth)}{\sqrt{V(Pred)V(Truth)}}\\\\
\end{align}\\
早速$Corr(Pred,Truth)$の方をいじくりまわしていきましょう。
まず、さっき示した分散や共分散の定義を用いた上でいろんな平均値を求めて代入するとこんな感じ。
\begin{align}
&\frac{Cov(Pred,Truth)}{\sqrt{V(Pred)V(Truth)}} \\\\
&= \frac{E(Pred・ Truth)-E(Pred)E(Truth)}{\sqrt{(E(Pred^2)-E^2(Pred))(E(Truth^2)-E^2(Truth))}}\\\\
&= \frac{\frac{N_{TP}}{N_{TP}+N_{FP}+N_{FN}+N_{TN}}-\frac{N_{TP}+N_{FP}}{N_{TP}+N_{FP}+N_{FN}+N_{TN}}・\frac{N_{TP}+N_{FN}}{N_{TP}+N_{FP}+N_{FN}+N_{TN}}}{\sqrt{\{\frac{N_{TP}+N_{FP}}{N_{TP}+N_{FP}+N_{FN}+N_{TN}}-(\frac{N_{TP}+N_{FP}}{N_{TP}+N_{FP}+N_{FN}+N_{TN}})^2\}\{\frac{N_{TP}+N_{FN}}{N_{TP}+N_{FP}+N_{FN}+N_{TN}}-(\frac{N_{TP}+N_{FN}}{N_{TP}+N_{FP}+N_{FN}+N_{TN}})^2\}}}
\end{align}
各所で出てくる$N_{TP}+N_{FP}+N_{FN}+N_{TN}$が最高にうざいので、$N$と置いた上で一気に計算していきます。
\begin{align}
& \frac{\frac{N_{TP}}{N}-\frac{N_{TP}+N_{FP}}{N}・\frac{N_{TP}+N_{FN}}{N}}{\sqrt{\{\frac{N_{TP}+N_{FP}}{N}-(\frac{N_{TP}+N_{FP}}{N})^2\}\{\frac{N_{TP}+N_{FN}}{N}-(\frac{N_{TP}+N_{FN}}{N})^2\}}} \\\\
&=
\frac{N_{TP}-\frac{1}{N}(N_{TP}+N_{FP})(N_{TP}+N_{FN})}{\sqrt{
(N_{TP}+N_{FP})(N_{TP}+N_{FN})\{1-\frac{2N_{TP}+N_{FP}+N_{FN}}{N}+\frac{(N_{TP}+N_{FP})(N_{TP}+N_{FN})}{N^2}\}}} \\\\
&=
\frac{N_{TP}-\frac{1}{N}(N_{TP}+N_{FP})(N_{TP}+N_{FN})}{\sqrt{
(N_{TP}+N_{FP})(N_{TP}+N_{FN})(\frac{N_{TP}+N_{FP}}{N}-1)(\frac{N_{TP}+N_{NP}}{N}-1)}} \\\\
\end{align}
扨、いい感じにまとまってきた感があるので、$N$をもとに戻してあげると
\begin{align}
&\frac{N_{TP}-\frac{(N_{TP}+N_{FP})(N_{TP}+N_{FN})}{N_{TP}+N_{FP}+N_{FN}+N_{TN}}}{\sqrt{
(N_{TP}+N_{FP})(N_{TP}+N_{FN})(\frac{N_{TP}+N_{FP}}{N_{TP}+N_{FP}+N_{FN}+N_{TN}}-1)(\frac{N_{TP}+N_{NP}}{N_{TP}+N_{FP}+N_{FN}+N_{TN}}-1)}}\\\\
&=
\frac{N_{TP}N_{TN}-N_{FP}N_{FN}}{\sqrt{(N_{TP}+N_{FP})(N_{FN}+N_{TN})(N_{TP}+N_{FN})(N_{FP}+N_{TN})}}\\\\
&=MCC\\\\
\end{align}
と、いい感じに$MCC$に一致するわけです(疲れた)。
やっぱりマシューズ相関係数はピアソン相関係数と同じでした。
#余談
最後に冒頭で少し話した「マシューズ相関係数ゴミ疑惑」について話したいと思います。
※断っておきますが、以下の内容は__マシューズ相関係数を批判しているものではありません__。
私がこの評価指標の有用性を見い出せていないだけであり、あえて記事にし周知することで、
どこかの天才にマシューズ相関係数の有用性を教えて頂きたいと考えています。
マシューズ相関係数ゴミ疑惑が出た原因は、最初に話した通りその値が感覚とずれているからでした。
例えば下の混同行列を見てください。皆さんはこの混同行列から計算されるマシューズ相関係数はどれくらいだと思いますか?
答えは__約$0.13$__です。
どうですか?感覚とあっていましたでしょうか?
多くの人は最低でも$0.5$以上の数値を想像したのではないでしょうか。
上で書いた混同行列は一見かなり良い予測ができているように見え、実務でも多くの場合使い物になるように思えます。
しかし、マシューズ相関係数はデータの不均衡性を考慮しているものの、__兎に角見栄えが悪くなる__んです。
しかもマシューズ相関係数は一見式が意味不明の為、見栄えが悪いことに対する言い訳も一筋縄ではいきません。
以上マシューズ相関係数がゴミと呼ばれていた所以でした。
おとなしく再現率・適合率を使った方がよさそうです。