其他
集成学习介绍之三——Stacking算法
本文作者:王 歌 文字编辑:戴 雯 技术总编:张 邯
Python云端培训课程火热报名中!
爬虫俱乐部将于2020年7月25日至28日在线上举行Python编程技术训练营,本次培训采用理论与案例相结合的方式,帮助大家在掌握Python基本思想的基础上,学习科学计算技术与网络数据抓取技术,详情可点击《Python云端培训课程火热报名中!》,或点击文末阅读原文直接提交报名信息呦~
导读
1算法原理
Stacking方法是一种分层模型集成框架。以两层为例,首先将数据集分成训练集和测试集,利用训练集训练得到多个初级学习器,然后用初级学习器对测试集进行预测,并将输出值作为下一阶段训练的输入值,最终的标签作为输出值,用于训练次级学习器(通常最后一级使用Logistic回归)。由于两次所使用的训练数据不同,因此可以在一定程度上防止过拟合。
由于要进行多次训练,因此这种方法要求训练数据很多,为了防止发生划分训练集和测试集后,测试集比例过小,生成的次级学习器泛化性能不强的问题,通常在Stacking算法中会使用我们上次讲到的交叉验证法或留一法来进行训练。
2算法实例
通过上面的介绍,大家对Stacking算法的思想也有了一个简单的了解,下面我们来看看如何实现。首先说一下我们今天要使用的库是mlxtend
,在sklearn库中暂时还没有支持Stacking算法的类,所以在今天的例子中sklearn只能用来打辅助啦。mlxtend
库是第三方库,可以通过 pip install mlxtend
直接安装即可。mlxtend兼容sklearn,可以组合sklearn生成的模型生成新的模型。我们今天使用的数据集是sklearn中的鸢尾花数据。 在mlxtend库中,如果实现分类算法,我们可以使用 StackingClassifier
或 StackingCVClassifier
,如果实现回归算法可以使用 StackingRegressor
或 StackingCVRegressor
,分类算法使用的两个类均为不使用交叉验证的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_iris
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from mlxtend.classifier import StackingCVClassifier
from sklearn.metrics import accuracy_score
iris_sample = load_iris()
x = iris_sample.data
y = iris_sample.target
x_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))
svclf
、 treeclf
、 gbdtclf
的参数设置为与前面的例子保持一致,最终得到的结果如下图:在实际应用中,还可以通过调整初级学习器和次级学习器中参数的值来得到更好的效果。
Bagging、Boosting和Stacking都是目前集成学习中较为常用的算法,这三者各有所长,大家感兴趣的话可以进行更深入的研究。
PDF文本信息提取(二)
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。