模型融合Stacking

模型融合

要想使得使得机器学习模型进一步提升,必须使用到模型融合的技巧,常用的模型融合方法有Stacking与Blending。Stacking实际上就是把Blending组合起来,Blending只有一层,而Stacking有多层,它把各个基学习器的预测结果作为下一层新的训练集,来学习一个新的学习器。通过元分类器或元回归聚合多个分类或回归模型。基础层次模型(level model)基于完整的训练集进行训练,然后第二层次模型基于基础层次模型的输出进行训练。
关于Stacking原理可以参考Stacking详解

代码

将XGB,LGB以及随机森林作为基础模型,线性回归或Lasso作为第二层次模型。

### 第一层模型
base_models = [xgb.XGBRegressor(),lgb.LGBMRegressor(),RandomForestRegressor()]

# 设置训练数据
row_train = len(labeled) #数据量(长度)
col_train = len(base_models) #所用模型数量
stacking_train_dataset1 = np.zeros(shape = (row_train, col_train))
stacking_train_dataset = pd.DataFrame(data= stacking_train_dataset1)

# 设置测试数据
row_test = len(test_label)
col_test = len(base_models)
stacking_test_dataset1 = np.zeros(shape = (row_test, col_test))
stacking_test_dataset = pd.DataFrame(data = stacking_test_dataset1)

#k折训练
sk=StratifiedKFold(n_splits=3,shuffle=True,random_state=3)
for i,base in enumerate(base_models):
    counter = randint(0, 3)
    inner_counter = 0
    for trainix, testix in sk.split(X,Y):
        if inner_counter == counter:
            x_train = X.iloc[trainix]
            y_train = Y.iloc[trainix] 
            model = base
            print('training : %s'%(type(model)))
            model.fit(x_train, y_train)
	   	    stacking_train_dataset[i] = model.predict(X)
            stacking_test_dataset[i] = model.predict(test_label)
        inner_counter += 1

上面实现了基础模型的训练,并且获得新的训练集给第二层次模型训练。

#选择lasso作为第二层次模型
ensemble_model =Lasso()

#训练
stacking_train_dataset['Ensemble'] = ensemble_model.fit(stacking_train_dataset, Y).predict(stacking_train_dataset)

#预测
pred = ensemble_model.predict(stacking_test_dataset)

总结

Stacking集成模型后,模型的性能有了提升,但是Stacking基础层的模型性能一定要强(类似简单的线性回归模型,效果就差强人意),第二层则可以选择一些简单的模型。当然由于它的基础模型复杂度过高,也容易造成过拟合。

参考

Stacking基本思想及代码实现

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值