集成学习(ensemble learning)(三)
集成学习系列第三篇(Boosting相关方法),传送前两篇:
- 集成学习(ensemble learning)(一)
- 集成学习(ensemble learning)(二)
文章目录
- 一、Boosting
- 二、Adaboost原理
- 1、基本思路
- (1)Adaboost分类
- (2)Adaboost回归
- 2、AdaBoost分类问题的损失函数优化
- 3、AdaBoost二元分类问题算法流程
- 4、Adaboost回归问题的算法流程
- 5、Adaboost算法的正则化
- 三、Adaboost实现
- 1、Adaboost类库简介
- 2、AdaBoost框架参数
- 3、弱分类器参数
- 4、实战
一、Boosting
Boosting算法中,个体学习器之间存在强依赖关系。在boosting系列算法中, 典型的算法有 Adaboost、GBDT。
工作机制如下:
- 先从初始训练集中学习一个基学习器;
- 根据弱学习器的学习错误率对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续收到更多关注;
- 基于调整权重后的训练样本分布来训练下一个弱学习器;
- 如此反复,直到弱学习器数目达到 T,最终将这 T 个弱学习器进行加权结合。
关键问题:
- 如何计算学习误差率e?
- 如何得到弱学习器权重系数α?
- 如何更新样本权重D?
- 使用何种结合策略?
二、Adaboost原理
核心思想:针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。
其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。
优点
- Adaboost作为分类器时,分类精度很高
- 在Adaboost的框架下,可以使用各种回归分类模型来构建弱学习器,非常灵活。
- 作为简单的二元分类器时,构造简单,结果可理解。
- 不容易发生过拟合
缺点
- 对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性。
1、基本思路
假设我们的训练集样本是
T={(x1,y1),(x2,y2),...(xm,ym)}T=\{(x_1,y_1),(x_2,y_2),...(x_m,y_m)\}T={(x1,y1),(x2,y2),...(xm,ym)}
训练集的在第 kkk 个弱学习器的输出权重为
D(k)=(wk1,wk2,...,wkm);wk1=1m;i=1,2,...,mD(k)=(w_{k1},w_{k2},...,w_{km});\ \ w_{k1}=\frac{1}{m};\ \ i=1,2,...,mD(k)=(wk1,wk2,...,wkm); wk1=m1; i=1,2,...,m
(1)Adaboost分类
分类问题的误差率
由于多元分类是二元分类的推广,这里假设我们是二元分类问题,输出为{−1,1}\{-1,1\}{−1,1},则第 kkk 个弱分类器 Gk(x)G_k(x)Gk(x) 在训练集上的加权误差率为
ek=P(Gk(xi)≠yi)=∑i=1mwkiI(Gk(xi)≠yi)e_k=P(G_k(x_i)\neq y_i)=\sum_{i=1}^{m}w_{ki}I(G_k(x_i)\neq y_i)ek=P(Gk(xi)̸=yi)=i=1∑mwkiI(Gk(xi)̸=yi)
弱学习器权重系数
对于二元分类问题,第 kkk 个弱分类器 Gk(x)G_k(x)Gk(x) 的权重系数为
αk=12log1−ekek\alpha_k=\frac{1}{2}\log\frac{1-e_k}{e_k}αk=21logek1−ek
==》如果分类误差率 eke_kek 越大,则对应的弱分类器权重系数 αk\alpha_kαk 越小。也就是说,误差率小的弱分类器权重系数越大。
==》公式的由来在损失函数优化时介绍。
更新样本权重D
假设第 kkk 个弱分类器的样本集权重系数为 D(k)=(wk1,wk2,...,wkm)D(k)=(w_{k1},w_{k2},...,w_{km})D(k)=(wk1,wk2,...,wkm),则对应的第 k+1k+1k+1个弱分类器的样本集权重系数为
wk+1,i=wkiZkexp(−αkyiGk(xi))w_{k+1,i}=\frac{w_{ki}}{Z_k}exp(-\alpha_ky_iG_k(x_i))wk+1,i=Zkwkiexp(−αkyiGk(xi))
其中,ZkZ_kZk 是规范因子,
Zk=∑i=1mwkiexp(−αkyiGk(xi))Z_k=\sum_{i=1}^{m}w_{ki}exp(-\alpha_ky_iG_k(x_i))Zk=i=1∑mwkiexp(−αkyiGk(xi))
==》从 wk+1,iw_{k+1,i}wk+1,i 计算公式可以看出,如果第 iii 个样本分类错误,则 yiGk(xi)<0y_iG_k(x_i)<0yiGk(xi)<0,导致样本的权重在第 k+1k+1k+1 个弱分类器中增大,如果分类正确,则权重在第 k+1k+1k+1 个弱分类器中减少。
==》公式的由来在损失函数优化时介绍。
集合策略
Adaboost分类采用的是加权表决法,最终的强分类器为
f(x)=sign(∑k=1KαkGk(x))f(x)=sign(\sum_{k=1}^K\alpha_k G_k(x))f(x)=sign(k=1∑KαkGk(x))
(2)Adaboost回归
由于Adaboost的回归问题有很多变种,这里我们以Adaboost R2算法为准。
回归问题的误差率
对于第 kkk 个弱学习器,计算他在训练集上的最大误差
Ek=max∣yi−Gk(xi)∣,i=1,2,...,mE_k=\max|y_i-G_k(x_i)|,\ \ \ i=1,2,...,mEk=max∣yi−Gk(xi)∣, i=1,2,...,m
计算每个样本的相对误差
eki=∣yi−Gk(xi)∣Eke_{ki}=\frac{|y_i-G_k(x_i)|}{E_k}eki=Ek∣yi−Gk(xi)∣
注意:这里是误差为线性时的情况;若使用平方误差,则eki=(yi−Gk(xi))2Ek2e_{ki}=\frac{(y_i-G_k(x_i))^2}{E_k^2}eki=Ek2(yi−Gk(xi))2;若使用指数误差,则eki=1−exp(−yi+Gk(xi)Ek)e_{ki}=1-exp(\frac{-y_i+G_k(x_i)}{E_k})eki=1−exp(Ek−yi+Gk(xi))
最终得到第 kkk 个弱分类器的错误率:
ek=∑i=1mwkiekie_k=\sum_{i=1}^mw_{ki}e_{ki}ek=i=1∑mwkieki
弱学习器权重系数
第 kkk 个弱分类器 Gk(x)G_k(x)Gk(x) 的权重系数为
αk=ek1−ek\alpha_k=\frac{e_k}{1-e_k}αk=1−ekek
更新样本权重D
第 k+1k+1k+1 个弱学习器的样本集权重系数为
wk+1,i=wkiZkαk1−ekiw_{k+1,i}=\frac{w_{ki}}{Z_k}\alpha_k^{1-e_{ki}}wk+1,i=Zkwkiαk1−eki
其中,ZkZ_kZk 是规范因子,
Zk=∑i=1mwkiαk1−ekiZ_k=\sum_{i=1}^{m}w_{ki}\alpha_k^{1-e_{ki}}Zk=i=1∑mwkiαk1−eki
结合策略
采用的是对加权的弱学习器取权重中位数对应的弱学习器作为强学习器的方法,最终的强回归器为
f(x)=Gk∗(x)f(x)=G_{k^*}(x)f(x)=Gk∗(x)
其中,Gk∗(x)G_{k^*}(x)Gk∗(x)是所有 ln1αk\ln\frac{1}{\alpha_k}lnαk1,k=1,2,...,Kk=1,2,...,Kk=1,2,...,K 的中位数值对应序号 k∗k^*k∗ 对应的弱学习器。
2、AdaBoost分类问题的损失函数优化
Adaboost 是模型为加法模型,学习算法为前向分步学习算法,损失函数为指数函数的分类问题。
加法模型:最终的强分类器是若干个弱分类器加权平均而得到的。
前向分步学习算法:通过一轮轮的弱学习器学习,利用前一个弱学习器的结果来更新后一个弱学习器的训练集权重。第 k−1k-1k−1 轮的强学习器为
fk−1(x)=∑i=1k−1αiGi(x)f_{k-1}(x)=\sum_{i=1}^{k-1}\alpha_iG_i(x)fk−1(x)=i=1∑k−1αiGi(x)
而第 kkk 轮的强学习器为
fk(x)=∑i=1kαiGi(x)f_{k}(x)=\sum_{i=1}^{k}\alpha_iG_i(x)fk(x)=i=1∑kαiGi(x)
则可以得到
fk(x)=fk−1(x)+αkGk(x)f_k(x)=f_{k-1}(x)+\alpha_k G_k(x)fk(x)=fk−1(x)+αkGk(x)损失函数为指数函数,即定义损失函数为
argmin⎵α,G∑i=1mexp(−yifk(x))\underbrace{arg\ min}_{\alpha,G}\sum_{i=1}^mexp(-y_if_k(x))α,Garg mini=1∑mexp(−yifk(x))
利用前向分步学习算法的关系可以得到损失函数为
(αk,Gk(x))=argmin⎵α,G∑i=1mexp[(−yi)(fk−1(x)+αG(x))](\alpha_k,G_k(x))=\underbrace{arg\ min}_{\alpha,G}\sum_{i=1}^mexp[(-y_i)(f_{k-1}(x)+\alpha G(x))](αk,Gk(x))=α,Garg mini=1∑mexp[(−yi)(fk−1(x)+αG(x))]
令 wki′=exp(−yifk−1(x))w_{ki}'=exp(-y_if_{k-1}(x))wki′=exp(−yifk−1(x)),它的值不依赖于 α,Gα,Gα,G,因此与最小化无关,仅仅依赖于fk−1(x)f_{k−1}(x)fk−1(x),随着每一轮迭代而改变。
将这个式子带入损失函数,损失函数转化为
(αk,Gk(x))=argmin⎵α,G∑i=1mwki′exp[−yiαG(x)](\alpha_k,G_k(x))=\underbrace{arg\ min}_{\alpha,G}\sum_{i=1}^mw_{ki}'exp[-y_i\alpha G(x)](αk,Gk(x))=α,Garg mini=1∑mwki′exp[−yiαG(x)]
- 损失函数求解过程
- 求 Gk(x)G_k(x)Gk(x)。对任意 α>0\alpha>0α>0,使上式最小的 Gk(x)G_k(x)Gk(x) 由下式得到:
Gk(x)=argmin⎵G∑i=1mwki′I(yi≠G(xi))G_k(x)=\underbrace{arg\ min}_{G}\sum_{i=1}^{m}w'_{ki}I(y_i\neq G(x_i))Gk(x)=Garg mini=1∑mwki′I(yi̸=G(xi)) - 将 Gk(x)G_k(x)Gk(x) 带入损失函数,并对 α\alphaα 求导,使其等于0,则可以得到
αk=12log1−ekek\alpha_k=\frac{1}{2}\log{\frac{1-e_k}{e_k}}αk=21logek1−ek
其中,eke_kek 为分类错误率。
ek=∑i=1mwki′I(yi≠G(xi))∑i=1mwki′=∑i=1mwkiI(yi≠G(xi))e_k=\frac{\sum_{i=1}^{m}w'_{ki}I(y_i\neq G(x_i))}{\sum_{i=1}^{m}w'_{ki}}=\sum_{i=1}^mw_{ki}I(y_i\neq G(x_i))ek=∑i=1mwki′∑i=1mwki′I(yi̸=G(xi))=i=1∑mwkiI(yi̸=G(xi))
- 样本权重的更新。
利用 fk(x)=fk−1(x)+αkGk(x)f_k(x)=f_{k-1}(x)+\alpha_k G_k(x)fk(x)=fk−1(x)+αkGk(x) 和 wki′=exp(−yifk−1(x))w_{ki}'=exp(-y_if_{k-1}(x))wki′=exp(−yifk−1(x)),即可得:
wk+1,i′=wki′exp[−yiαkGk(x)]w_{k+1,i}'=w_{ki}'exp[-y_i\alpha_kG_k(x)]wk+1,i′=wki′exp[−yiαkGk(x)]
3、AdaBoost二元分类问题算法流程
输入:样本集 T={(x1,y1),(x2,y2),...(xm,ym)}T=\{(x_1,y_1),(x_2,y_2),...(x_m,y_m)\}T={(x1,y1),(x2,y2),...(xm,ym)},输出为 {−1,+1}\{-1, +1\}{−1,+1},弱分类器算法,弱分类器迭代次数 KKK。
输出:最终的强分类器 f(x)f(x)f(x)
(1) 初始化样本集权重为
D(1)=(w11,w12,...,w1m);w1i=1m;i=1,2,...,mD(1)=(w_{11},w_{12},...,w_{1m});\ \ w_{1i}=\frac{1}{m};\ \ i=1,2,...,mD(1)=(w11,w12,...,w1m); w1i=m1; i=1,2,...,m
(2) 对于 k=1,2,...,Kk=1,2,...,Kk=1,2,...,K:
a) 使用具有权重 DkD_kDk 的样本集来训练数据,得到弱分类器 Gk(x)G_k(x)Gk(x)
b) 计算 Gk(x)G_k(x)Gk(x) 的分类错误率
ek=P(Gk(xi)≠yi)=∑i=1mwkiI(Gk(xi)≠yi)e_k=P(G_k(x_i)\neq y_i)=\sum_{i=1}^{m}w_{ki}I(G_k(x_i)\neq y_i)ek=P(Gk(xi)̸=yi)=i=1∑mwkiI(Gk(xi)̸=yi)
c) 计算弱分类的系数
αk=12log1−ekek\alpha_k=\frac{1}{2}\log\frac{1-e_k}{e_k}αk=21logek1−ek
d) 更新样本集的权重分布
wk+1,i=wkiZkexp(−αkyiGk(xi))w_{k+1,i}=\frac{w_{ki}}{Z_k}exp(-\alpha_ky_iG_k(x_i))wk+1,i=Zkwkiexp(−αkyiGk(xi))
其中,ZkZ_kZk 是规范因子,
Zk=∑i=1mwkiexp(−αkyiGk(xi))Z_k=\sum_{i=1}^{m}w_{ki}exp(-\alpha_ky_iG_k(x_i))Zk=i=1∑mwkiexp(−αkyiGk(xi))
(3) 构建最终分类器为:
f(x)=sign(∑i=1KαkGk(x))f(x)=sign(\sum_{i=1}^K\alpha_k G_k(x))f(x)=sign(i=1∑KαkGk(x))
对于Adaboost多元分类算法,其实原理和二元分类类似,最主要区别在弱分类器的系数上。比如 Adaboost SAMME 算法,它的弱分类器的系数:
αk=12log1−ekek+log(R−1)\alpha_k=\frac{1}{2}\log\frac{1-e_k}{e_k}+\log(R-1)αk=21logek1−ek+log(R−1)
其中 RRR 为类别数。从上式可以看出,如果是二元分类,R=2R=2R=2,则上式和我们的二元分类算法中的弱分类器的系数一致。
4、Adaboost回归问题的算法流程
为Adaboost R2回归算法过程。
输入:样本集 T={(x1,y1),(x2,y2),...(xm,ym)}T=\{(x_1,y_1),(x_2,y_2),...(x_m,y_m)\}T={(x1,y1),(x2,y2),...(xm,ym)},弱分类器算法,弱分类器迭代次数 KKK。
输出:最终的强分类器 f(x)f(x)f(x)
(1) 初始化样本集权重为
D(1)=(w11,w12,...,w1m);w1i=1m;i=1,2,...,mD(1)=(w_{11},w_{12},...,w_{1m});\ \ w_{1i}=\frac{1}{m};\ \ i=1,2,...,mD(1)=(w11,w12,...,w1m); w1i=m1; i=1,2,...,m
(2) 对于 k=1,2,...,Kk=1,2,...,Kk=1,2,...,K:
a) 使用具有权重 DkD_kDk 的样本集来训练数据,得到弱分类器 Gk(x)G_k(x)Gk(x)
b) 计算训练集上的最大误差
Ek=max∣yi−Gk(xi)∣,i=1,2,...,mE_k=\max|y_i-G_k(x_i)|,\ \ \ i=1,2,...,mEk=max∣yi−Gk(xi)∣, i=1,2,...,m
c) 计算每个样本的相对误差
如果是线性误差,则 eki=∣yi−Gk(xi)∣Eke_{ki}=\frac{|y_i-G_k(x_i)|}{E_k}eki=Ek∣yi−Gk(xi)∣
如果是平方误差,则 eki=(yi−Gk(xi))2Ek2e_{ki}=\frac{(y_i-G_k(x_i))^2}{E_k^2}eki=Ek2(yi−Gk(xi))2
如果是指数误差,则 eki=1−exp(−yi+Gk(xi)Ek)e_{ki}=1-exp(\frac{-y_i+G_k(x_i)}{E_k})eki=1−exp(Ek−yi+Gk(xi))
d) 计算回归误差率
ek=∑i=1mwkiekie_k=\sum_{i=1}^mw_{ki}e_{ki}ek=i=1∑mwkieki
e) 计算弱学习器的系数
αk=ek1−ek\alpha_k=\frac{e_k}{1-e_k}αk=1−ekek
f) 更新样本集的权重分布为
wk+1,i=wkiZkαk1−ekiw_{k+1,i}=\frac{w_{ki}}{Z_k}\alpha_k^{1-e_{ki}}wk+1,i=Zkwkiαk1−eki
其中,ZkZ_kZk 是规范因子,Zk=∑i=1mwkiαk1−ekiZ_k=\sum_{i=1}^{m}w_{ki}\alpha_k^{1-e_{ki}}Zk=∑i=1mwkiαk1−eki
(3) 构建最终强学习器为:
f(x)=Gk∗(x)f(x)=G_{k^*}(x)f(x)=Gk∗(x)
其中,Gk∗(x)G_{k^*}(x)Gk∗(x)是所有 ln1αk\ln\frac{1}{\alpha_k}lnαk1,k=1,2,...,Kk=1,2,...,Kk=1,2,...,K 的中位数值对应序号 k∗k^*k∗ 对应的弱学习器。
5、Adaboost算法的正则化
为了防止Adaboost过拟合,我们通常也会加入正则化项,这个正则化项我们通常称为步长(learning rate)。定义为 ννν,对于前面的弱学习器的迭代
fk(x)=fk−1(x)+αkGk(x)f_k(x)=f_{k-1}(x)+\alpha_k G_k(x)fk(x)=fk−1(x)+αkGk(x)
如果我们加上了正则化项,则有
fk(x)=fk−1(x)+ναkGk(x)f_k(x)=f_{k-1}(x)+\nu\alpha_k G_k(x)fk(x)=fk−1(x)+ναkGk(x)
其中,ν∈(0,1]\nu\in(0,1]ν∈(0,1]。对于同样的训练集学习效果,较小的 ννν 意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。
三、Adaboost实现
1、Adaboost类库简介
scikit-learn中Adaboost类库:
- AdaBoostClassifier——分类
- 两种实现方法:SAMME和SAMME.R
- AdaBoostRegressor——回归
+实现方法: Adaboost.R2(详见2.1.2)
Adaboost调参
- Adaboost的框架参数
- 弱分类器的参数
2、AdaBoost框架参数
AdaBoostClassifier和AdaBoostRegressor的大部分框架参数相同,下面我们一起讨论这些参数,两个类如果有不同点我们会指出。
(1) base_estimator
:弱分类学习器或者弱回归学习器。
- 一般是CART决策树或者神经网络MLP,默认是决策树(
DecisionTreeClassifier
orDecisionTreeRegressor
)。 - 注意:分类中参数
algorithm
选择的是SAMME.R
,则弱分类学习器还需要支持概率预测(支持predict_proba
方法)
(2) n_estimators
:弱学习器的最大迭代次数,或者说最大的弱学习器的个数。
- 值太小,易欠拟合,值太大,易过拟合,一般选择一个适中的数值。默认是50。
- 在实际调参的过程中,我们常常将n_estimators和参数learning_rate一起考虑。
(3) learning_rate
:每个弱学习器的权重缩减系数 ν\nuν
- 为了防止Adaboost过拟合,我们通常也会加入正则化项,这个正则化项我们通常称为
步长(learning rate)
。 - 定义为 ν\nuν ,对于前面的弱学习器的迭代 fk(x)=fk−1(x)+αkGk(x)f_{k}(x) = f_{k-1}(x) + \alpha_kG_k(x)fk(x)=fk−1(x)+αkGk(x) 加上了正则化项,则有 fk(x)=fk−1(x)+ναkGk(x)f_{k}(x) = f_{k-1}(x) + \nu\alpha_kG_k(x)fk(x)=fk−1(x)+ναkGk(x),ν\nuν 的取值范围为 0<ν≤10 < \nu \leq 10<ν≤1 。
- 对于同样的训练集学习效果,较小的 ν\nuν 意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果,所以
n_estimators
和learning_rate
要一起调参。
(4) algorithm
(只有AdaBoostClassifier有该参数)
- 实现分类Adaboost的两种算法
SAMME
和SAMME.R
。 - 两者主要区别:基学习器权重的度量。
SAMME
使用对样本集分类效果作为弱学习器权重 (原理中即为SAMME),而SAMME.R
使用对样本集分类的预测概率大小来作为弱学习器权重。 - 默认为
SAMME.R
,它迭代一般比SAMME
快。但若用SAMME.R
, 则基学习器参数base_estimator
必须使用支持概率预测的分类器。
(5) loss
(只有AdaBoostRegressor有该参数)
Adaboost.R2
算法需要用到——有线性linear
, 平方square
和指数exponential
三种选择, 默认是线性。
3、弱分类器参数
本部分关注AdaBoostClassifier和AdaBoostRegressor弱学习器参数,仅讨论默认的决策树弱学习器的参数。即CART分类树DecisionTreeClassifier
和CART回归树DecisionTreeRegressor
的关键参数。
(1) max_features
:划分时考虑的最大特征数
- 可以使用很多种类型的值:
- 默认是
None
,表示划分时考虑所有的特征数; - 如果是
log2
意味着划分时最多考虑 log2Nlog_2Nlog2N 个特征; - 如果是
sqrt
或者auto
意味着划分时最多考虑 n\sqrt{n}n 个特征。 - 如果是
整数
,代表考虑的特征绝对数。 - 如果是
浮点数
,代表考虑特征百分比,即考虑 (百分比×N)(百分比 \times N)(百分比×N) 取整后的特征数。其中N为样本总特征数。
- 默认是
- 一般来说,如果样本特征数不多,比如小于50,默认
None
即可;如果特征数非常多,根据情况调整,以控制决策树的生成时间。
(2) max_depth
: 决策树最大深度。
- 默认可以不输入,则决策树在建立子树的时候不会限制子树的深度。
- 一般来说,数据少或者特征少时可以不管这个值。
- 如果模型样本量多,特征也多的情况下,常限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
(3) min_samples_split
: 内部节点再划分所需最小样本数。
- 该值限制了子树继续划分的条件,如果某节点的样本数少于
min_samples_split
,则不会继续再尝试选择最优特征来进行划分。 - 默认是 222,如果样本量不大,不需要管这个值。若样本量数量级非常大,则增大该值。
(4) min_samples_leaf
: 叶子节点最少样本数。
- 该值限制了叶子节点最少的样本数,若某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
- 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
(5) min_weight_fraction_leaf
:叶子节点最小的样本权重和。
- 该值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。
- 一般来说,若较多样本有缺失值,或分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
(6) max_leaf_nodes
: 最大叶子节点数。
- 通过限制最大叶子节点数,可以防止过拟合,默认是
None
,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。 - 如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
4、实战
# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as pltfrom sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles"""
1. 生成一些随机数据,用于做二元分类
"""
# 生成2维正态分布,生成的数据按分位数分为两类,200个样本,2个样本特征,协方差系数为2
X1, y1 = make_gaussian_quantiles(cov=2.,n_samples=200, n_features=2,n_classes=2, random_state=2019)
# 生成2维正态分布,生成的数据按分位数分为两类,300个样本,2个样本特征均值都为3,协方差系数为2
X2, y2 = make_gaussian_quantiles(mean=(3, 3), cov=1.5,n_samples=300, n_features=2,n_classes=2, random_state=2019)
# 将两组数据合成一组数据
X = np.concatenate((X1, X2))
y = np.concatenate((y1, - y2 + 1))"""
2. 基于决策树的Adaboost来做分类拟合
"""
# 这里我们选择了SAMME算法,最多200个弱分类器,步长0.8
bdt = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),algorithm="SAMME",n_estimators=200)bdt.fit(X, y)"""
3. 拟合结果可视化
"""
plot_colors = "br"
plot_step = 0.02
class_names = "AB"plt.figure(figsize=(10, 5))# Plot the decision boundaries
plt.subplot(121)
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),np.arange(y_min, y_max, plot_step))Z = bdt.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
cs = plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
plt.axis("tight")# Plot the training points
for i, n, c in zip(range(2), class_names, plot_colors):idx = np.where(y == i)plt.scatter(X[idx, 0], X[idx, 1],c=c, cmap=plt.cm.Paired,s=20, edgecolor='k',label="Class %s" % n)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.legend(loc='upper right')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Decision Boundary')# Plot the two-class decision scores
twoclass_output = bdt.decision_function(X)
plot_range = (twoclass_output.min(), twoclass_output.max())
plt.subplot(122)
for i, n, c in zip(range(2), class_names, plot_colors):plt.hist(twoclass_output[y == i],bins=10,range=plot_range,facecolor=c,label='Class %s' % n,alpha=.5,edgecolor='k')
x1, x2, y1, y2 = plt.axis()
plt.axis((x1, x2, y1, y2 * 1.2))
plt.legend(loc='upper right')
plt.ylabel('Samples')
plt.xlabel('Score')
plt.title('Decision Scores')plt.tight_layout()
plt.subplots_adjust(wspace=0.35)
plt.show()
在下一篇中将介绍GDBT相关内容,敬请期待~
集成学习(ensemble learning)(三)相关推荐
- 集成学习(ensemble learning)(四)
文章目录 一.GBDT概述 二.GDBT原理 1.负梯度拟合 2.GBDT回归算法 3.GBDT分类算法 (1)二元GBDT分类算法 (2)多元GBDT分类算法 4.GBDT常用损失函数 (1)分类任 ...
- 集成学习(ensemble learning)(二)
文章目录 一.Bagging原理 1.随机采样(BootStrap) 2.弱分类器和结合决策 二.Bagging算法流程 三.随机森林(Random Forest,RF) 1.特点 2.两个" ...
- 集成学习(ensemble learning)(一)
文章目录 一.集成学习概述 二.个体学习器 三.Boosting 四.Bagging 五.结合策略 1.平均法 2.投票法 3.学习法 (1)核心图解 a.构建新的训练集 b.构建新的测试集 c.最终 ...
- 机器学习-集成学习(ensemble learning)
集成学习ensemble learning:本身不是一个单独的机器学习算法,而是通过构建并结合多个机器学习器来完成学习任务. 可以用两句话形容: 1."三个臭皮匠顶个诸葛亮":一堆 ...
- 集成学习(Ensemble Learning)
在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好).集成学习就是组 ...
- RDKit |基于集成学习(Ensemble learning)预测溶解度
Ensemble learning 集成学习 集成学习(Ensemble learning)是这样一个过程,按照某种算法生成多个模型,如分类器或者称为专家,再将这些模型按照某种方法组合在一起来解决某个 ...
- 集成学习+ensemble learning
集成学习+ensemble learning Blending is a word introduced by the Netflix winners. It is very close to sta ...
- EL:集成学习(Ensemble Learning)的概念讲解、问题应用、算法分类、关键步骤、代码实现等相关配图详细攻略
EL:集成学习(Ensemble Learning)的概念讲解.算法分类.问题应用.关键步骤.代码实现等相关配图详细攻略 目录 集成学习Ensemble Learning 1.集成学习中弱分类器选择 ...
- 集成学习(ensemble learning)干货系列(3)——Boosting方法详解
集成学习(ensemble learning)干货系列(1)--集成学习概述 集成学习(ensemble learning)干货系列(2)--随机森林(Bagging) Boosting基本原理 提升 ...
最新文章
- 《Ember.js实战》——2.3 计算属性
- Viber4android,Viber更新4.0 推出全新贴纸市场,并支持安卓平板
- tcl把文本产生html,TCL脚本数据文件格式(译文)
- Network of Schools POJ - 1236 tarjan强连通分量缩点
- Sql Server中自动序号的方法
- 一起来玩树莓派--解决官方docker源安装失败的问题
- python怎么写中文至excel_Python 解决中文写入Excel时抛异常的问题
- Oracle 函数进阶、分组排序、列转行、cast 类型转换、dbms_random 生成随机数、sys_guid
- 【总结】最近写代码的思考与总结
- C51单片机引脚名词英文全称
- 配置Linux服务器防火墙端口规则
- FPGA之旅设计99例之第九例-----驱动0.96寸OLED屏
- 【coq】函数语言设计 练习题poly 总结
- 【Endnote X9服务器运行失败】
- 物联网毕业设计 单片机遥控小车
- 如何从型号判断NVR支持的接入路数和硬盘数?
- javascript关于累加和的发散思维
- 机器学习降维方法概括
- R语言和python语言的区别在什么地方,各自的应用场景是什么
- netcat 使用方法
热门文章
- java http参数传递_Java在HTTP请求中传递数组参数的方法
- ubuntu QT 编译报错 -1: error: cannot find -lGL问题的解决方法
- gdb set写text/code段错误的解决办法
- sql order by 降序_数仓面试|四个在工作后才知道的SQL密技
- python转义符个数,python(五)——运算符、字符串、转义字符
- idea 新建的java项目没发run_IDEA 如何创建一个普通的 Java 项目,及创建 Java 文件并运行...
- python 必备模块和包_Python_异常和模块
- 显卡、显卡驱动、cuda 之间的关系是什么?
- vim插件推荐之indentLine
- 高维数据使用npy格式保存