查看原文
其他

集成学习介绍之三——Stacking算法

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王    歌 文字编辑:戴    雯 技术总编:张    邯



Python云端培训课程火热报名中!

     爬虫俱乐部将于2020年7月25日至28日线上举行Python编程技术训练营,本次培训采用理论与案例相结合的方式,帮助大家在掌握Python基本思想的基础上,学习科学计算技术与网络数据抓取技术,详情可点击《Python云端培训课程火热报名中!》,或点击文末阅读原文直接提交报名信息呦~


导读


       通过前面的介绍我们知道集成学习是将多个基学习器结合在一起形成一个泛化性能更强的学习器来进行预测的,其中的Bagging(《取长补短、互通有无 ——集成学习介绍之Bagging &随机森林》)和Boosting算法(《集成学习介绍之二——Boosting算法》)所选择的结合策略基本上是投票法、简单加和、简单平均、加权平均等方式。今天我们所介绍的Stacking算法则不同,它所使用的是“学习法”,下面我们具体来看看。

1算法原理

Stacking方法是一种分层模型集成框架。以两层为例,首先将数据集分成训练集和测试集,利用训练集训练得到多个初级学习器,然后用初级学习器对测试集进行预测,并将输出值作为下一阶段训练的输入值,最终的标签作为输出值,用于训练次级学习器(通常最后一级使用Logistic回归)。由于两次所使用的训练数据不同,因此可以在一定程度上防止过拟合。

由于要进行多次训练,因此这种方法要求训练数据很多,为了防止发生划分训练集和测试集后,测试集比例过小,生成的次级学习器泛化性能不强的问题,通常在Stacking算法中会使用我们上次讲到的交叉验证法或留一法来进行训练。

2算法实例

       通过上面的介绍,大家对Stacking算法的思想也有了一个简单的了解,下面我们来看看如何实现。首先说一下我们今天要使用的库是 mlxtend,在sklearn库中暂时还没有支持Stacking算法的类,所以在今天的例子中sklearn只能用来打辅助啦。mlxtend库是第三方库,可以通过 pip install mlxtend直接安装即可。mlxtend兼容sklearn,可以组合sklearn生成的模型生成新的模型。我们今天使用的数据集是sklearn中的鸢尾花数据。       在mlxtend库中,如果实现分类算法,我们可以使用 StackingClassifierStackingCVClassifier,如果实现回归算法可以使用 StackingRegressorStackingCVRegressor,分类算法使用的两个类均为不使用交叉验证Stacking算法,回归算法使用的两个类均为使用交叉验证Stacking算法,大家可以根据需要选择。这里我们使用 StackingCVClassifier,它主要有以下参数:(1) classifiers:选择基分类器,以列表的形式传入初级学习器使用的模型,每个基分类器的属性可以查看类属性 self._clfs_;(2) meta_classifier:确定目标分类器;(3) use_probas:默认为False,当设置为True时,目标分类器的输入就是前面分类输出的类别概率值;(4) average_probas:上一个参数当使用概率值输出的时候是否使用平均值,默认为False;(5) verbose:控制使用过程中的日志输出,当verbose为0时不输出,verbose取1时输出回归器的序号和名字,verbose取2时输出详细的参数信息,verbose大于2时自动将verbose设置为小于2的值,默认为0;(6) use_features_in_secondary:默认为False,当设置为True时,最终的目标分类器就由基分类器产生的数据和最初的数据集同时训练,若设置为False,最终的分类器只使用基分类器产生的数据训练;(7) cv:设定交叉验证折数。

这里我们使用的基分类器分别是SVM决策树GBDT,进行5折交叉验证,程序如下:

from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn import svmfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.ensemble import GradientBoostingClassifierfrom sklearn.linear_model import LogisticRegressionfrom mlxtend.classifier import StackingCVClassifierfrom sklearn.metrics import accuracy_scoreiris_sample = load_iris()x = iris_sample.datay = iris_sample.targetx_train, x_test, y_train, y_test = train_test_split( x, y, test_size=0.25, random_state=123)svclf = svm.SVC(kernel='rbf', decision_function_shape='ovr', random_state=123)treeclf = DecisionTreeClassifier()gbdtclf = GradientBoostingClassifier(learning_rate=0.7)lrclf = LogisticRegression()scclf = StackingCVClassifier( classifiers=[svclf, treeclf, gbdtclf], meta_classifier=lrclf, cv=5)scclf.fit(x_train, y_train)scclf_pre = scclf.predict(x_test)print('真实值:', y_test)print('预测值:', scclf_pre)print('准确度:', accuracy_score(scclf_pre, y_test))
       我们这里首先保留了25%的数据不参与训练,作为最后验证结果的数据集,并将初级学习器 svclftreeclfgbdtclf的参数设置为与前面的例子保持一致,最终得到的结果如下图:

在实际应用中,还可以通过调整初级学习器和次级学习器中参数的值来得到更好的效果。

Bagging、Boosting和Stacking都是目前集成学习中较为常用的算法,这三者各有所长,大家感兴趣的话可以进行更深入的研究。







对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
PyMuPDF提取文本信息

Mylabels命令介绍     

数据集的划分——交叉验证法

大数据视角下的大学录取分数排行
集成学习介绍之二——Boosting算法

PDF文本信息提取(二)

取长补短、互通有无 ——集成学习介绍之Bagging &随机森林
PDF表格信息提取
神经网络——brain
marktouse标记使用变量
换种视角看问题——支持向量机(SVM)
提取PDF文本信息:入门
毕业季|b站《入海》评论爬取
Stata云端课程来啦
利用广义线性模型实现的分类——Logistic回归
Requests get爬虫之设置headers
数据分析薪资待遇如何?——跟我来,带你看

关于我们



微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存