как интерпретировать AURO C кривую 5-кратной перекрестной оценки - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть trainind набор данных с 5-кратным CV, где один из 4-х кратных будет использоваться для проверки заданных параметров.

enter image description here

Если вы посмотрите на правильный график, очевидно, что каждый RO C имеет только один прямой угол, и форма кривой не колебался как левый.

Я обнаружил, что

Точки между ними, которые создают кривую, получаются путем вычисления TPR и FPR для различных пороговых значений решения от 1 до 0. Для грубой, angular «кривая», вы должны использовать только несколько порогов принятия решения: например, пороги принятия решения [1, 0,75, 0,5, 0,25, 0]. Для более плавной кривой вы должны использовать множество порогов решения, например пороговых значений принятия решения [1, 0,98, 0,96, 0,94,…, 0,08, 0,06, 0,04, 0,02, 0].

Я не являюсь иметь дело с любыми порогами вообще. Интересно, что я использую почти идентичные фрагменты кода для построения этих графиков:

1-й график (слева):

fp_r, tp_r, thresholds = roc_curve(test_labels, preds)
    roc_auc = auc(fp_r, tp_r)

fig.add_subplot(223)
plt.tight_layout()
lw = 2
plt.plot(fp_r, tp_r, color='m', lw=lw, label='ROC curve (area = %0.4f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='k', lw=lw, linestyle='--')
plt.ylabel("True Positive Rate", fontsize='small')
plt.xlabel("'False Positive Rate'", fontsize='small')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.legend(loc="lower right")

2-й график (справа)

cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=1221)
tprs = []
aucs = []
mean_fpr = np.linspace(0, 1, 100)
classifier = KerasClassifier(build_fn=vgg_16)
fig = plt.figure(figsize=(12,9))
ax = fig.add_subplot(224)
i = 1
for train, test in cv.split(x_train, train_labels):
   classifier.fit(x_train[train], train_labels[train], epochs = epochs, batch_size = batch_size, verbose=1)
   probas = classifier.predict(x_train[test])
   fpr, tpr, thresholds = roc_curve(train_labels[test], probas)
   tprs.append(interp(mean_fpr, fpr, tpr))
   tprs[-1][0] = 0.0
   roc_auc = auc(fpr, tpr)
   aucs.append(roc_auc)
   plt.plot(fpr, tpr, lw=1, alpha=0.3, label='ROC fold %d (AUC = %0.4f)' % (i, roc_auc))
   i += 1

ax.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r', label='Chance', alpha=.8)

mean_tpr = np.mean(tprs, axis=0)
mean_tpr[-1] = 1.0
mean_auc = auc(mean_fpr, mean_tpr)
std_auc = np.std(aucs)
ax.plot(mean_fpr, mean_tpr, color='b', label=r'Mean ROC (AUC = %0.4f $\pm$ %0.2f)' % (mean_auc, std_auc), lw=2, alpha=.8)

Сейчас вопрос, почему я получаю две кривые различной формы, хотя я использую идентичные фрагменты кода для построения?

Что требуется, чтобы сделать правильный график более похожим на правильный график? Короче говоря, мне нужно построить ROC для каждого сгиба, как показано ниже:

enter image description here

...