目录
Stacking,这个集成方法在比赛中被称为“懒人”算法,因为它不需要花费过多时间的调参就可以得到一个效果不错的算法
。 stacking严格来说并不是一种算法,而是精美而又复杂的,对模型集成的一种策略。Stacking集成算法可以理解为一个两层的集成,第一层含有多个基础分类器,把预测的结果(元特征)提供给第二层, 而第二层的分类器通常是逻辑回归,他把一层分类器的结果当做特征做拟合输出预测结果。
1. Blending
Blending是Stacking的简化版,其思想可以理解为上课开小差被老师提问不知道答案,周围同学告诉了你答案,你便将他们的答案综合下告诉了老师。
Blending的工作过程如下:
- (1) 将数据划分为训练集和测试集(test_set),其中训练集需要再次划分为训练集(train_set)和验证集(val_set);
- (2) 创建第一层的多个模型,这些模型可以是同质的也可以是异质的;
- (3) 使用train_set训练步骤2中的多个模型,然后用训练好的模型预测val_set和test_set得到val_predict, test_predict1;
- (4) 创建第二层的模型,使用val_predict作为训练集训练第二层的模型;
- (5) 使用第二层训练好的模型对第二层测试集test_predict1进行预测,该结果为整个测试集的结果。
(图片来源:https://blog.csdn.net/sinat_35821976/article/details/83622594)
下面来梳理下这个过程
假设现在我们已经有了数据集
- (1)将数据集划分为训练集和测试集,如80%训练集和20%测试集,然后在这80%的训练集中再拆分训练集70%和验证集30%,因此拆分后的数据集由三部分组成
- 训练集80%* 70%,用来训练模型
- 验证集80%* 30% ,用来调整模型(调参)
- 验证集20%,用来检验模型的优度
- 在(2)-(3)步中,我们使用训练集创建了K个模型,如SVM、random forests、XGBoost等,这个是第一层的模型。 训练好模型后将验证集输入模型进行预测,得到K组不同的输出,我们记作 A 1 , . . . , A K A_1,...,A_K A1,...,AK,然后将测试集输入K个模型也得到K组输出,我们记作 B 1 , . . . , B K B_1,...,B_K B1,...,BK,其中 A i A_i Ai的样本数与验证集一致, B i B_i Bi的样本数与测试集一致。
- 如果总的样本数有10000个样本,那么使用5600个样本训练了K个模型,输入验证集2400个样本得到K组2400个样本的结果 A 1 , . . . , A K A_1,...,A_K A1,...,AK,输入测试集2000个得到K组2000个样本的结果 B 1 , . . . , B K B_1,...,B_K B1,...,BK 。
- (4)步中,使用K组2400个样本的验证集结果 A 1 , . . . , A K A_1,...,A_K A1,...,AK作为第二层分类器的特征,验证集的2400个标签为因变量,训练第二层分类器,得到2400个样本的输出。
- 在(5)步中,将输入测试集2000个得到K组2000个样本的结果 B 1 , . . . , B K B_1,...,B_K B1,...,BK放入第二层分类器,得到2000个测试集的预测结果。
Blending优点 : 实现简单粗暴,没有太多的理论的分析
Blending缺点:只使用了一部分数据集作为留出集进行验证,也就是只能用上数据中的一部分,实际上这对数据来说是很奢侈浪费的。
代码实现
#加载相关工具包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')
%matplotlib inline
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
#创建数据
from sklearn import datasets
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
data,target=make_blobs(n_samples=1000,centers=2,random_state=1