stacking

blending集成方法

思路介绍

综合多个基础模型,提高最后预测(回归问题或分类问题)的正确率

算法流程

(1)将总的数据集被分成训练集和测试集,再将训练集拆分成训练集和验证集,所以数据总共分为三类,测试集,验证集,测试集,训练集是为了训练模型,验证集是为了调整模型(调参),测试集则是为了检验模型的正确率。
(2)使用训练集创建了K个模型,如SVM、random forests、XGBoost等,这个是第一层的模型。 训练好模型后将验证集输入模型进行预测,得到K组不同的输出,我们记作 𝐴1,…,𝐴𝐾 ,然后将测试集输入K个模型也得到K组输出,我们记作 𝐵1,…,𝐵𝐾 ,其中 𝐴𝑖 的样本数与验证集一致, 𝐵𝑖 的样本数与测试集一致。
(3)使用K组2400个样本的验证集结果 𝐴1,…,𝐴𝐾 作为第二层分类器的特征,验证集的2400个标签为因变量,训练第二层分类器.
(4)K组2000个样本的结果 𝐵1,…,𝐵𝐾 放入第二层分类器,得到2000个测试集的预测结果。

基础blending实例介绍

使用make_blobs生成数据集

data, target = make_blobs(n_samples=10000, centers=2, random_state=1, cluster_std=1.0 )

通过SVC,随机森林和k邻近算法将数据分类:

clfs = [SVC(probability = True),RandomForestClassifier(n_estimators=5, n_jobs=-1, criterion='gini'),KNeighborsClassifier()]
for i,clf in enumerate(clfs):
    clf.fit(X_train,y_train)
    val_feature = clf.predict_proba(X_val)[:, 1]
    test_feature = clf.predict_proba(X_test)[:,1]
    val_features[:,i] = val_feature
    test_features[:,i] = test_feature

之后将第一层的验证集的结果输入第二层训练第二层分类器

from sklearn.model_selection import cross_val_score
lr.fit(val_features,y_val)
cross_val_score(lr,test_features,y_test,cv=5)

stacking集成算法

思路介绍

综合多个基础模型,提高最后预测(回归问题或分类问题)的正确率

算法流程

stacking算法与blending算法思路类似,主要的差别在于数据的使用上。
1.首先将所有数据集生成测试集和训练集(假如训练集为10000,测试集为2500行),那么上层会进行5折交叉检验,使用训练集中的8000条作为训练集,剩余2000行作为验证集(橙色)。
2.每次验证相当于使用了蓝色的8000条数据训练出一个模型,使用模型对验证集进行验证得到2000条数据,并对测试集进行预测,得到2500条数据,这样经过5次交叉检验,可以得到中间的橙色的5* 2000条验证集的结果(相当于每条数据的预测结果),5* 2500条测试集的预测结果。
3.接下来会将验证集的5* 2000条预测结果拼接成10000行长的矩阵,标记为 𝐴1 ,而对于5* 2500行的测试集的预测结果进行加权平均,得到一个2500一列的矩阵,标记为 𝐵1 。
4.上面得到一个基模型在数据集上的预测结果 𝐴1 、 𝐵1 ,这样当我们对3个基模型进行集成的话,相于得到了 𝐴1 、 𝐴2 、 𝐴3 、 𝐵1 、 𝐵2 、 𝐵3 六个矩阵。
5.之后我们会将 𝐴1 、 𝐴2 、 𝐴3 并列在一起成10000行3列的矩阵作为training data, 𝐵1 、 𝐵2 、 𝐵3 合并在一起成2500行3列的矩阵作为testing data,让下层学习器基于这样的数据进行再训练。
再训练是基于每个基础模型的预测结果作为特征(三个特征),次学习器会学习训练如果往这样的基学习的预测结果上赋予权重w,来使得最后的预测最为准确。

对stacking模型的一些理解(有参考网上的一些解释)

stacking模型就是训练一个多层(一般是两层,本文中默认两层)的学习器结构,第一层(也叫学习层)用n个不同的分类器(或者参数不同的模型)将得到预测结果合并为新的特征集,并作为下一层分类器的输入。
Stacking的输出层为什么用逻辑回归:为了降低过拟合的问题,第二层分类器应该是较为简单的分类器,广义线性如逻辑回归是一个不错的选择。在特征提取的过程中,我们已经使用了复杂的非线性变换,因此在输出层不需要复杂的分类器。这一点可以对比神经网络的激活函数或者输出层,都是很简单的函数,一点原因就是不需要复杂函数并能控制复杂度。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值