![v2-fb798b3be237a7c1e274641b96702567_1440w.jpg?source=172ae18b](http://img-03.proxy.5ce.com/view/image?&type=2&guid=26a89a08-4c2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-fb798b3be237a7c1e274641b96702567_1440w.jpg?source=172ae18b)
前两篇文章讲的是featureselection里面的两个类,今天开始讲model_selection里面的类。同样成该类的导入方式开始说起。
From model_selection import KFold
贴出官方文档里面的类的定义
![v2-682bf2e87b2f72df5c2802f1ded5dc5f_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=26a89a08-4c2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/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](http://img-01.proxy.5ce.com/view/image?&type=2&guid=26a89a08-4c2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-571ec6dfb4a189492a3a522ece292f94_b.jpg)
![v2-d2c723b1e1691c4cac083b336b2d354b_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=26a89a08-4c2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-d2c723b1e1691c4cac083b336b2d354b_b.jpg)
下面讲一下KFold的几个函数:
1。get_nsplits(),感觉这个函数的用处有点鸡肋,也有可能是目前我没有用到。该函数主要是得到K值,也就是n_splits的值。
![v2-e95c20746706b9177fb94ee0c378fb5f_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=26a89a08-4c2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-e95c20746706b9177fb94ee0c378fb5f_b.jpg)
2。split(),这是这个类最重要的函数,上面的代码也已经用到了这个函数,它是用于对X进行划分,返回的是他们的索引值。由于是将data set划分成两部分,所以返回的值有两个。一个是训练集,一个是验证集,所以该函数返回的是一个索引生成器。可以使用循环去遍历它。
![v2-f2fc85cd4a1b9293147ca1c0dfb05182_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=26a89a08-4c2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/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](http://img-02.proxy.5ce.com/view/image?&type=2&guid=26a89a08-4c2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-c30d66f655537c1a97754952285d874b_b.jpg)
执行代码是这样:
![v2-8b19755452997ab0355c68634b102b87_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=26a89a08-4c2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-8b19755452997ab0355c68634b102b87_b.jpg)
大家可以猜猜其结果是什么样的。
![v2-bbc6783e30fc079ec2c8e5c61195ab23_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=26a89a08-4c2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-bbc6783e30fc079ec2c8e5c61195ab23_b.jpg)
对于KFold不难理解,由于20条数据,要分为3份,所以是7+7+6的分法,可以看出其就是按找顺序一分,不管其他。
![v2-c5e54991286a58119fba17a241efa958_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=26a89a08-4c2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-c5e54991286a58119fba17a241efa958_b.jpg)
从上面可以看出,划分的结果满足:
1。不讲究均分,最后结果是8+6+6
2。不管是训练集还是验证集都满足于label(0)/label(1) = 1 : 1