Python 使用KFold CV或分层CV时,计算性能指标的正确方法是什么?
在阅读了一些教程之后,这是我第一次构建Keras深度学习模型,因为我是机器学习和深度学习的初学者。大多数教程都使用“训练测试”拆分来训练和测试模型。然而,我选择了使用StratifiedKFold CV。代码如下Python 使用KFold CV或分层CV时,计算性能指标的正确方法是什么?,python,keras,cross-validation,metrics,confusion-matrix,Python,Keras,Cross Validation,Metrics,Confusion Matrix,在阅读了一些教程之后,这是我第一次构建Keras深度学习模型,因为我是机器学习和深度学习的初学者。大多数教程都使用“训练测试”拆分来训练和测试模型。然而,我选择了使用StratifiedKFold CV。代码如下 X = dataset[:,0:80].astype(float) Y = dataset[:,80] kfold = StratifiedKFold(n_splits=10,random_state=seed) for train, test in kfold.split(X, Y)
X = dataset[:,0:80].astype(float)
Y = dataset[:,80]
kfold = StratifiedKFold(n_splits=10,random_state=seed)
for train, test in kfold.split(X, Y):
# create model
model = Sequential()
model.add(Dense())
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='Adam',metrics=['accuracy'])
model.fit(X[train], Y[train], epochs=100,batch_size=128, verbose=0)
scores = model.evaluate(X[test], Y[test], verbose=1)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
cvscores.append(scores[1] * 100)
print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores), numpy.std(cvscores)))
Y[pred]= model.predict(X[test])
acc = accuracy_score(Y[test],Y[pred])
confusion = confusion_matrix(Y[test], Y[pred])
print(confusion)
plot_confusion_matrix(confusion, classes =['No','Yes'],title='Confusion Matrix')
TP= confusion[1,1]
TN= confusion[0,0]
FP= confusion[0,1]
FN= confusion[1,0]
print('Accuracy: ')
print((TP + TN) / float(TP + TN + FP + FN))
print(accuracy_score(Y[test],Y[pred]))
fpr, tpr, thresholds = roc_curve(Y[test], y_pred_prob)
plt.plot(fpr, tpr)
print(roc_auc_score(y_test, y_pred_prob))
y_pred_class = binarize([y_pred_prob], 0.3)[0]
confusion_new = confusion_matrix(Y[test], y_pred_class)
print(confusion_new)
我已经理解了Kfold CV和StratifiedKFoldCV的理论概念。我遇到了,还有一些链接。但是,当我计算性能指标时,它会给我以下错误
NameError: name 'pred' is not defined
NameError: name 'y_pred_prob' is not defined
NameError: name 'roc_curve' is not defined
我做错了什么?为什么我会犯这些错误?我该如何解决这个问题
谢谢。以下是您可以尝试的方法:
X = dataset[:,0:80].astype(float)
Y = dataset[:,80]
# define model
model = Sequential()
model.add(Dense(10))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='Adam',metrics=['accuracy'])
# create folds
folds = list(StratifiedKFold(n_splits=10, shuffle=True, random_state=1).split(X, Y))
# train model for every fold
for j, (train_idx, val_idx) in enumerate(folds):
print('\nFold ',j)
X_train_cv = X[train_idx]
y_train_cv = Y[train_idx]
X_valid_cv = X[val_idx]
y_valid_cv= Y[val_idx]
model.fit(X_train_cv,
y_train_cv,
epochs=100,
batch_size=128,
validation_data = (X_valid_cv, y_valid_cv),
verbose=0)
print(model.evaluate(X_valid_cv, y_valid_cv))
# check metrics for each fold
pred = model.predict(X_valid_cv)
acc = accuracy_score(y_valid_cv, pred)
confusion = confusion_matrix(y_valid_cv, pred)
print(confusion)
这些变量都不是在您提供的代码中创建的,那么您希望如何使用它们呢?您有
Y[pred]
,但尚未定义pred
。您在函数调用中使用了y\u pred\u prob
,但尚未导入或定义名为roc\u曲线的函数
,也未导入或定义名为y\u pred\u prob
的变量。我明白了。什么是X\u-valid\u-cv和y\u-valid\u-cv?它与X_test_cv和y_test_cv相同吗?代码计算所有折叠的混淆矩阵。如果要在完成10倍cv后计算最终混淆矩阵,该怎么办?如何才能做到这一点并绘制AUC-ROC曲线?