1、集成学习(Ensemble Learning)
(1)集成学习概述
集成学习的思想是将若干个学习器(分类器和回归器)组合之后产生一个新学习器。弱分类器(weak learner)指那些分类准确率只稍微好于随机猜测的分类器(error rate < 0.5)。
集成算法的成功在于保证弱分类器的多样性(Diversity),而且集成不稳定的算法也能够得到一个比较明显的性能提升。
常见的集成学习思想有:Bagging、Boosting、Stacking。
(2)为什么需要集成学习?
- 弱分类器间存在一定的差异性,这会导致分类的边界不同,也就是说可能存在错误。那么将多个弱分类器合并后,就可以得到更加合理的边界,减少整体的错误率,实现更好的效果
- 对于数据集过大或者过小,可以分别进行划分和有放回的操作产生不同的数据子集,然后使用数据子集训练不同的分类器,最终再合并成为一个大的分类器
- 如果数据的划分边界过于复杂,使用线性模型很难描述这种情况,那么可以训练多个模型,然后再进行模型的融合
- 对于多个异构的特征集,很难进行融合,那么可以考虑每个数据集构建
一个分类模型,然后将多个模型融合
2、Bagging方法
Bagging方法又叫做自举汇聚法(Bootstrap Aggregating),其思想是:在原始数据集上通过有放回的抽样的方式,重新选择出S个新数据集来分别训练S个分类器的集成技术。也就是说这些模型的训练数据中允许存在重复数据。
Bagging方法训练出来的模型在预测新样本分类的时候,会使用多数投票或者求均值的方式来统计最终的分类结果。
Bagging方法的弱学习器可以是基本的算法模型,例如:Linear、Ridge、Lasso、Logistic、Softmax、ID3、C4.5、CART、SVM、KNN等。
Bagging方式是有放回的抽样,并且每个子集的样本数量必须和原始样本数量一致,但是子集中允许存在重复数据。
Bagging方法的训练过程:

Bagging方法的预测过程:

3、随机森林(Random Forest)
(1)随机森林的建立步骤
随机森林是在Bagging策略的基础上进行修改后的一种算法。其建立步骤如下:
- 从样本集中用Bootstrap采样选出n个样本
- 从所有属性中随机选择K个属性,选择出最佳分割属性作为节点创建决策树
- 重复以上两步m次,即建立m棵决策树
- 这m个决策树形成随机森林,通过投票表决结果决定数据属于那一类
(2)普通决策树和随机森林对比图

(3)随机森林的推广算法
RF算法在实际应用中具有比较好的特性,应用也比较广泛,主要应用在:分类、回归、特征转换、异常点检测等。常见的RF变种算法如下:
- Extra Tree
- Totally Random Trees Embedding(TRTE)
- Isolation Forest
1)Extra Tree
Extra Tree是RF的一个变种,原理基本和RF一样,区别如下:
- RF会随机采样来作为子决策树的训练集,而Extra Tree每个子决策树采用原始数据集训练
- RF在选择划分特征点的时候会和传统决策树一样,基于信息增益、信息增益率、基尼系数、均方差等原则来选择最优特征值;而Extra Tree会随机的选择一个特征值来划分决策树
- Extra Tree因为是随机选择特征值的划分点,这样会导致决策树的规模一般大于RF所生成的决策树。也就是说Extra Tree模型的方差相对于RF进一步减少。在某些情况下,Extra Tree的泛化能力比RF强
2)Totally Random Trees Embedding(TRTE)
TRTE是一种非监督的数据转化方式。将低维的数据集映射到高维,从而让映射到高维的数据更好的应用于分类回归模型。
TRTE算法的转换过程类似RF算法的方法,建立T个决策树来拟合数据。当决策树构建完成后,数据集里的每个数据在T个决策树中叶子节点的位置就定下来了,将位置信息转换为向量就完成了特征转换操作。
TRTE示例:
有3棵决策树,每棵决策树有5个叶子节点,某个数据x划分到第一个决策树的第3个叶子节点,第二个决策树的第一个叶子节点,第三个决策树的第五个叶子节点,那么最终的x映射特征编码为:(0,0,1,0,0,1,0,0,0,0,0,0,0,0,1)。
3)Isolation Forest(IForest)
IForest是一种异常点检测算法,使用类似RF的方式来检测异常点。
IForest算法和RF算法的区别在于:
- 在随机采样的过程中,一般只需要少量数据即可
- 在进行决策树构建过程中,IForest算法会随机选择一个划分特征,并对划分特征随机选择一个划分阈值
- IForest算法构建的决策树一般深度max_depth是比较小的
IForest算法和RF算法存在区别的原因:IForest算法目的是异常点检测,所以只要能够区分异常即可,不需要大量数据。在异常点检测的过程中,一般不需要太大规模的决策树。
对于异常点的判断,则是将测试样本x拟合到T棵决策树上。计算在每棵树上该样本的叶子节点的深度ht(x),从而计算出平均深度h(x),然后就可以使用下列公式计算样本点x的异常概率值,p(x,m)的取值范围为[0,1],越接近于1,则是异常点的概率越大。
p(x,m)c(m)=2−c(m)h(x)=2ln(m−1)+ξ−2mm−1
其中,m为样本个数,ξ为欧拉常数。
(4)随机森林总结
随机森林的主要优点:
- 训练可以并行化,对于大规模样本的训练具有速度的优势
- 由于进行随机选择决策树划分特征列表,这样在样本维度比较高的时候,仍然具有比较高的训练性能
- 可以给出各个特征的重要性列表
- 由于存在随机抽样,训练出来的模型方差小,泛化能力强
- RF实现简单
- 对于部分特征的缺失不敏感
RF的主要缺点:
- 在某些噪音比较大的特征上,RF模型容易陷入过拟合
- 取值比较多的划分特征对RF的决策会产生更大的影响,从而有可能影响模型的效果
(5)RF scikit-learn相关参数
| 参数 |
RandomForestClassifier |
RandomForestRegressor |
| criterion |
指定划分标准,默认为gini,不支持其它参数 |
指定划分标准,可选”mse”和”mae”; 默认mse |
| loss |
不支持 |
指定误差的计算方式,可选参数”linear”, “square”,“exponential”, 默认为”linear”;一般不用改动 |
| n_estimators |
最大迭代次数,也就是最多允许的决策树的数目,值过小可能会导致欠拟合,值过大可能会导致过拟合,一
般50~100比较适合,默认10 |
| max_features |
给定在进行最佳特征划分的时候,选择多少个特征进行考虑;默认为auto;max_features=sqrt(n_features);
一般不建议改动,具体参数见官网文档。 |
| max_depth |
给定树的深度,默认为None,表示一致扩展到叶子节点足够纯或者样本数小于min_samples_split |
| min_samples_split |
给定树构建过程中,叶子节点中最少样本数量,默认为2 |
| min_samples_leaf |
给定一棵树最少叶子数量,默认为1 |
| bootstrap |
是否进行有放回的重采样,默认为True |
(6)随机森林的思考
在随机森林的构建过程中,由于各棵树之间是没有关系的,相对独立的,在构建的过程中,构建第m棵子树的时候,不会考虑前面的m-1棵树。
思考:
- 如果在构建第m棵子树的时候,考虑到前m-1棵子树的结果,会不会对最终结果产生有益的影响?
- 各个决策树组成随机森林后,在形成最终结果的时候能不能给定一种既定的决策顺序呢?也就是那颗子树先进行决策、那颗子树后进行决策?
4、Boosting方法
提升学习(Boosting)是一种机器学习技术,可以用于回归和分类的问题,它每一步产生弱预测模型(如决策树),并加权累加到总模型中。如果每一步的弱预测模型的生成都是依据损失函数的梯度方式的,那么就称为梯度提升(Gradient boosting)。
提升技术的意义:如果一个问题存在弱预测模型,那么可以通过提升技术的办法得到一个强预测模型。
常见的Boosting模型有:
- AdaBoost
- Gradient Boosting(GBT/GBDT/GBRT)

(1)AdaBoost算法
Adaptive Boosting是一种迭代算法。每轮迭代中会在训练集上产生一个新的学习器,然后使用该学习器对所有样本进行预测,以评估每个样本的重要性(Informative)。换句话来讲就是,算法会为每个样本赋予一个权重,每次用训练好的学习器标注/预测各个样本,如果某个样本点被预测的越正确,则将其权重降低;否则提高样本的权重。权重越高的样本在下一个迭代训练中所占的比重就越大,也就是说越难区分的样本在训练过程中会变得越重要。整个迭代过程直到错误率足够小或者达到一定的迭代次数为止。
Adaboost算法将基分类器的线性组合作为强分类器,同时给分类误差率较小的基本分类器以大的权值,给分类误差率较大的基分类器以小的权重值。构建的线性组合为:
f(x)=m=1∑MαmGm(x)
最终的强学习器是在线性组合的基础上进行Sign函数转换:
G(x)=sign(f(x))=sign[m=1∑MαmGm(x)]
损失函数:
loss=n1i=1∑nI(G(xi)=yi)≤n1i=1∑ne(−yif(x))
第k-1轮的强学习器:
fk−1(x)=j=1∑k−1αjGj(x)
第k轮的强学习器:
fk(x)fk(x)=j=1∑kαjGj(x)=fk−1(x)+αkGk(x)
损失函数:
loss(αm,Gm(x))=n1i=1∑ne(−yi(fm−1(x)+αmGm(x)))=n1i=1∑ne−yifm−1(x)e(−yiαmGm(x))令wˉmi=e−yifm−1(x)=n1i=1∑nwˉmie(−yiαmGm(x))
使上述公式达到最小值的αm和Gm就是AdaBoost算法的最终求解值。
G这个分类器在训练的过程中,是为了让误差率最小,所以可以认为G越小其实就是误差率越小。
Gm⋆(x)εm=n1i=1∑nwˉmiI(yi=Gm(xi))=P(Gm(x)=y)=n1i=1∑nwˉmiI(yi=Gm(xi))
对于αm而言,通过求导然后令导数为零,可以得到如下公式(对数可以以e为底也可以以2为底):
αm⋆αm⋆=21ln(εm1−εm)=21log2(εm1−εm)
AdaBoost算法构建过程
- 假设训练数据集T={(X1,Y1),(X2,Y2)…(Xn,Yn)}
- 初始化训练数据权重分布D1=(w11,w12,…,w1i,…,w1n),w1i=n1,i=1,2,…,n
- 使用具有权值分布Dm的训练数据集学习,得到基本分类器Gm(x):x→{−1,+1}
- 计算Gm(x)在训练集上的分类误差:
εm=P(Gm(xi)=yi)=i=1∑nwmiI(Gm(xi)=yi)
- 计算Gm(x)模型的权重系数αm:
αm=21log2(εm1−εm)
- 训练数据集的权重分布:
Dm+1wm+1,i=(wm+1,1,wm+1,2,…,wm+1,i,…,wm+1,n)=Zmwm,ie−αmyiGm(xi)
- 这里Zm是规范化因子,做的是归一化:
Zm=i=1∑nwm,ie−αmyiGm(xi)
- 构建基本分类器的线性组合:
f(x)=m=1∑MαmGm(x)
- 得到最终分类器:
G(x)=sign(f(x))=sign[m=1∑MαmGm(x)]
AdaBoost算法的实例演示
需求:权重训练用下列训练样本,试用AdaBoost算法训练一个强分类器。
| 序号 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| X |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
| Y |
1 |
1 |
1 |
-1 |
-1 |
-1 |
1 |
1 |
1 |
-1 |
- 初始化训练数据集的权值分布
D1w1iw1,i=(w11,w12,…,w1i,…,w1n)=N1,i=1,2,…,N=0.1
- 对于m=1,w1的权值矩阵如下。
| 序号 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| X |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
| Y |
1 |
1 |
1 |
-1 |
-1 |
-1 |
1 |
1 |
1 |
-1 |
| w1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
0.1 |
- 在权值分布为D1的训练数据上,阈值取2.5时误差率最低,故基本分类器为:
G1(x)={1,−1,x<2.5x>2.5
-
G1(x)在训练数据集上的误差率:ε1=P(G1(xi)=yi)=0.3
- 计算G1的系数:α1=21log2ε11−ε1=0.6112
- 更新数据集的权值分布
Dm+1wm+1,iD2=(wm+1,1,wm+1,2,…,wm+1,i,…,wm+1,n)=Zmwm,ie−αmyiGm(xi)=(w21,w22,…,w2n)=(0.0582,0.0582,0.0582,0.0582,0.0582,0.0582,0.1976,0.1976,0.1976,0.0582)
基本分类器的线性组合:f1(x)=0.6112G1(x)
分类器sign(f1(x))在训练数据集上有3个误分类点。
- 对于m=2,w2的权值矩阵如下。
| 序号 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| X |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
| Y |
1 |
1 |
1 |
-1 |
-1 |
-1 |
1 |
1 |
1 |
-1 |
| w2 |
0.0582 |
0.0582 |
0.0582 |
0.0582 |
0.0582 |
0.0582 |
0.1976 |
0.1976 |
0.1976 |
0.0582 |
-
在权值分布为D2的训练数据上,阈值取8.5时误差率最低,故基本分类器为:
G2(x)={1,−1,x<8.5x>8.5
-
G2(x)在训练数据集上的误差率:
ε2=P(G2(xi)=yi)=0.0582×3=0.1746
-
计算G2的系数
α2=21log2ε21−ε2
-
更新数据集的权值分布
D3=(w31,w32,…,w3n)=(0.0236,0.0236,0.0236,0.2218,0.2218,0.2218,0.0801,0.0801,0.0801,0.0236)
-
基本分类器的线性组合
f2(x)=0.6112G1(x)+1.1205G2(x)
分类器sign(f2(x))在训练数据集上有3个误分类点。
-
对于m=3,w3的权值矩阵如下。
| 序号 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
| X |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
| Y |
1 |
1 |
1 |
-1 |
-1 |
-1 |
1 |
1 |
1 |
-1 |
| w3 |
0.0236 |
0.0236 |
0.0236 |
0.2218 |
0.2218 |
0.2218 |
0.0801 |
0.0801 |
0.0801 |
0.0236 |
- 在权值分布为D3的训练数据上,阈值取5.5时误差率最低,故基本分类器为:
G3(x)={1,−1,x>5.5x<5.5
-
G3(x)在训练数据集上的误差率
ε3=P(G3(xi)=yi)=0.0236×4=0.0944
- 计算G3的系数
α3=21log2ε31−ε3=1.631
- 基本分类器的线性组合
f3(x)=0.6112G1(x)+1.1205G2(x)+1.631G3(x)
分类器sign(f3(x))在训练数据集上有0个误分类点,结束循环。
- 权值矩阵变化总表
AdaBoost Scikit-learn相关参数
| 参数 |
AdaBoostClassifier |
AdaBoostRegressor |
| base_estimator |
弱分类器对象,默认为CART分类树DecisionTreeClassifier |
弱回归器对象,默认为CART回归树DecisionTreeRegressor |
| algorithm |
SAMME和SAMME.R;SAMME表示构建过程中使用样本集分类效果作为弱分类器的权重;SAMME.R使用对样本集分类的预测概率大小作为弱分类器的权重。由于SAMME.R使用了连续的概率度量值,所以一般迭代比SAMME快,默认参数为SAMME.R;强调:使用SAMME.R必须要求base_estimator指定的弱分类器模型必须支持概率预测,即具有predict_proba方法 |
不支持 |
| loss |
不支持 |
指定误差的计算方式,可选参数”linear”, “square”, “exponential”, 默认为”linear”;一般不用改动 |
| n_estimators |
最大迭代次数,值过小可能会导致欠拟合,值过大可能会导致过拟合,一般50~100比较适合,默认50 |
| learning_rate |
指定每个弱分类器的权重缩减系数v,默认为1;一般从一个比较小的值开始进行调参;该值越小表示需要更多的弱分类器 |
f(x)=m=1∑MαmGm(x) 添加缩减系数v f(x)=m=1∑MvαmGm(x)
AdaBoost总结
AdaBoost的优点:
- 可以处理连续值和离散值
- 模型的鲁棒性比较强
- 解释强,结构简单。
AdaBoost的缺点:
- 对异常样本敏感,异常样本可能会在迭代过程中获得较高的权重值,最终影响模型效果。
(2)梯度提升迭代决策树GBDT
GBDT也是Boosting算法的一种,但是和AdaBoost算法不同;区别如下:
AdaBoost算法是利用前一轮的弱学习器的误差来更新样本权重值,然后一轮一轮的迭代;GBDT也是迭代,但是GBDT要求弱学习器必须是CART模型,而且GBDT在模型训练的时候,是要求模型预测的样本损失尽可能的小。
GBDT别名:GBT(Gradient Boosting Tree)、GTB(Gradient Tree Boosting)、GBRT(Gradient Boosting Regression Tree)、GBDT(Gradient Boosting Decison Tree)、MART(Multiple Additive Regression Tree)。
GBDT给定一个步长step,在构建下一棵树的时候使用step*残差值作为输入值,这种方式可以减少过拟合的发生。
GBDT由三部分构成:DT(Regression Decistion Tree)、GB(Gradient Boosting)和Shrinkage(衰减)。DT由多棵决策树组成,所有树的结果累加起来就是最终结果。
迭代决策树和随机森林的区别:
- 随机森林使用抽取不同的样本构建不同的子树,也就是说第m棵树的构建和前m-1棵树的结果是没有关系的
- 迭代决策树在构建子树的时候,使用之前子树构建结果后形成的残差作为输入数据构建下一个子树。然后最终预测的时候按照子树构建的顺序进行预测,并将预测结果相加
GBDT算法原理
给定输入向量X和输出变量Y组成的若干训练样本(X1,Y1),(X2,Y2)…(Xn,Yn),目标是找到近似函数F(X),使得损失函数L(Y, F(X))的损失值最小。
L损失函数一般采用最小二乘损失函数或者绝对值损失函数:
L(y,F(x))L(y,F(x))=21(y−F(x))2=∣y−F(x)∣
最优解为:F⋆(x)=argminL(y,F(x))
假定F(X)是一族最优基函数fi(X)的加权和:
F(x)=i=0∑Mfi(x)
防止每个学习器能力过强可能导致过拟合,给定一个缩放系数v:
F(x)=vi=0∑Mfi(x)
以贪心算法的思想扩展得到Fm(x),求解最优f。
Fm(x)=Fm−1(x)+argmini=1∑nL(yi,Fm−1(Xi)+fm(Xi))
以贪心法在每次选择最优基函数f时仍然困难,使用梯度下降的方法近似计算。给定常数函数F0(x):
F0(X)=argmini=1∑nL(yi,c)
根据梯度下降计算学习率:
αim=[∂F(xi)∂L(yi,F(xi))]F(x)=Fm−1(x)
使用数据(xi,αim)(i=1…n),计算拟合残差找到一个CART回归树,得到第m棵树。
cmjhm(x)=argminxi∈leafj∑L(yi,fm−1(xi)+c)=j=1∑∣leaf∣mcmjI(x∈leafmj)
更新模型
fm(x)⇒f(x)=fm−1(x)+j=1∑∣leaf∣mcmjI(x∈leafmj)=f0(x)+m=1∑Mj=1∑∣leaf∣mcmjI(x∈leafmj)
GBDT回归算法和分类算法的区别
两者唯一的区别就是选择不同的损失函数。回归算法选择的损失函数一般是均方差(最小二乘)或者绝对值误差。而在分类算法中一般的损失函数选择对数函数来表示。
L(y,f(x))L(y,f(x))L(y,f(x))=21(y−f(x))2=ln(1+e(−yf(x)));y∈{−1,+1},二分类=−k=1∑Kyklog(pk(x)),K分类
GBDT Scikit-learn相关参数
| 参数 |
GradientBoostingClassifier |
GradientBoostingRegressor |
| alpha |
不支持 |
当使用huber或者quantile损失函数的时候,需要给定分位数的值,默认为0.9;如果噪音数据比较多,可以适当的降低该参数值 |
| loss |
给定损失函数,可选对数似然函数deviance和指数损失函数exponential;默认为deviance;不建议修改 |
给定损失函数,可选均方差ls、绝对损失lad、Huber损失huber、分位数损失quantile;默认ls;一般采用默认;如果噪音数据比较多,推荐huber;如果是分段预测,推荐
quantile |
| n_estimators |
最大迭代次数,值过小可能会导致欠拟合,值过大可能会导致过拟合,一般50~100比较适合,默认50 |
| learning_rate |
指定每个弱分类器的权重缩减系数v,默认为1;一般从一个比较小的值开始进行调参;该值越小表示需要更多的弱分类器 |
| subsample |
给定训练模型的时候,进行子采样的比例值,取值范围(0,1], 默认为1,表示不采用子采样;给值小于1表示采用部分数据进行模型训练,可以降低模型的过拟合情况;推荐[0.5,0.8];采样采用的方式是不放回采样 |
| init |
给定初始化的模型,可以不给定 |
GBDT总结
GBDT的优点:
- 可以处理连续值和离散值
- 在相对少的调参情况下,模型的预测效果也会不错
- 模型的鲁棒性比较强
GBDT的缺点如下:
5、方差与偏差
(1)Bagging、Boosting的区别
- 样本选择:Bagging算法是有放回的随机采样;Boosting算法是每一轮训练集不变,只是训练集中的每个样例在分类器中的权重发生变化,而权重根据上一轮的分类结果进行调整
- 样例权重:Bagging使用随机抽样;Boosting根据错误率不断的调整样例的权重值,错误率越大则权重越大
- 预测函数:Bagging所有预测模型的权重相等;Boosting算法对于误差小的分类器具有更大的权重
- 并行计算:Bagging算法可以并行生成各个基模型;Boosting理论上只能顺序生产,因为后一个模型需要前一个模型的结果
- Bagging是减少模型的variance(方差);Boosting是减少模型的Bias(偏度)
- Bagging里每个分类模型都是强分类器,因为降低的是方差,方差过高是过拟合
- Boosting里每个分类模型都是弱分类器,因为降低的是偏度,偏度过高是欠拟合
- Bagging对样本重采样,对每一轮的采样数据集都训练一个模型,最后取平均。由于样本集的相似性和使用的同种模型,因此各个模型的具有相似的bias和variance
(2)方差与偏差的权衡
error=Bias+Variance

6、Stacking
Stacking是指训练一个模型用于组合(combine)其它模型(基模型/基学习器)的技术。即首先训练出多个不同的模型,然后再以之前训练的各个模型的输出作为输入来新训练一个新的模型,从而得到一个最终的模型。一般情况下使用单层的Logistic回归作为组合模型。
