机器学习算法调参神器之2:交叉验证

在上个帖子中,我们介绍了机器学习算法调参神器之1:学习曲线,并用学习曲线对KNN算法的K值选择进行了调优,发现效果不错。然而,确定了k值 之后,我们又发现一件事:每次重新处理整个数据集之后,学习曲线都在变化,不仅每次选择的最优K值不同,而且模型的运行效果也不尽相同,这是为什么呢?
实际上,这是由于「训练集」和「测试集」的划分不同造成的。模型每次都使用不同的训练集进行训练,不同的测试集进行测试,自然也就会有不同的模型结果。在业务当中,我们的训练数据往往是已有的历史数据,但我们的测试数据却是新进入系统的一系列还没有标签的未知数据。我们的确追求模型的效果,但我们追求的是模型在未知数据集上的效果,在陌生数据集上表现优秀的能力被称为泛化能力,即我们追求的是模型的泛化能力。
我们认为,如果模型在一套训练集和数据集上表现优秀,那说明不了问题,只有在众多不同的训练集和测试集上都表现优秀,模型才是一个稳定的模型,模型才具有真正意义上的泛化能力。为此,机器学习领域有着发挥神作用的技能:「交叉验证」,来帮助我们认识模型。

泛化能力(generalization ability)

数据样本集在进行算法学习之前, 通常会被分成训练集(training set)和测试集(testing set),其中训练集用于模型的学习或训练,而后测试集通常用于评估训练好的模型对于数据的预测性能评估。

训练误差(training error)

代表模型在训练集上的错分样本比率。
训练误差的大小,用来判断给定问题是不是一个容易学习的的问题。

测试误差(empirical error)

是模型在测试集上的错分样本比率。
测试误差反映了模型对未知数据的预测能力,测试误差小的学习方法具有很好的预测能力。
如果得到的训练集和测试集的数据没有交集,通常将此预测能力称为泛化能力(generalization ability)。

K折交叉验证

最常用的交叉验证是k折交叉验证。我们知道训练集和测试集的划分会干扰模型的结果,因此用交叉验证n次的结果求出的均值,是对模型效果的一个更好的度量。
K折交叉验证

绘制带交叉验证的学习曲线

对于带交叉验证的学习曲线,我们需要观察的就不仅仅是最高的准确率了,而是准确率高,方差还相对较小的点,这样的点的泛化能力才是最强的。在交叉验证+学习曲线的作用下,我们选出的超参数能够保证更好的泛化能力。

是否需要验证集?

最标准,最严谨的交叉验证应该有三组数据:训练集、验证集和测试集。当我们获取一组数据后,先将数据集分成整体的训练集和测试集,然后我们把训练集放入交叉验证中,从训练集中分割更小的训练集(k-1份)和验证集(1份),此时我们返回的交叉验证结果其实是验证集上的结果。我们使用验证集寻找最佳参数,确认一个我们认为泛化能力最佳的模型,然后我们将这个模型使用在测试集上,观察模型的表现。
通常来说,我们认为经过验证集找出最终参数后的模型的泛化能力是增强了的,因此模型在未知数据(测试集)上的效果会更好,但尴尬的是,模型经过交叉验证在验证集上的调参之后,在测试集上的结果没有变好的情况时有发生。原因其实是:我们自己分的训练集和测试集,会影响模型的效果;同时,交叉验证后的模型的泛化能力增强了,表示它在未知数据集上方差更小,平均水平更高,但却无法保证它在现在分出来的测试集上预测能力最强。如此说来,是否有测试集的存在,其实意义不大了。
如果我们相信交叉验证的调整结果是增强了模型的泛化能力的,那即便测试集上的测试结果并没有变好(甚至变坏了),我们也认为模型是成功的。如果我们不相信交叉验证的调整结果能够增强模型的泛化能力,而一定要依赖测试集来进行判断,我们完全没有进行交叉验证的必要,直接用测试集上的结果来跑学习曲线就好了。所以,究竟是否需要验证集,其实是存在争议的,在严谨的情况下,大家还是使用有验证集的方式。

交叉验证的方法不止一种

交叉验证的方法不止“k折” 一种,分割训练集和测试集的方法也不止一种,分门别类的交叉验证占据了sklearn中非常长的一章:
https://scikit-learn.org/stable/modules/cross_validation.html。
所有的交叉验证都是在分割训练集和测试集,只不过侧重的方向不同,像“k 折"就是按顺序取训练集和测试集,ShuffleSplit就侧重于让测试集分布在数据的全方位之内,StratifiedKFold则是认为训练数据和测试数据必须在每个标签分类中占有相同的比例。各类交叉验证的原理繁琐,大家在机器学习道路上一定会逐

  • 2
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值