验证与测试与训练准确性。我应该比较哪一个来声称过拟合?

数据挖掘 机器学习 交叉验证 准确性 过拟合
2021-09-16 05:03:27

我在这里和互联网上阅读了几个答案,交叉验证有助于表明模型是否能很好地泛化以及过度拟合。

但是我很困惑,我应该比较测试/训练/验证中的哪两个准确度/错误才能看到模型是否过度拟合?

例如:

我将数据划分为 70% 的训练和 30% 的测试。

当我运行 10 倍交叉验证时,我得到了 10 个准确度,我可以取平均值/平均值。我应该将其称为validation accuracy

之后,我在 30% 的测试数据上测试模型并得到Test Accuracy.

在这种情况下,会是training accuracy什么?我应该比较哪两个准确度来查看模型是否过拟合?

2个回答

我比较哪两个准确度来查看模型是否过拟合?

您应该比较训练和测试的准确度以识别过度拟合。主观上远高于测试准确度的训练准确度表明过度拟合。

这里的“accuracy”是广义的,可以用F1、AUC、error(增加变减少,高变低)等来代替。

我建议“机器学习向往 - Andrew Ng ”的“偏差和方差”和“学习曲线”部分。它以清晰的叙述呈现所有案件的情节和解释。

当我运行 10 倍交叉验证时,我得到了 10 个准确度,我可以取平均值/平均值。我应该将其称为验证准确性吗?

不,这是一个 [估计] 测试准确度。
验证集和测试集(以及它们相应的准确性)之间的区别在于验证集用于构建/选择更好的模型,这意味着它会影响最终模型。然而,由于 10-fold CV 总是在其 10% 的保留中测试一个已经构建的模型,并且这里不用于在模型之间进行选择,所以它的 10% 保留是测试集而不是验证集。

之后,我在 30% 的测试数据上测试模型并获得测试准确度。

如果不使用 K-fold 在多个模型之间进行选择,则不需要这部分,对 100% 的数据运行 K-fold 以获得测试准确度。否则,您应该保留此测试集,因为 K-fold 的结果将是验证准确度。

在这种情况下,训练准确率是多少?

从 10 折中的每一折中,您可以获得 10% 数据的测试准确度和 90% 数据的训练准确度。在 python 中,方法cross_val_score只计算测试精度。以下是两者的计算方法:

from  sklearn import model_selection
from sklearn import datasets
from sklearn import svm

iris = datasets.load_iris()
clf = svm.SVC(kernel='linear', C=1)
scores = model_selection.cross_validate(clf, iris.data, iris.target, cv=5, return_train_score=True)
print('Train scores:')
print(scores['train_score'])
print('Test scores:')
print(scores['test_score'])

也设置return_estimator = True获得训练有素的模型。

更多关于验证集

验证集出现在两种一般情况下:(1)构建模型,(2)在多个模型之间进行选择,

  1. 构建模型的两个示例:我们 (a) 停止训练神经网络,或 (b) 当验证集上模型的准确性开始下降时停止修剪决策树。然后,我们在一个保留集上测试最终模型,以获得测试精度。

  2. 在多个模型之间进行选择的两个示例:

    一个。我们在一个有 3 层的神经网络和一个有 5 层的神经网络上进行 K-fold CV(为每个神经网络获取 K 个模型),然后我们选择在 K 个模型上平均验证精度最高的 NN;假设 5 层神经网络。最后,我们在 80% 的训练、20% 的组合 K 折叠的验证拆分上训练 5 层 NN,然后在保留集上对其进行测试以获得测试准确度。

    湾。我们在验证集上应用两个已经构建的 SVM 和决策树模型,然后我们选择具有最高验证准确度的一个。最后,我们在保留集上测试所选模型以获得测试准确性。

交叉验证将您的数据拆分为 K 个折叠。每个折叠包含一组训练数据和测试数据。你是正确的,你得到了 K 个不同的错误率,然后取平均值。这些错误率来自每个 K 折的测试集。如果你想得到训练错误率,你可以计算每个 K 折训练部分的错误率,然后取平均值。