Cross-Validation概述

Cross Validation

概述

  在同一个数据集上对训练好的模型进行重复测试从方法上来说就是一种错误。这样生成的模型对它重复看到的样本标签有一个完美的预测分数,但是却不能预测到未知数据中任何有用的东西。这种情况就叫做过拟合(overfitting)。避免过拟合的方法一般是把训练数据集中的一部分数据分割出来作为测试集。通过这个测试集就可以知道模型的泛化能力以及是否过拟合。这就好比一个学生在做数学题,如果他只做了立体几何的题目,而且对于这个类型的题目反复训练,最终他解这个类型的题目肯定得心应手;但是如果你拿三角函数的题目给他做,那他肯定是不会的。立体几何题目就相当于训练集,而三角函数的题目相当于测试集。在scikit-learn中随机切分数据集成训练集和测试集的函数为sklearn.model_selection中的train_test_split函数。

  当我们在评估模型的不同参数时,比如SVM中的C值需要我们人工去设定。如果我们为了避免过拟合而利用上述所说的测试集进行测试然后来调整我们的参数,这样又会导致模型在测试集上过拟合,因为参数会不断调整直到模型的表现最佳。这种情况就是,关于测试集的信息已经“泄露”给了模型,从而使得评估度量方法不再能够反映模型的泛化能力了。这里的“泄露”指的是在现实世界中,测试集对于模型来说其实是未知的,就像预测一个当前广告的点击率一样,这个广告在未出现之前对于模型来说是未知的,而如果我们使用测试集进行参数的调整,那么也就相当于预见了未来,这是不科学的。

  为了解决上述测试集信息“泄露”的问题,我们可以在训练集中分出另外一部分数据出来,作为“验证集”。这样总共就有三个数据集,一个训练集,一个验证集,一个测试集。模型首先在训练集上进行训练,然后在验证集上进行评估调整参数。最后才是在测试集上得到最终的模型的评估。然而,新的问题又出现了,因为我们把数据集分割成了三个子数据集,用于模型学习的样本数会因此急剧减少,而且最终得到的模型结果也很大程度决定于你对(训练,验证)这两个数据集的选择。

  为了解决上述数据集分割导致的样本不足和模型结果的不确定性。交叉验证(cross-validation,CV)就派上用场了。 一轮交叉验证过程包括把样本集分割成互补的子集,在一个子集(训练集)上训练,然后在另外一个子集(验证集)上验证模型。而为了减少因为子集的不同划分而出现模型的变化,一般都会使用不同的子集划分对模型进行多轮的交叉验证,最后再对这多轮的验证结果进行平均。最典型的方法就是k折验证,下面将会讲到。

一般交叉验证的方法如下:

Leave-p-out cross-validataion(LpOCV)

  此方法把p个样本作为验证集,剩下的样本作为训练集。这种方法把原样本不断切成训练集和一个具有p个样本的验证集。假设原数据集有n个样本,模型训练和验证都需要进行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值