I am working on binary classification where there are 2 inputs (image and numerical data) and one output (sigmoid). I need to perform a 5-fold cross validation and plot ROC curves for each fold. This is a code snippet of model.eval
:
model.eval()
with torch.no_grad():
valid_preds_fold = np.zeros((x_val_fold.size(0))) # (359,)
ii = 0
for x_img_batch, x_num_batch, y_batch in valid_loader: # THIS LOOP
y_val_pred = model(x_img_batch, x_num_batch).detach()
valid_preds_fold[ii * batch_size:(ii + 1) * batch_size] = sigmoid(y_val_pred.cpu().numpy())[:, 0]
ii += 1
fpr, tpr, thresholds = roc_curve(y_val_fold.cpu(), valid_preds_fold) # torch.Size([359, 1]) AND
tprs.append(np.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='fold %d (AUC = %0.3f)' % (i + 1, roc_auc))
ax.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r', label='level', 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'meanAUC = %0.3f $\pm$ %0.2f)' % (mean_auc, std_auc), lw=2, alpha=.8)
for
loop which is iterating through valid_loader
looks suspicious to me. Basically, what I need to do is that I need to collect a batch of validation predictions (y_val_pred
) to each validation fold’s list (valid_preds_fold
) to then calculate the fpr, tpr, thresholds = roc_curve(y_val_fold.cpu(), valid_preds_fold)
. I have referred to a couple of resources to come this end but the AUC score of each fold is too low than expected.
Any code inspection to improve the above code is appreciated. Thanks