機械学習 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()
![](https://assets.st-note.com/img/1696865547310-kFpHpANDku.png?width=1200)