模型融合
要想使得使得机器学习模型进一步提升,必须使用到模型融合的技巧,常用的模型融合方法有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基础层的模型性能一定要强(类似简单的线性回归模型,效果就差强人意),第二层则可以选择一些简单的模型。当然由于它的基础模型复杂度过高,也容易造成过拟合。