1. KFold

首先要搞清楚,KFold是用于生成交叉验证的数据集的,而StratifiedKFold则是在KFold的基础上,加入了分层抽样的思想,使得测试集和训练集有相同的数据分布,因此表现在算法上,StratifiedKFold需要同时输入数据和标签,便于统一训练集和测试集的分布

  • 概念
    • 将数据K等分,依次选择其中一份作为测试集,其余k-1份作为训练集
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) !注意这个地方

2. StratifiedKFold

基本代码和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))

3. generator

感谢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()

  • 优点

    • (1) 生成器可以避免不必要的计算,带来性能上的提升
    • (2) 而且会节约空间,可以实现无限循环(无穷大的)的数据结构。

4. 建模中的应用

生成交叉验证数据集,其中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]                                                                                           
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐