ROC_AUC曲線の解説、実装と欠点
目次:
はじめに
ROC_AUC曲線は分類モデルのパフォーマンスを評価するための重要な指標です。現場やkaggleコンペでよく使われています。実装はシンプルでグラフも見やすいので、かなりいい指標ですが、全ての場合に使えるわけではないです。今回はROC_AUC曲線について詳しく解説していきたいと思います。
ROC_AUC曲線の解説
分かりやすくするために、高血圧の例を挙げて説明します。
二値分類モデルの予測には4つの結果があります:
真陽性(TP):実際は高血圧(P)で予測も高血圧(P)です。
偽陽性(FP):実際は高血圧ではない(N)が予測は高血圧(P)です。
真陰性(TN):実際は高血圧ではない(N)で予測も高血圧ではない(N)。
偽陰性(FN):実際は高血圧(P)で予測は高血圧ではない(N)。
P: Positive or 1
N: Negative or 0
そこで、4つの結果から真陽性率(TPR)と偽陽性率(FPR)も計算可能となります:
真陽性率(True Positive Rate):TP/(TP+FN)
偽陽性率(False Positive Rate):FP/(FP+TN)
下記のように計算されるFalse Positive RateをX軸とし、True Positive RateをY軸とします。しきい値(threshold:1->0)の変化に従って点をプロットし、それを線でつないだグラフをROC曲線(Receiver operating characteristic曲線,受信者操作特性曲線)と言います:
P(x)
P(x)>threshold -> Postive
緑線は理想モデルの結果、青線はランダムモデルの結果、普通に作られたモデルは赤線のように緑線と青線の間に描かれっています。
しきい値が1の場合に、予測結果は全てNegativeになってしまって、ROC曲線は必ず(0,0)に通過します。
しきい値が0の場合に、予測結果は全てPostiveになってしまって、ROC曲線は必ず(1,1)に通過します。
AUC(Area under curve)というのはROC曲線以下に囲まれた面積です。緑線は正方形で面積は1、青線は三角形で面積は0.5、普通に作られたモデルのAUCは下記のように0.5~1の間です:
ROC_AUC曲線の実装
ROC_AUC曲線の実装についてはscikit-learnの例をそのまま説明していきます:
import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression # irisのデータを導入 iris = datasets.load_iris() X = iris.data y = iris.target # Yを二値化 y = np.where(y>0, 1, y) # ノイズを加える random_state = np.random.RandomState(0) n_samples, n_features = X.shape X = np.c_[X, random_state.randn(n_samples, 200 * n_features)] # 順番をシャッフルする X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5,random_state=0) # Logistic分類モデルを構築する classifier = LogisticRegression() classifier.fit(X_train, y_train) #予測する y_score = classifier.predict_proba(X_test)[: ,1] #可視化する import matplotlib.pyplot as plt from sklearn.metrics import roc_curve, auc fpr, tpr,thred = roc_curve(y_test, y_score) roc_auc = auc(fpr, tpr) plt.figure() lw = 2 plt.plot(fpr, tpr, color='darkorange',lw=lw, label='ROC curve (area = %0.2f)' % roc_auc) plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--') plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver operating characteristic example') plt.legend(loc="lower right") plt.show()
プロットの結果:
繋がっている点の数が増えたらもっと滑かになるはずですが、今回は中途半端になってしまいました。
ROC_AUC曲線の欠点
ROC_AUC曲線は評価指標として分類モデルのパフォーマンスをよく反映できますけれども、不均衡データに対してしばしば簡単に0.90+上がってしまうという欠点があります。不均衡データの分類モデルを評価する際に、絶対ROC_AUC曲線を信じちゃダメです〜
次回は実装例に基づいてこういう欠点に関して説明します。ぜひご覧ください: