マシューズ相関係数(MCC)のモデル評価


前回の記事は【ROC曲線とAUC】機械学習の評価指標を説明しました。今回の記事はマシューズ相関係数を説明します。

マシューズ相関係数とは

マシューズ相関係数とはMCC(Matthews Correlation Coefficient)と言われて、2値分類モデルの精度をみる指標です。真陽性と陰陰陽性と陰性を考慮し、クラスが非常に異なるサイズであっても使用できるバランスの取れた尺度と一般的にみなされます。MCCは、本質的に、- 1と+1との間の相関係数値である。 + 1の係数は完全予測を表し、0は平均ランダム予測を表し、-1は逆予測を表す。

統計は、φ係数としても知られています。 MCCは、2×2コンティンジェンシーテーブルのカイ2乗統計量に関連しています。

Matthews Correlation Coefficient

mcc01
mcc02
mcc03

 

では、PythonのSklearnで作成してみましょう。

 

import numpy as np

from sklearn.datasets import make_classification

from sklearn.model_selection import train_test_split

 

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import roc_auc_score

from sklearn.metrics import matthews_corrcoef

from sklearn.metrics import accuracy_score

from sklearn.metrics import f1_score

from sklearn.metrics import confusion_matrix

 

# サンプルデータの生成

# 1000 samples、5(infomative) + 2(redundant) + 13(independent) =  20 feature のデータを生成

dat = make_classification(n_samples=10000, n_features=20, n_informative=5, n_redundant=2, n_classes=2, n_clusters_per_class=10,weights=[0.9, 0.1])

 

X = dat[0]

y = dat[1]

 

# 学習用とテスト用データの分割

# 80%を学習、20%をテストに利用する

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)

 

# 学習モデルの構築とパフォーマンス評価

# ロジスティック回帰

clf = LogisticRegression()

clf.fit(X_train, y_train)

print (roc_auc_score(y_test, clf.predict_proba(X_test)[:,1]))

 

0.6502001416552198

 

matthews_corrcoef(y_test, clf.predict(X_test))

 

0.10110987216282583

 

accuracy_score(y_test, clf.predict(X_test))

 

0.897

 

f1_score(y_test, clf.predict(X_test))

 

0.037383177570093455

 

confusion_matrix(y_test, clf.predict(X_test))

 

array([[1790,    2],      

        [ 204,    4]], dtype=int64)

# 今度はわざとモデルを少ない方のみを全て当てるモデルにする。

# ロジスティック回帰

clf = LogisticRegression(class_weight={0:1, 1:20000})

clf.fit(X_train, y_train)

print (roc_auc_score(y_test, clf.predict_proba(X_test)[:,1]))

 

0.595885992853147

 

matthews_corrcoef(y_test, clf.predict(X_test))

 

0.0

 

accuracy_score(y_test, clf.predict(X_test))

 

0.097

 

f1_score(y_test, clf.predict(X_test))

 

0.17684594348222427

 

confusion_matrix(y_test, clf.predict(X_test))

 

array([[   0, 1806],

       [   0,  194]], dtype=int64)