3.0 任务说明
用你目前评分最高的模型作为基准模型,和其他模型进行stacking融合,得到最终模型及评分果。
3.1 stacking模型融合
Stacking(有时候也称之为stacked generalization)是指训练一个模型用于组合(combine)其他各个模型。即首先我们先训练多个不同的模型,然后再以之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。如果可以选用任意一个组合算法,那么理论上,Stacking可以表示上面提到的各种Ensemble方法。然而,实际中,我们通常使用单层logistic回归作为组合模型。
对于stacking的过程这篇文章我认为讲得比较清楚:
https://blog.csdn.net/qq_32742009/article/details/81366768
我这里再简要说明一下。首先说明一下,stacking可以看成两层结构,第一层结构的输出作为第二层的输入。
我们第一层以svm,lightgbm,xgboost为例,第二层以LR为例作一个讲解,假设训练集有15000个数据,测试集3000个数据,步骤如下:
(1)用svm作五折交叉训练,训练五次,每次将训练集划分为5份,其中一份作为验证集。
(2)每一次将验证集的预测值竖着组合在一起,5次的预测值分别为a1,a2,a3,a4,a5,假设a的大小都是3000*1,将这5个a值再竖着拼在一起,组成A1,A1的大小为15000*1。A1为上图中最后一个橙块。此时A1各个特征对应的标签设为Label_new。
(3)将每一次验证集得到的结果对Test Data作测试,假设每一次测试后产生2000*1的数据,那么五次验证后产生,5个2000*1的数据b1,b2,b3,b4,b5。b1,b2,b3,b4,b5各个位置相加后取平均值得到1个2000*1的数据B1。这个B1为上图中倒数第二个绿块。
(3)同理,将gbm和xgb五折交叉训练后的预测值竖着组成在一起,分别组成A2,A3。将他们对Test Data作预测,得到B2,B3。
(4)将A1,A2,A3横着合并得到一个15000行3列的矩阵A,将B1,B2,B3横着合并得到一个2000行3列的矩阵B。
(5)矩阵A即为新的训练集的特征,矩阵B即为新的测试集的特征。让下一层的模型,基于他们进一步训练。矩阵A的标签是上面步骤2个Label_new,矩阵B的标签即为原来测试集的标签。
我自己写的函数如下:
def Stacking(model,num_folds,x_train,y_train,x_test,y_test): #输入的模型集合里最后一个模型用作stacking里第二层模型
y_train=np.array(y_train)
x_train_folds = []
y_train_folds = []
x_train_folds=np.array_split(x_train,num_folds)
y_train_folds=np.array_split(y_train,num_folds)
y_pred_A=[]
y_pred_testseting_A=[]
label_1=[]
model_len=len(model)
for i in range (0,model_len-1):
y_pred_A.append([])
y_pred_testseting_A.append([])
for i in range (num_folds): #五折交叉验证
x_train_now=np.zeros((1,x_train.shape[1]))
y_train_now=np.array([[0]])
for k in range (5): #这里的循环是为了将验证集组合在一块儿
if(k!=i):
x_train_now=np.vstack((x_train_now,x_train_folds[k]))