交叉验证cross validation

1.背景

  在使用训练集对参数进行训练的时候,经常会发现人们通常会将一整个训练集分为三个部分。一般分为:训练集(train_set),验证集(valid_set),测试集(test_set)这三个部分。这其实是为了保证训练效果而特意设置的。其中测试集很好理解,其实就是完全不参与训练的数据,仅仅用来观测测试效果的数据。

  在实际的训练中,训练的结果对于训练集的拟合程度通常还是挺好的(初始条件敏感),但是对于训练集之外的数据的拟合程度通常就不那么令人满意了。因此我们通常并不会把所有的数据集都拿来训练,而是分出一部分来(这一部分不参加训练)对训练集生成的参数进行测试,相对客观的判断这些参数对训练集之外的数据的符合程度。这种思想就称为交叉验证(Cross Validation)[5]。

2.目的

(1)从有限的学习数据中获取尽可能多的有效信息;
(2)交叉验证从多个方向开始学习样本的,可以有效地避免陷入局部最小值;
(3)交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上避免过拟合问题;[2]

3.方法

3.1 简单交叉验证(hold-out cross validation)

  简单交叉验证方法是:首先随机地将已给数据分为两部分,一部分作为训练集,另一部分作为测试集(例如,70%的数据为训练集,30%的数据为测试集);然后用训练集在各种条件下(例如,不同的参数个数)训练模型,从而得到不同的模型;在测试集上评价各个模型的测试误差,选出测试误差最小的模型。

  一般来说,简单交叉验证并非一种交叉验证,因为数据并没有交叉使用。随机从最初的样本中选出部分,形成交叉验证数据,而剩余的就当作训练数据。一般来说,少于原本样本三分之一的数据被选做验证数据。

优点:处理简单,只需随机把原始数据分为两组即可
缺点:a) 当训练数据本来就很少时,再分出测试集后,训练数据就太少了
  b) 验证集分类准确率的高低与原始数据的分组有很大的关系,得到的结果其实并不具有说服性

3.2 k折交叉验证(k-fold cross validation)

  为了方便调试超参数,从训练集中划分一部分作为验证集,但是由于划分出一个验证集调节的参数可能受到验证集数据影响有偏差不够准确,于是进行交叉,如图,其中fold1-fold5可以进行任意4个组合作为训练集,剩下一个作为验证集,这样得到不同的训练模型,然后对最终预测结果进行求平均。[1]

在这里插入图片描述

第一步,不重复抽样将原始数据随机分为 k 份。
第二步,每一次挑选其中 1 份作为验证集,剩余 k-1 份作为训练集用于模型训练。
第三步,重复第二步 k 次,这样每个子集都有一次机会作为验证集,其余作为训练集。在每个训练集上训练后得到一个模型,用这个模型在相应的验证集上测试,计算并保存模型的评估指标。
第四步,计算 k 组测试结果的平均值作为模型精度的估计,并作为当前 k 折交叉验证下模型的性能指标。

  K一般大于等于2,实际操作时一般从3开始取。一般讲k取值为10。这样数据稀疏时基本上也能进行。数据量小的时候,k可以设大一点,这样训练集占整体比例就比较大,不过同时训练的模型个数也增多。数据量大的时候,k可以设小一点。
在这里插入图片描述
在这里插入图片描述

优点:有效地避免过学习以及欠学习状态的发生,得到的结果比较具有说服性
缺点:训练和测试次数过多

3.3 留一交叉验证(leave one out cross validation)

  留一验证意指只使用原本样本中的一项来当作验证资料,而剩余的则留下来当作训练资料。这个步骤一直持续到每个样本都被当作一次验证资料。事实上,这等同于K-fold交叉验证是一样的,其中K为原本样本个数。

缺点:计算的开销很大

4.验证方法选择

  如果我们只是对数据做一个初步的模型建立,不是要做深入分析的话,简单交叉验证就可以,否则就用k折交叉验证,在样本量少的时候,使用留一交叉验证。

5. 注意事项

(1)训练集中样本数量要足够多,一般至少大于总样本数的50%。
(2)训练集和测试集必须从完整的数据集中均匀取样。均匀取样的目的是希望减少训练集、测试集与原数据集之间的偏差。当样本数量足够多时,通过随机取样,便可以实现均匀取样的效果。(随机取样,可重复性差)

6.函数[6]

sklearn.model_selection.KFold(n_splits=3, shuffle=False, random_state=None)

n_splits:表示划分几等份
shuffle:在每次划分时,是否进行洗牌
    若为Falses时,其效果等同于random_state等于整数,每次划分的结果相同
    若为True时,每次划分的结果都不一样,表示经过洗牌,随机取样的
random_state:随机种子数

sklearn.cross_validation.cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=1, verbose=0,fit_params=None,pre_dispatch=‘2*n_jobs’)
estimator:数据对象
X:数据
y:预测数据
soring:调用的方法
cv:交叉验证生成器或可迭代的次数
n_jobs:同时工作的cpu个数(-1代表全部)
verbose:详细程度
fit_params:传递给估计器的拟合方法的参数
pre_dispatch:控制并行执行期间调度的作业数量。减少这个数量对于避免在CPU发送更多作业时CPU内存消耗的扩大是有用的。

7.例子

在这里插入图片描述

ref

[1] CH1 统计学习方法概论|1.5.2交叉验证《统计学习方法》-学习笔记https://www.jianshu.com/p/5a5d158ebd01
[2] 机器学习干货|交叉验证(Cross Validation)详解
https://baijiahao.baidu.com/s?id=1643127951283009221&wfr=spider&for=pc
[3] 交叉验证(Cross Validation)与网格搜索(Grid Search)的原理及实证分析https://blog.csdn.net/wp_python/article/details/80255466
[4] https://www.zhihu.com/question/23561944
[5] https://baike.baidu.com/item/交叉验证/8543100?fr=aladdin
[6] https://blog.csdn.net/kancy110/article/details/74910185
[7] https://scikit-learn.org/stable/modules/cross_validation.html#cross-validation
[8] https://www.cnblogs.com/lzhc/p/9175707.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值