决策树(Decision Tree)是常见的机器学习方法,可以处理分类和回归问题。用于分类的决策树对比逻辑回归和SVM的区别在于:LR适合处理接近线性可分的分类问题,决策边界是线性的;SVM通过把特征空间映射到核空间使得各个类别线性可分,在高维空间的决策面是线性的,映射回原特征空间的决策边界是非线性的;而DT是基于树形结构来进行决策的,将一个个特征按层次进行划分,可以找到非线性的决策边界。LR和SVM原理可以参考博客《机器学习中的分类器:感知机、逻辑回归、支持向量机》。下图是一个简单的二维特征空间的分类,针对不同分类器的结果:

(图片来源链接:LR、DT、SVM的对比)
模型发展历史:

目录
- 1. 决策树
- 2. 集成学习
- 2.1 Boosting
- 2.2 Bagging
- 2.3 Stacking
1. 决策树
决策树包含一个根结点、若干个内部结点和若干个叶结点,叶结点对应于决策结果,其他结点表示一个特征或属性。决策树的每一个路径互斥且完备,即每一个样本都被一条路径所覆盖,且只被一条路径所覆盖。决策树的根结点包含所有样本,从根节点到叶结点越往下,样本取某一个值(类别)的可能性越大,到达叶结点的时候这个可能性达到最大,叶结点的样本都属于一类。所以,决策树的学习过程就是产生一棵泛化能力强,可以处理未知样本的决策树。学习过程的伪代码如下,采用自顶向下递归的方法:
可以看到递归划分步骤的停止条件有三个:(1)样本属于同一类别,无需划分;(2)样本的属性相同,无法划分;(3)样本为空,不能划分。决策树学习的关键在于伪代码的第8行,如何选择最优划分属性,即希望随着划分的进行结点包含的样本尽可能属于同一类别,样本要分得足够开,拥有较高的纯度。针对这一问题,衍生了很多决策树算法,如下表:
经典决策树 |
划分准则 |
ID3 |
信息增益(information gain) |
C4.5 |
增益率(gain ratio) |
CART |
基尼指数(Gini index) |
信息熵(对平均不确定性的度量)是度量样本集合纯度最常用的一种指标,回顾信息论与机器学习的关系:
信息熵: H ( X ) = − ∑ x ∈ X p ( x ) l o g p ( x ) H(X)=-\sum\limits_{x \in X}p(x)logp(x) H(X)=−x∈X∑p(x)logp(x)
条件熵: H ( X ∣ Y ) = − ∑ x , y p ( x , y ) l o g p ( x ∣ y ) H(X|Y)=-\sum\limits_{x,y}p(x,y)logp(x|y) H(X∣Y)=−x,y∑p(x,y)logp(x∣y)
联合熵: H ( X , Y ) = − ∑ x ∑ y p ( x , y ) l o g p ( x , y ) H(X,Y)=-\sum\limits_{x}\sum\limits_{y}p(x,y)logp(x,y) H(X,Y)=−x∑y∑p(x,y)logp(x,y)
互信息: I ( X , Y ) = − ∑ x , y l o g p ( x , y ) p ( x ) p ( y ) I(X,Y)=-\sum\limits_{x,y}log\frac{p(x,y)}{p(x)p(y)} I(X,Y)=−x,y∑logp(x)p(y)p(x,y),上图的右边用维恩图表示了互信息与熵的关系。
- ID3:ID3算法最早是由Quinlan于1975年在悉尼大学提出的一种分类预测算法,算法的核心是“信息熵”。根据信息论的知识,信息增益越大,则使用属性 a a a 来进行划分所获得的纯度提升越大。如上表的平均互信息即为信息增益,代表了不确定性的减少,所以将具有最大信息增益的属性作为划分结点。设有K个类, ∣ C k ∣ |C_k| ∣Ck∣为属于类 C k C_k Ck的样本个数, ∑ k = 1 K ∣ C k ∣ = ∣ D ∣ \sum\limits_{k=1}^K|C_k|=|D| k=1∑K∣Ck∣=∣D∣;上面的伪代码中特征 A A A有 d d d个属性,设每个属性有n个取值(不同属性的取值个数也不一定相同),根据取值将 D D D划分为 n n n个子集 ∣ D i ∣ |D_i| ∣Di∣, ∑ i = 1 n ∣ D i ∣ = ∣ D ∣ \sum\limits_{i=1}^n|D_i|=|D| i=1∑n∣Di∣=∣D∣;子集 ∣ D i ∣ |D_i| ∣Di∣中属于类 C k C_k Ck的样本集合为 ∣ D i k ∣ |D_{ik}| ∣Dik∣。
g ( D , a ) = H ( D ) − H ( D ∣ a ) H ( D ) = − ∑ k = 1 K p k l o g p k , p k = ∣ C k ∣ ∣ D ∣ H ( D ∣ a ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) g(D,a)=H(D)-H(D|a)\\ H(D)=-\sum\limits_{k=1}^{K}p_klogp_k,\space\space p_k=\frac{|C_k|}{|D|}\\ H(D|a)=\sum\limits_{i=1}^{n}\frac{|D_i|}{|D|}H(D_i) g(D,a)=H(D)−H(D∣a)H(D)=−k=1∑Kpklogpk, pk=∣D∣∣Ck∣H(D∣a)=i=1∑n∣D∣∣Di∣H(Di)
遍历 A A A中所有特征 a a a,选择信息增益最大的特征 a ∗ a_* a∗作为当前的划分特征。
缺点:(1)只能处理离散特征不能处理连续特征(连续的可取值无法划分分支,必须离散化);(2)信息增益对可取值数目较多的属性有所偏好,可能训练得到一个庞大且深度浅的树;(3)无法处理空值;(4)根据属性值划分样本,之后该特征不会再起作用,这种快速划分的方式会影响算法的准确率。
- C4.5:为了解决ID3的第(1)个缺点,将连续特征离散化,但是,该过程需要对连续值先进行排序,会使C4.5性能下降;针对第(2)个缺点,不直接用信息增益,而是用增益率来作为选择分支的准则;针对第(3)个缺点进行了缺失值的处理。属性集A的属性 a a a的取值个数越多,则信息熵通常会越大,从而对信息增益进行惩罚。
g r ( D , a ) = g ( D , a ) H ( a ) H ( a ) = − ∑ i = 1 n p i l o g p i , p i = ∣ D i ∣ ∣ D ∣ gr(D,a)=\frac{g(D,a)}{H(a)}\\ H(a)=-\sum\limits_{i=1}^{n}p_ilogp_i,\space\space p_i=\frac{|D_i|}{|D|} gr(D,a)=H(a)g(D,a)H(a)=−i=1∑npilogpi, pi=∣D∣∣Di∣
C4.5启发式决策树:先从候选划分属性中找到信息增益高于平均水平的属性,再从中选择增益率高的。
- CART(Classification and Regression Tree):
相比ID3和C4.5,CART应用要多一些,既可以用于分类也可以用于回归。CART只能形成二叉树,即分支条件都是二分类,(1)对于连续特征:比较阈值,高于某个阈值就属于某一类,低于某个阈值属于另一类;(2)对于离散特征:抽取子特征,比如颜值这个特征,有帅、丑、中等三个水平,可以先分为帅和不帅的,不帅的里面再分成丑和中等的。无论是ID3还是C4.5都是基于信息论的熵模型,会涉及大量的对数运算分支方法,CART使用与信息熵的含义相似的基尼指数(Gini index)来选择最好的数据划分的特征,基尼系数(Gini)描述的也是模型的纯度,不过和信息增益(比)是相反的,即基尼系数越小,则纯度越高,特征越好。
G i n i ( D ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 , p k = ∣ C k ∣ ∣ D ∣ G i n i _ i n d e x ( D , a ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ G i n i ( D i ) Gini(D)=\sum\limits_{k=1}^{K}p_k(1-p_k)=1-\sum\limits_{k=1}^{K}p_k^2,\space\space p_k=\frac{|C_k|}{|D|}\\ Gini\_index(D,a)= \sum\limits_{i=1}^{n}\frac{|D_i|}{|D|}Gini(D_i) Gini(D)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2, pk=∣D∣∣Ck∣Gini_index(D,a)=i=1∑n∣D∣∣Di∣Gini(Di)
优点:分类规则清晰,结果容易理解;非线性、非参数方法;计算量相对较小,实现速度快。
缺点:容易过拟合(解决方式:剪枝);上述都是基于启发式的贪心算法建立的,因此不能保证建立全局最优的决策树(解决方式:随机森林)。
针对决策树算法的过拟合问题,即为了尽可能正确分类训练样本,结点划分过程不断重复,造成决策树分支过多导致的过拟合。可以通过主动去掉一些分支来降低过拟合的风险,决策树剪枝的基本策略分为“预剪枝”和“后剪枝”。一般情况下,后剪枝决策树的欠拟合风险较小,泛化能力较强,但是训练时间开销比未剪枝和预剪枝都大得多。预剪枝:通过启发式方法,在生成决策树过程中对划分进行预测,若当前结点的划分不能对决策树泛化性能提升,则停止划分,并将其标记为叶节点。后剪枝:对已有的决策树,自底向上的对非叶结点进行考察,若该结点对应的子树替换为叶结点能提升决策树的泛化能力,则将该子树替换为叶结点。
2. 集成学习
在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好)。集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型,集成学习潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来。
参考链接:https://www.cnblogs.com/zongfa/p/9304353.html
2.1 Boosting
提升法是序列化方法,个体学习器之间存在较强的依赖关系、必须串行生成。方法流程:(1)从初始训练集训练出一个基学习器;(2)根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注;(3)基于调整后的样本分布来训练下一个基学习器;(4)重复上述过程直到基学习器数目达到事先指定的值;(5)将这些学习器进行加权结合。从上面可以看出,该方法主要改进的地方在于(2)和(5)的解决方案。
AdaBoost
AdaBoost是1997年提出的,是英文"Adaptive Boosting"(自适应增强)的缩写,是boosting最著名的代表性算法。通过对样本和基学习器设置权值 w w w 和 α \alpha α,从而提高上一轮被错误分类的样本的权值,降低被正确分类的样本的权值,最后,误差率小的基学习器拥有较大的权值,误差率大的基学习器拥有较小的权值,加性模型将弱分类器进行线性组合。下图左边是算法伪代码,右边表示了各分类器的依赖和串行关系(左右的符号不对应)。

以伪代码中的符号表示来看,有如下公式:
- 分类误差率: ε t = ∑ i = 1 m w t i I ( h t ( x ) ≠ f ( x ) ) \varepsilon_t=\sum\limits_{i=1}^mw_{ti}\mathbb I(h_t(x)\ne f(x)) εt=i=1∑mwtiI(ht(x)=f(x)) 是由样本的权重计算得到的,权值分布 D t = ( w t 1 , w t 2 , . . . , w t m ) D_t=(w_{t1},w_{t2},...,w_{tm}) Dt=(wt1,wt2,...,wtm), I ( ) \mathbb I() I()表示指示函数,即满足扩号内的条件则值为1,否则为0。
- 优化目标: L e x p ( α t h t ∣ D t ) = E [ e − f ( x ) α t h t ( x ) ] L_{exp}(\alpha_th_t|D_t)=E[e^{-f(x)\alpha_th_t(x)}] Lexp(αtht∣Dt)=E[e−f(x)αtht(x)],再通过代入 ε t \varepsilon_t εt 来最小化指数损失函数。
- 分类器的权重 : α t = 1 2 l n ( 1 − ε t ε t ) \alpha_t=\frac12ln(\frac{1-\varepsilon_t}{\varepsilon_t}) αt=21ln(εt1−εt),当 ε t = 1 2 \varepsilon_t=\frac12 εt=21 时,即一半的分类是错误的时候分类器的权重为0。
- 更新训练集权值分布: w t + 1 , i = w t , i Z t e x p ( − α t y i h t ( x i ) ) w_{t+1,i}=\frac{w_{t,i}}{Z_t}exp(-\alpha_ty_ih_t(x_i)) wt+1,i=Ztwt,iexp(−αtyiht(xi)), h t ( x ) ∈ { − 1 , + 1 } h_t(x)\in {\{-1,+1\}} ht(x)∈{−1,+1},为了使现有分类器表现最差,从而产生新的样本分布, Z t = ∑ i = 1 m w t i e x p ( − α t y i h t ( x i ) ) Z_t=\sum\limits_{i=1}^mw_{ti}exp(-\alpha_ty_ih_t(x_i)) Zt=i=1∑mwtiexp(−αtyiht(xi))是规范化因子。
参考链接:AdaBoost算法详解与python实现
GBDT
GBDT(Gradient Boosting Decision Tree)梯度提升决策树,含义就是用Gradient Boosting的策略训练出来的DT模型,基分类器采用CART,主要用来做回归预测。提升树的损失函数是平方损失或指数损失时,每一步优化是很简单的,但对于一般损失而言,往往不那么容易。GBTD虽然也是一个加性模型,但其是通过不断迭代拟合样本真实值与当前分类器的残差来逼近真实值的,它与Adaboost的区别在于每一次的计算是为了最小化残差的误差,在残差减少(负梯度作为近似值)的方向上建立一个新的模型,利用最速下降法的近似方法。
- 加性模型: F ( x ) = ∑ t = 1 T ( α t h t ( x ) ) F(x)=\sum\limits_{t=1}^T(\alpha_th_t(x)) F(x)=t=1∑T(αtht(x))
- 残差逼近: F t ( x ) = F t − 1 ( x ) + α t h t ( x ) F_t(x)=F_{t-1}(x)+\alpha_th_t(x) Ft(x)=Ft−1(x)+αtht(x)
- 优化目标: h t ( x ) = a r g m i n h ( ∑ i = 1 m L ( y i , F t − 1 ( x i ) + α t h t ( x i ) ) ) h_t(x)=arg\space min_h(\sum\limits_{i=1}^mL(y_i,F_{t-1}(x_i)+\alpha_th_t(x_i))) ht(x)=arg minh(i=1∑mL(yi,Ft−1(xi)+αtht(xi)))
这里推导好复杂,更多内容可以参考下面的博文:
[1] https://blog.csdn.net/weixin_42933718/article/details/88421574#_31
[2]https://blog.csdn.net/zhangbaoanhadoop/article/details/82193954
贴出具体算法流程:

2.2 Bagging
套袋法是并行化方法,个体学习器之间不存在较强的依赖关系、可同时生成。方法流程:(1)通过自助采样法(bootstrap sampling)采样(有放回的抽取)出多个训练集;(2)基于每个采样集训练一个基学习器;(3)基于调整后的样本分布来训练下一个基学习器;(4)将这些学习器进行结合,通常对分类任务采用简单投票法,对回归任务采用简单平均法。
随机森林
随机森林(Random Forest,RF)算法是一个包含多个决策树的算法,其输出的类别是由个别决策树输出的类别的众树来决定的。RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。所以随机森林的随机性体现在两个方面:(1)从样本集中用Bootstrap采样选出固定数目个样本;(2)从所有属性中随机选择k个属性,选择最佳划分属性作为结点建立CART决策树。

优点:在数据集上表现良好,两个随机性的引入,使得随机森林不容易陷入过拟合,并求具有很好的抗噪声能力;实现比较简单,训练速度快,计算开销小;能够处理很高维度的数据,并且不用做特征选择,对数据集的适应能力强。
2.3 Stacking
Stacking方法是指训练一个学习器用于组合其他各个学习器。首先,我们先训练多个不同的模型,然后把之前训练的各个模型的输出作为输入来训练一个模型,以得到一个最终的输出。
Bagging和Boosting的区别:
1)样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3)预测函数:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4)并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
集成方法是将几种机器学习技术组合成一个预测模型的元算法,以达到减小方差(bagging)、偏差(boosting)或改进预测(stacking)的效果。