前言
- 将全部训练集S分成k个不相交的子集,假设S中的训练样例个数为m,那么每一个自己有m/k个训练样例,相应的子集为{s1,s2,...,sk}
- 每次从分好的子集里面,拿出一个作为测试集,其他k-1个作为训练集
- 在k-1个训练集上训练出学习器模型,把这个模型放到测试集上,得到分类率的平均值,作为该模型或者假设函数的真实分类率
Code
# coding:utf-8
import numpy as np
from sklearn.model_selection import KFold,StratifiedKFold
X=np.array([
    [1,2,3,4],
    [11,12,13,14],
    [21,22,23,24],
    [31,32,33,34],
    [41,42,43,44],
    [51,52,53,54],
    [61,62,63,64],
    [71,72,73,74]
])
y=np.array([1,1,0,0,1,1,0,0])
sfolder = StratifiedKFold(n_splits=3,random_state=0,shuffle=False)
floder = KFold(n_splits=3,random_state=0,shuffle=False)
for train, test in sfolder.split(X,y):
    print('Train: %s | test: %s' % (train, test))
    print(" ")
    #print("train: ",X[train])
    #print("test:", X[test])
    #print("\n\n")
print("\n\n  --------  \n\n")
for train, test in floder.split(X,y):
    print('Train: %s | test: %s' % (train, test))
    print(" ")            
注意:
- 1,输出的仅仅为索引,要是数据需要加上代码中的注释部分
- 2,考虑不能整除的情况,KFold不能整除的情况,可参考
- StratifiedKFold不能整除的情况和KFold不能整除的情况不同,查阅资料没找到合理解释...
- 多次变换三个参数,仔细体会...
结论
- 可以看到StratifiedKFold 分层采样交叉切分,确保训练集,测试集中各类别样本的比例与原始数据集中相同。
参考