Scikit learn 为什么交叉验证的得分始终高于正常拟合和评分?

Scikit learn 为什么交叉验证的得分始终高于正常拟合和评分?,scikit-learn,Scikit Learn,我试图了解交叉验证和评分的工作原理,并观察到一些奇怪的行为 我实例化一个分类器,然后对它进行4次交叉验证,得到4个分数,准确率在90%+-0.5%之间 然后,我在所有训练数据上重新装配模型,并在测试数据上打分。我也在这段代码中对训练数据打分,只是为了证明一点 我在将数据拆分为测试集和训练集后运行此代码 从sklearn.employ导入GradientBoostingClassifier 从sklearn.metrics导入make_scorer,平衡_准确性_分数 gbc=GradientBo

我试图了解交叉验证和评分的工作原理,并观察到一些奇怪的行为

我实例化一个分类器,然后对它进行4次交叉验证,得到4个分数,准确率在90%+-0.5%之间

然后,我在所有训练数据上重新装配模型,并在测试数据上打分。我也在这段代码中对训练数据打分,只是为了证明一点

我在将数据拆分为测试集和训练集后运行此代码

从sklearn.employ导入GradientBoostingClassifier
从sklearn.metrics导入make_scorer,平衡_准确性_分数
gbc=GradientBoostingClassifier()
分数=交叉分数(gbc、X、y、cv=4,分数=得分者(平衡的准确性分数))
打印('简历分数:',分数)
打印('cv分数均值:',分数.mean())
gbc.fit(X_系列、y_系列)
打印(‘测试中的测试分数:’,平衡的准确性分数(gbc.predict(X_测试),y_测试))
打印('列车上的测试分数:',平衡精度分数(gbc.预测(X列车),y列车))
其中打印:

cv scores:  [0.89523728 0.90348769 0.90412818 0.89991599]
cv scores mean:  0.900692282366262
test score on test:  0.8684604909814304
test score on train:  0.874880530883581
我预计测试输出上的
测试分数与交叉验证分数在同一范围内,我预计训练
输出上的
测试分数显示出严重的过度拟合,因此人为地比交叉验证分数的准确度高得多


那么为什么我总是认为这些分数比交叉验证分数差3-4%?这就是交叉验证的工作原理:

因此,基本上每次迭代,数据都以一种新的方式进行分割,并对其进行测试

我试图了解sklearn交叉验证和评分的工作原理,并观察到一些奇怪的行为

你的案件中有什么值得关注的?
len(X)
可能很重要。Imagen当您使用正常拟合方法时,在没有交叉验证的情况下,您将分裂为700个训练集和300个测试集。在cv=4的交叉验证中,这将是800个训练集和200个测试集。这可能会产生不同的结果


这对你的解释意味着什么?您的数据集对拆分行为非常敏感。也许收集更多的数据是个好主意,我强烈建议你在这方面使用交叉验证,否则你以后可能会有不好的预测结果,尽管你认为你有一个很好的预测方法。

你能通过链接提供对你的训练和测试数据的访问吗?我刚刚用iris数据集尝试了这个代码,并且
train\u test\u split ratio=0.3
得到了相反的结果。因此,一切都取决于您使用的数据集以及它是如何分割的。在您的案例中,
test
子集似乎包含了一些关于分组变量和特征空间之间关系的重要信息,这些信息在(X\u序列,y\u序列)子集中没有显示。仅在算法的一次运行中进行泛化可能是危险的。你最好运行你的简历,比如说,100次(每一次使用不同的训练分段),然后得到简历分数的平均值。然后,您应该用整个训练集(同样,每次都不同)拟合另外100个模型,并对相应测试集获得的分数求平均值。这些数字应该非常接近,第二个数字可能更高一些,因为训练集更大。