服务好的网站设计重庆网站设计
参考:DataWhale教程链接
集成学习(上)所有Task:
(一)集成学习上——机器学习三大任务
(二)集成学习上——回归模型
(三)集成学习上——偏差与方差
(四)集成学习上——回归模型评估与超参数调优
(五)集成学习上——分类模型
(六)集成学习上——分类模型评估与超参数调优
(七)集成学习中——投票法
(八)集成学习中——bagging
(九)集成学习中——Boosting简介&AdaBoost
(十)集成学习中——GBDT
(十一)集成学习中——XgBoost、LightGBM
(十二)集成学习(下)——Blending
(十三)集成学习(下)——Stacking
(十四)集成学习(下)——幸福感预测
(十五)集成学习(下)——蒸汽量预测
Stacking集成学习算法
Stacking是一种比赛中常用的trick,严格它来说并不是一种算法,而是精美而又复杂的,对模型集成的一种策略。Stacking集成算法可以理解为一个两层的集成,第一层含有多个基础分类器,把输出的预测结果作为第二层的输入特征, 第二层的分类器通常是逻辑回归。
Blending存在的问题:Blending在第二层集成的时候中只会用了验证集的数据产生的特征,对数据的使用浪费比较大。
Stacking:采用交叉验证的思路,产生多组验证集,且可以充分利用训练集。
Blending与Stacking对比:
集成方法 | Blending | Stacking |
---|---|---|
集成的特征 | 一次划分,特征简单,数据少 | cv交叉验证,特征略复杂,数据多 |
泛化能力 | 可能会过拟合 | 健壮性好 |
看一下Stacking是如何集成算法的:(参考案例:https://www.cnblogs.com/Christina-Notebook/p/10063146.html)
由于sklearn并没有直接对Stacking的方法,因此我们需要下载mlxtend工具包(pip install mlxtend)
# 1. 简单堆叠3折CV分类
from sklearn import datasetsiris = datasets.load_iris()
X, y = iris.data[:, 1:3], iris.target
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import StackingCVClassifierRANDOM_SEED = 42clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = RandomForestClassifier(random_state=RANDOM_SEED)
clf3 = GaussianNB()
lr = LogisticRegression()# Starting from v0.16.0, StackingCVRegressor supports
# `random_state` to get deterministic result.
sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3], # 第一层分类器meta_classifier=lr, # 第二层分类器random_state=RANDOM_SEED)print('3-fold cross validation:\n')for clf, label in zip([clf1, clf2, clf3, sclf], ['KNN', 'Random Forest', 'Naive Bayes','StackingClassifier']):scores = cross_val_score(clf, X, y, cv=3, scoring='accuracy')print("Accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label))
3-fold cross validation:Accuracy: 0.91 (+/- 0.01) [KNN]
Accuracy: 0.95 (+/- 0.01) [Random Forest]
Accuracy: 0.91 (+/- 0.02) [Naive Bayes]
Accuracy: 0.93 (+/- 0.02) [StackingClassifier]
# 我们画出决策边界
from mlxtend.plotting import plot_decision_regions
import matplotlib.gridspec as gridspec
import itertoolsgs = gridspec.GridSpec(2, 2)
fig = plt.figure(figsize=(10,8))
for clf, lab, grd in zip([clf1, clf2, clf3, sclf], ['KNN', 'Random Forest',