[机器学习手机13]scikit-learn几种交叉验证方式

这次需要介绍的是scikit-learn库里面的几种常见的交叉验证方式: 1) LeavePOut, 2) LeaveOneOut, 3) KFold, 4) Stratified KFold
其实归并起来,主要是两种,KFold和LeavePOut


先讲KFold,

sklearn.cross_validation.KFold(n, n_folds=3, shuffle=False, random_state=None)

KFold的意思是,将数据随机切分成K份,其中留一份给验证集,剩下的K-1份给训练集。 每次切分都可以创建一个训练集,一个验证集。一共切分K次。

参数: n是总数据量,n_folds是切的分数。shuffle是指每次随机切的时候,数据本身是不是也要重排序以下(就像我随机抽扑克牌的时候,抽牌是随机的,但是在抽的时候还要不要进行洗牌这个操作),而random_state就是洗牌的随机方式的选择。

举个栗子

import sklearn.cross_validation as cross_valid
kf=cross_valid.KFold(6,3)     #数据量是6个,一共切3份。
for train_index, test_index in kf:
    print train_index,test_index

输出结果

[2 3 4 5] [0 1]
[0 1 4 5] [2 3]
[0 1 2 3] [4 5]    #可以看到KFold切分了三次,其实按照KFold随机切分的方法,他可以切出超出K种的数据集,但是KFold里面规定只切K次。


再讲LeavePOut的方式

sklearn.cross_validation.LeavePOut(n,p)

参数:n就是数据总量,p就是留出多少个数据做验证集。

举个栗子:

lpo=cross_valid.LeavePOut(6,2)   #6个数据集,随机抽2个数据做验证集,其他4个数据做训练集
for train_index, test_index in lpo:
    print train_index,test_index

结果:

[2 3 4 5] [0 1]
[1 3 4 5] [0 2]
[1 2 4 5] [0 3]
[1 2 3 5] [0 4]
[1 2 3 4] [0 5]
[0 3 4 5] [1 2]
[0 2 4 5] [1 3]
[0 2 3 5] [1 4]
[0 2 3 4] [1 5]
[0 1 4 5] [2 3]
[0 1 3 5] [2 4]
[0 1 3 4] [2 5]
[0 1 2 5] [3 4]
[0 1 2 4] [3 5]
[0 1 2 3] [4 5]

评价:

LeavePOut的意思就是规定验证集的size大小p,而KFold是规定切的分数K,理想情况下,总数据量/切的份数=验证集的size大小,也就是 n/K=p。 但是整除不出来的时候,两种就不完全一样了,比如KFold里面5份切2份,这种情况有时候就成下面这种情况了,有的时候验证集是2个数据,有的时候就成3个数据了。

[3 4] [0 1 2]
[0 1 2] [3 4]

而且,我们还可以看到,LeavPOut里面的抽验证数据其实是用的穷尽法,也就是从6个里面抽两个数据,我要把所有的可能有穷尽了,也就是组合里面的C 6 2=6*5/2=15种情况。 但是KFold对待这种情况,抽的次数就很少了,比如同样相仿的6个数据集里面切成3份,其中一份(包含2个数据)就是验证集,这个时候KFold只需要切分K次,也就是3次,而不是LeavePOut的15次了。所以对于数据集很大的情况,用KFold生成验证集的速度比LeavePOut更快


至于LeaveOneOut(n)   实质上就是LeavePOut(n,1) 的简化,简单说就是留一个数据作为验证集。这种适于数据量比较小的情况,比如三五个,七八个。而对于100个样本的数据集来说,留一个做验证,就没有什么意义了。

举例子:

loo=cross_valid.LeaveOneOut(6)
for train_index, test_index in loo:
    print train_index,test_index

结果

[1 2 3 4 5] [0]
[0 2 3 4 5] [1]
[0 1 3 4 5] [2]
[0 1 2 4 5] [3]
[0 1 2 3 5] [4]
[0 1 2 3 4] [5]



接下来谈,基于KFold基础上的Stratified KFold

先是Stratified KFold,这个其实考虑到的是各个类别的均衡性。 比如一个样本集97个是A类,3个是B类。那么我用KFold分三份的时候,其实在验证集里面B类的样本是非常少的。所以这个是就要考虑公正,而不是平等了。 我们要保证KFold之后,验证集里面既有A类的样本,又有B类的样本,而且验证集里面A和B的样本比例跟总体的AB样本比例是相仿的,这样验证才有意义。 

举个例子。

labels = [1, 1, 1, 1, 1, 1, 3, 3, 3]     #这个size为9的数据集里面Label是3的其实只有3个,他们对应的索引是6,7,8;而label为1的数据却有6个,他们对应的索引分别是0,1,2,3,4,5
skf=cross_valid.StratifiedKFold(labels,3)
for train_index, test_index in skf:
    print train_index,test_index
结果
    
[2 3 4 5 7 8] [0 1 6]
[0 1 4 5 6 8] [2 3 7]     #但是在分出来的数据集里面,我们能看到在三种切分后,几乎每一个都有一个3的样本在里面。
[0 1 2 3 6 7] [4 5 8]

   



参考资料

(sklearn KFold资料) http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.KFold.html

(sklearn cross validation user guide) http://scikit-learn.org/stable/modules/cross_validation.html#stratified-k-fold

(wiki pedia cross validation词条) https://en.wikipedia.org/wiki/Cross-validation_(statistics)#Common_types_of_cross-validation


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值