首先要搞清楚,KFold是用于生成交叉验证
的数据集的,而StratifiedKFold则是在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])
from sklearn.model_selection import StratifiedKFold,KFold
kf=Kfold(n_splits=4)
kf.split(X) !注意这个地方
基本代码和KFold相似。
(1) 首先创建一个对象
(2) 然后带入数据进行数据分割
(3) 读取分割后的数据,读取后每个变量形式表现为数组
,整个分隔的函数.split得出的则是一个生成器
我主要卡在了不清楚
(1) 分隔时skf.split(X,y)的输出到底是个什么东西,
(2) 为什么可以用for循环去读取。
于是查了些资料发现是自己对生成器的了解不够
sfolder = StratifiedKFold(n_splits=4,random_state=0)
for train, test in sfolder.split(X,y):
print('Train: %s | test: %s' % (train, test))
感谢python中的生成器(generator)总结
首要印象
python中的generator保存的是算法
,不会输出结果,是一种惰性计算
,即只有真正需要计算出值的时候才会往下计算
生成generator
(1) 将生成列表的[]改成()
(2) 在函数中使用yield
关键字。
函数里有了yield之后,每次执行到yield就会停止
,下一次直接从停止的地方继续计算。因此即使生成器是无限循环也没有关系,因为生成器本身并不计算结果,只是保存算法。
#(1)将生成列表的[]改成()
t=(x for x in range(10))
t
输出:<generator object <genexpr> at 0x000001D6C12602E0>
#(2) 在函数中使用yield关键字
def fib():
a=[1,2]
b=[3,4]
while a[1]<100:
yield a,b
a=[i+7 for i in a]
b=[i+1 for i in b]
f = fib()
for i,j in f:
print(i,j)
generator中的for循环
对于generator可以采用next()方法
进行逐条读取,但一般for循环更为常见
通常采用for循环遍历一个generator
,其实for循环的内部实现就是不停调用next()
。
优点
避免不必要的计算
,带来性能上的提升节约空间
,可以实现无限循环(无穷大的)的数据结构。生成交叉验证数据集,其中skf.split(X,y)返回的是训练集和测试集的索引值
skf=StratifiedKFold(n_splits=3,random_state=1)
for train_index,test_index in skf.split(X,y):
X_train,X_test=X[train_index],X[test_index]
y_train,y_test=y[train_index],y[test_index]