Stacking 模型融合讲解

stacking 模型融合

    Stacking是模型融合的一个重要的方法,几乎每个数据科学竞赛的前几名都会使用,接下来我主要是介绍stacking的原理。

相信大家看很多stacking的资料都会看到下面的这个图:



这个图很形象,他具体是这样做的,

首先我们将训练集使用kfold切分为k分,每一分包括一个验证集和测试集,每次取其中k-1分训练,另外的1分用来验证,stacking是这样做的,比如对于集成的第一个模型,clf1,我们使用kfold交叉验证,那么可以得到kclf1模型,模型的类型是一样的,但是模型里面学到的参数不一样,因为他们的训练集是不一样的,对与每一折的训练,我们还有一个验证集啊,那么我们用训练得到的模型在验证集合上做一次预测,你想,因为这个时候我们的验证集是不是只有1分,也就是只有train_set_number/k个样本(train_set_number表示训练样本的个数),但是这只是一折啊,我们还有k折,每一折我们都会在验证集上预测,所以最终对于clf1在验证集上得到是不是train_set_number个结果,不用担心是没有重复的,因为你是kflod

是不是每一折的验证集样本都不会相同,也就是没有哪个样本同时出现在两个验证集上,这样下来,我们就得到第一级的结果,也是train_set_number个结果。然后在每一折上,我们在测试集上做一次预测,那么kclf1模型预测k次得到了k个结果,也就是每一个样本预测结果有k个,我们就取一下平均,看到是取平均,这样取完平均以后每一个样本在clf1模型上就得到一个预测结果。这只是一个模型的过程,因为我们需要集成很多个模型,那么我重复n个模型,做法和上面是一样的,假设我们有n个模型,那么请问我们stacking第一层出来,在验证集上得到的结果特征是什么维度?应该就是训练样本的个数行(train_set_number),列数就是n吧,因为n个模型啊,这就是我们对第一层结果的一个特征堆叠方法,这样第一层出来的结果又可以作为特征训练第二层,第二层任然可以使用stacking多个模型,或者直接接一个模型用于训练,然后直接预测。那么同样,对于测试集第一层出来的维度是不是(test_set_number,n),也就是测试集样本的行数,这样是不是可以用第二层训练的模型在这个上面预测,得到我们最后的结果。这个就是stacking的整个过程。

然后我们看一段stacking的代码:


stack_model = [svm,lr,nn,xgb,lgb]  ## 这个地方我是简写,实际这样训练会报错,需要自己导库,定义分类器
## train_data 表示训练集,train_label 表示训练集的标签,test_data表示训练集
ntrain = train_data.shape[0]  ## 训练集样本数量
ntest = test_data.shape[0]   ## 测试集样本数量
train_stack = np.zeros(ntrain,n) ##  n表示n个模型
test_stack = np.zeros(ntest,n) ##

kf = kfold.split(train_data, train_label)

for i,model in enumerate(stack_model):
    for j, (train_fold, validate) in enumerate(kf):
                X_train, X_validate, label_train, label_validate = \
                    train_data[train_fold, :], train_data[validate, :], train_label[train_fold], train_label[validate]
                
                model.fit(X_train,label_train)
                train_stack[validate,i] = model.predict(X_validate)
                test_stack[:,i] = model.predict(test_data)
                
### 假设就只有两层,那么最后预测:

final_model  = xgb()  ## 假设第二层我们还是用xgb吧,这个地方也是简写,仅仅表示这个地方是xgb模型
final_model.fit(train_stack,train_label)

pre = final_model.predict(test_stack)  
这就是整个stacking的过程,自己写一个也不是很难,重点是理解,下一次我分享常用的stack的python库。
  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值