为啥我的 cross_val_score() 准确度很高,但我的测试准确度却很低?

Posted

技术标签:

【中文标题】为啥我的 cross_val_score() 准确度很高,但我的测试准确度却很低?【英文标题】:Why is my cross_val_score() accuracy very high, but my test accuracy very low?为什么我的 cross_val_score() 准确度很高,但我的测试准确度却很低? 【发布时间】:2020-07-05 02:27:28 【问题描述】:

在使用 KerasWrapper 时,我得到了非常高的训练准确率:95% 以上

X_train, X_test, y_train, y_test = train_test_split(train_data, train_labels, shuffle=True, test_size=0.3, random_state=42)

estimator = KerasClassifier(build_fn=build_model(130, 130, 20000), epochs=2, batch_size=128, verbose=1)
folds = KFold(n_splits=3, shuffle=True, random_state=128)
results = cross_val_score(estimator=estimator, X=X_train, y=y_train, cv=folds)

但是,我的预测准确度一点也不高。这是过拟合的经典案例吗?

prediction = cross_val_predict(estimator=estimator, X=X_test, y=y_test, cv=folds)

metrics.accuracy_score(y_test_converted, prediction)
# accuracy is 0.03%

如何提高我的测试准确性?谢谢

【问题讨论】:

【参考方案1】:

这是过拟合的经典案例吗?

不是 - 只是您的流程有误。

cross_val_predict 并不像您在此处所做的那样应用于 test 数据。低准确率可能是由于您尝试在测试数据集的每一折中重新训练您的模型,这比您的训练小得多。

正确的程序是 - 用训练数据拟合您的估计器,在测试集上获得预测,然后计算测试准确度,即:

estimator.fit(X_train, y_train)
y_pred = estimator.predict(X_test)
metrics.accuracy_score(y_test, y_pred)

【讨论】:

哦,谢谢。在这种情况下如何使用 KFold 拆分数据? @AnanSrivastava 您不要使用KFold 拆分测试集 - 您只需使用整个测试数据X_test 来获得预测和准确性,如显示在答案中。您可以继续使用KFold 处理您的训练 数据,就像您一样。 我如何在包装器中使用earlystopping?我的估算器中没有回调参数,因为它是一个 keraswrapper。 @AnanSrivastava 请不要将 cmets 用于无关紧要的后续问题 - 非常欢迎您使用问题的详细信息打开一个新问题(它是免费的!)。 相关问题:我的 Kfold 如何在 model.fit() 中使用,因为我只是通过 X_train 和 y_train?

以上是关于为啥我的 cross_val_score() 准确度很高,但我的测试准确度却很低?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn cross_val_score 的准确性低于手动交叉验证

为啥 xgboost.cv 和 sklearn.cross_val_score 给出不同的结果?

我从 GridSearchCV 获得的 R^2 分数与我从 cross_val_score 获得的分数非常不同,为啥? (sklearn,python)

sklearn中的cross_val_score交叉验证

在 sklearn cross_val_score 上评估多个分数

是否可以在 cross_val_predict 中使用与 cross_val_score 中相同的 k 折叠?