機械学習 ROC曲線

ROC(Receiver Operating Characteristic)曲線は、機械学習分類モデルを、その分類器の閾値を変えて計算されるFPRとTPRを基準として選ぶのに使える。
 ROC曲線の対角線はランダム推量と解釈され、この対角線を下回る分類モデルは当て推量より劣ると解釈される。曲線より下の面積(Area Under the Curve)が、その分類モデルの性能とされる。
 このROC曲線を前記事の混合行列と同じく、Brest Cancerのデータセットを使って実装していく。
 ここでは、訓練データの特徴量$${\bm{X}}$$を標準化し、ロジスティック回帰を使って分類する。
 また、実際には必要はないが、ROC曲線をより明確に興味深く示すために、特徴量を二つ選び出し、さらに層化k分割交差検証の分割数を3としている。

from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold

pipe_lr = make_pipeline(StandardScaler(),
                        #PCA(n_components=2),
                        LogisticRegression(penalty='l2', 
                                           random_state=1,
                                           solver='lbfgs',
                                           C=100.0))

X_train2 = X_train[:, [4, 14]]
    

cv = list(StratifiedKFold(n_splits=3).split(X_train, y_train))

k分割交差検証の分割数3のそれぞれについて、FPRを横軸に、TPRを縦に取り、ROC曲線を表示する。

fig = plt.figure(figsize=(7, 5))

mean_tpr = 0.0
mean_fpr = np.linspace(0, 1, 100)
all_tpr = []

for i, (train, test) in enumerate(cv):
    probas = pipe_lr.fit(X_train2[train],
                         y_train[train]).predict_proba(X_train2[test])

    fpr, tpr, thresholds = roc_curve(y_train[test],
                                     probas[:, 1],
                                     pos_label=1)
    mean_tpr += interp(mean_fpr, fpr, tpr)
    mean_tpr[0] = 0.0
    roc_auc = auc(fpr, tpr)
    plt.plot(fpr,
             tpr,
             label='ROC fold %d (area = %0.2f)'
                   % (i+1, roc_auc))

さらに、平均のROC曲線と、ランダム推量、理想パフォーマンス曲線も表示し、曲線下側の面積をラベルで表示する。

plt.plot([0, 1],
         [0, 1],
         linestyle='--',
         color=(0.6, 0.6, 0.6),
         label='Random guessing')

mean_tpr /= len(cv)
mean_tpr[-1] = 1.0
mean_auc = auc(mean_fpr, mean_tpr)
plt.plot(mean_fpr, mean_tpr, 'k--',
         label='Mean ROC (area = %0.2f)' % mean_auc, lw=2)
plt.plot([0, 0, 1],
         [0, 1, 1],
         linestyle=':',
         color='black',
         label='Perfect performance')

plt.xlim([-0.05, 1.05])
plt.ylim([-0.05, 1.05])
plt.xlabel('False positive rate')
plt.ylabel('True positive rate')
plt.legend(loc="lower right")

plt.tight_layout()
plt.show()
ROC曲線

この記事が気に入ったらサポートをしてみませんか?