参考:StratifiedKFold 和 KFold 的比较
- 将全部训练集S分成k个不相交的子集,假设S中的训练样例个数为m,那么每一个自己有m/k个训练样例,相应的子集为{s1,s2,...,sk}
- 每次从分好的子集里面,拿出一个作为测试集,其他k-1个作为训练集
- 在k-1个训练集上训练出学习器模型,把这个模型放到测试集上,得到分类率的平均值,作为该模型或者假设函数的真实分类率
# coding:utf-8
import numpy as np
from sklearn.model_selection import KFold,StratifiedKFold
X=np.array([
['a', 2, 122.21, 4],
['b', 3, 132.12, 14],
['c', 31, 155.33, 24],
['d', 12, 143.93, 34],
['c', 32, 124.31, 44],
['a', 1, 151.11, 54],
['b', 11, 112.33, 64],
['b', 21, 137.82, 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_idx,val_idx in sfolder.split(X,y):
print('Train: %s | Val: %s' % (train_idx, val_idx))
print(" ")
#print("train_x: ",X[train_idx])
#print("train_y: ",y[train_idx])
#print("val_x:", X[test_idx])
#print("val_y:", y[test_idx])
#print("\n\n")
print("\n\n -------- \n\n")
for train_idx, val_idx in folder.split(X,y):
print('Train: %s | Val: %s' % (train_idx, test_idx))
print(" ")
输出的仅仅为索引,要是数据需要加上代码中的注释部分
可以看到上图中StratifiedKFold 分层采样交叉切分,确保训练集,测试集中各类别样本的比例与原始数据集中相同。比如原数据中,0,1两类比例是1:1,通过观察StratifiedKFold切分的每个测试集可以发现,0,1两类的占比也为1:1,这就是分层采样。确定了测试集后,测试集的补集就是训练集。
同时应注意到每个测试集均是互斥的。
- KFold不能整除时,每个互斥集的样本数会尽量相近。
比如67个样本的7折交叉验证,那么就会得到{9,9,9,10,10,10,10}的切分个数结果。