stacking是一种集成学习模型,主要利用分层模型搭建学习框架。
以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为特征加入训练集进行再训练,从而得到完整的stacking模型。
stacking 模型具体是怎么操作的呢?
我们从这里拿来了一张图并加上自己的理解来阐述stacking 的模型。
image.png
image.png
最后用一张图来总结上面的过程
微信图片_20200205202453.png
首先第一步是得到训练集与验证集(train_x,train_y,test_x,test_y),这里和普通的数据训练是一样的。
对训练集的操作如下:
1.使用 KFold
或者StratifiedKFold
来对训练集进行分割,将训练集的数据分割成n份。
值得注意的是StratifiedKFold 分层采样交叉切分,确保训练集,测试集中各类别样本的比例与原始数据集中相同,因此更加推荐使用StratifiedKFold
具体请参考KFold,StratifiedKFold k折交叉切分
2.随机选择其中的n-1份做为训练集中的训练集,剩下的1份作为训练集中的验证集,对训练集的训练集进行fit,对训练集的测试机进行predict 得到train_y_pred,同时对测试集pred,就得到test_y_pred,对得到的test_y_pred取平均值即输出为最后的test_y_pred_mean
循环训练,就得到了n个test_y_pred_mean,将这n个test_y_pred_mean拼接起来,我们就得到了n_train_y_pred
循环训练,就得到了n个test_y_pred,对这n个test_y_pred求平均值
这样第一步的融合训练就完成了
3.第二层模型,使用简单的模型,将第一层得到的结果进行训练
首先将得到的n_train_y_pred 与 train_y 进行训练
将得到的训练模型再对test_y_pred进行预测,就可以得到最终测试集的预测结果
更加细致一些的讲解可以参考:https://blog.csdn.net/wstcjf/article/details/77989963
我们来看看具体是如何实现的
stacking 实现
import numpy as np
from sklearn.model_selection import KFold
#选择from sklearn.model_selection import StratifiedKFold 也是可以的
def get_stacking(clf, x_train, y_train, x_test, n_folds=10):
#clf 训练的模型
#x_train 训练集x
#y_train 训练集y
#x_test 测试集x
#n_folds 训练集划分
train_num, test_num = x_train.shape[0], x_test.shape[0]
second_level_train_set = np.zeros((train_num,)) #120*1
second_level_test_set = np.zeros((test_num,)) #30*1
test_nfolds_sets = np.zeros((test_num, n_folds)) #30*10
kf = KFold(n_splits=n_folds)
for i,(train_index, test_index) in enumerate(kf.split(x_train)):
x_tra, y_tra = x_train[train_index], y_train[train_index]
x_tst, y_tst = x_train[test_index], y_train[test_index]
clf.fit(x_tra, y_tra)
second_level_train_set[test_index] = clf.predict(x_tst)
test_nfolds_sets[:,i] = clf.predict(x_test)
second_level_test_set[:] = test_nfolds_sets.mean(axis=1)
return second_level_train_set, second_level_test_set
第一层模型融合
这里随便选择5种模型
from sklearn.ensemble import (RandomForestClassifier, AdaBoostClassifier,
GradientBoostingClassifier, ExtraTreesClassifier)
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
#第一层的5个训练模型
model_1 = RandomForestClassifier()
model_2= AdaBoostClassifier()
model_3= GradientBoostingClassifier()
model_4= ExtraTreesClassifier()
model_5= SVC()
clfs=[model_1,model_2,model_3,model_4,model_5]
iris= load_iris() #导入鸢尾花数据集 150*4
train_x, test_x, train_y, test_y = train_test_split(iris.data, iris.target, test_size=0.3,random_state=2020)
#准备工作已经做好------->
#train_x 120*4
train_sets = []
test_sets = []
for clf in clfs:
train_set, test_set = get_stacking(clf, train_x, train_y, test_x)
train_sets.append(train_set)
test_sets.append(test_set)
meta_train = np.concatenate([result_set.reshape(-1,1) for result_set in train_sets], axis=1)
meta_test = np.concatenate([y_test_set.reshape(-1,1) for y_test_set in test_sets], axis=1)
第二层模型
#使用决策树作为我们的次级分类器
from sklearn.tree import DecisionTreeClassifier
dt_model = DecisionTreeClassifier()
dt_model.fit(meta_train, train_y)
df_predict = dt_model.predict(meta_test)
参考:
https://blog.csdn.net/wqh_jingsong/article/details/77896449
https://www.cnblogs.com/jiaxin359/p/8559029.html
https://zhuanlan.zhihu.com/p/26890738
https://www.kaggle.com/arthurtok/introduction-to-ensembling-stacking-in-python
https://zhuanlan.zhihu.com/p/25836678
网友评论