sklearn gridsearchcv_每天一点sklearn之KFold(9.8)

v2-fb798b3be237a7c1e274641b96702567_1440w.jpg?source=172ae18b

前两篇文章讲的是featureselection里面的两个类,今天开始讲model_selection里面的类。同样成该类的导入方式开始说起。

From model_selection import KFold

贴出官方文档里面的类的定义

v2-682bf2e87b2f72df5c2802f1ded5dc5f_b.png

首先我们需要明确的是,这个函数是用来干嘛的,不然就会对参数的意义存在不能理解的地方。该类是用来划分数据集的,KFold和K-折验证是一样的。也就是将一份数据集划分成为K份,拿其中的一份用作验证,剩下的k-1份数据用作训练。因此,该KFold这个类也不难理解,也是起数据划分之用。

下面讲一讲三个参数的意义:

1.n_splits,default=2,这个参数是就是K,其值等于几就是将数据集划分成多少份。

2。shuffle,这其实在python里面也是一个函数,就是打乱顺序的意思。那么它的作用是什么呢?比如说我们现在是将索引从0-19的20个索引利用K折验证方法,也就是说要将数据分成两块。如果按照default shuffle = False,那么分法就是按照顺序分,也就是第一个的验证集是0-9,第二个是10-19。如果shuffle = True,那么则表示将打乱顺序后再进行分配。比如我对n_splits = 2 时候根据shuffle 的boolean值不同进行了测试

我们可以从图中看出两者的validation的index的不同之处。

3。randomstate,很多函数里面都有这一个param,相当于随机数的seed.是为了可重现,一般都要和shuffle搭配使用,只有当shuffle=True的时候,才有意义。因为只有随机起来,每次结果不一样,为了重现,才利用seed.如果shuffle=False,每次split都是按照顺序来划分,想要重现无非就是重新运行一下罢了。但是shuffle,每次的运行结果都不一样,所以才需要random_state.

v2-571ec6dfb4a189492a3a522ece292f94_b.jpg
两次shuffle之后结果不一样

v2-d2c723b1e1691c4cac083b336b2d354b_b.jpg
使用相同的random_state之后,得到的结果一样

下面讲一下KFold的几个函数:

1。get_nsplits(),感觉这个函数的用处有点鸡肋,也有可能是目前我没有用到。该函数主要是得到K值,也就是n_splits的值。

v2-e95c20746706b9177fb94ee0c378fb5f_b.jpg

2。split(),这是这个类最重要的函数,上面的代码也已经用到了这个函数,它是用于对X进行划分,返回的是他们的索引值。由于是将data set划分成两部分,所以返回的值有两个。一个是训练集,一个是验证集,所以该函数返回的是一个索引生成器。可以使用循环去遍历它。

v2-f2fc85cd4a1b9293147ca1c0dfb05182_b.jpg

写到这就不得不写一个和它非常相似的类,它就是StratifiedKFold,这个函数的作用是分层抽样,KFold是不管你三七二十一就是一抽。对于分类问题来说,data set中可能蕴含着label的一些分布,比如说100个samples,里面有90个A类,10个B类,假设使用KFold这个莽类,n_splits=10,由于KFold太莽,我分成10段,可能前9段就都是同一个类,这样扔进去model里面训练的时候,鸡毛都没有学习到。所以sklearn中才多加入了一个“理智哥”StratifiiedKFold。所以这个老哥其他的东西都和KFold的一样,但是在split这个函数中两者存在差别。

1.KFold.split(x),只需要一个x就可以了,而StratifiedKFold中需要Y,StratifiedKFold(x,y)。其实这个也很好理解,因为是分层抽样,所以他只有通过结果才能知道label的分布,才能根据其分布去采样,所以必须存在label,故它必须要有两个参数。

2.需要注意的是KFold中K折,每一个K里面的length是一样的,但是由于StratifiedKFold抽样 的时候需要满足label的分布规律,所以K折的大小是不一样的,比如说,length=20,K=2时候,KFold肯定是每段都是10;但在StratifiedKFold中,可能一段是14,另外一段是6.

下面仍然用数据检验一下:

我们取总数据集里面的前20条数据,首先看一下其label分布:

v2-c30d66f655537c1a97754952285d874b_b.jpg
在前20条数据中,label(0):label(1) = 1:1

执行代码是这样:

v2-8b19755452997ab0355c68634b102b87_b.jpg

大家可以猜猜其结果是什么样的。

v2-bbc6783e30fc079ec2c8e5c61195ab23_b.jpg
KFold的结果

对于KFold不难理解,由于20条数据,要分为3份,所以是7+7+6的分法,可以看出其就是按找顺序一分,不管其他。

v2-c5e54991286a58119fba17a241efa958_b.jpg
StatifiedKFold的结果

从上面可以看出,划分的结果满足:

1。不讲究均分,最后结果是8+6+6

2。不管是训练集还是验证集都满足于label(0)/label(1) = 1 : 1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值