LR模型是利用线性回归的预测值,通过sigmoid映射为概率,来对数据做预测,有非常友好的数据预处理特性,工业界应用很丰富。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。
1) 开始:构建根节点,将所有训练数据都放在根节点,选择一个最优特征,按着这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。
2) 如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点去。
3)如果还有子集不能够被正确的分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点,如果递归进行,直至所有训练数据子集被基本正确的分类,或者没有合适的特征为止。
4)每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树。
决策树的构造方式:基于树的结构进行决策
内部节点:对应对属性的测试
分支:对应属性可能的结果
叶节点:对应一个预测结果
决策树的学习过程(训练):通过对训练样本的分析,来确定划分的属性
决策树的预测过程:将示例从根节点开始,沿着划分属性进行划分,直到叶节点
决策树通常有三个步骤:特征选择、决策树的生成、决策树的修剪。
决策树学习的目标:根据给定的训练数据集构建一个决策树模型,使它能够对实例进行正确的分类。
决策树学习的本质:从训练集中归纳出一组分类规则,或者说是由训练数据集估计条件概率模型。
决策树学习的损失函数:正则化的极大似然函数
决策树学习的测试:最小化损失函数
决策树学习的目标:在损失函数的意义下,选择最优决策树的问题。
决策树原理和问答猜测结果游戏相似,根据一系列数据,然后给出游戏的答案。
1、总体流程
2、停止条件
当前结点包含的样本全部属于同一类,无需划分
当前属性集合为空,或是所有样本在所有属性上取值相同(所有条件都一样,但还是无法判断类别)
当前结点包含的样本集合为空,无法划分(没有对应的样本了)
决策树算法的核心:从属性集中选择最优的划分属性
1、熵
熵是度量样本不纯度的指标,样本不纯度越大,熵越大,越无序。
熵是度量信息的期望值
信息:
熵:
熵的公式:
熵越小,样本的纯度越高,所以决策树的生长过程也是不断的将数据的不纯度降低的过程,希望最后得到的分类结果纯的很高,也就是准确性很高。
2、信息增益:ID3
机器学习的过程是希望将样本的不纯度往下降的过程,那么最优属性的划分可以参考那个属性对当前样本的熵降低的最多。
纹理的信息增益最大,将其选为当前划分属性。
3、信息增益率:C4.5
信息增益存在的问题:假如我们用“学号”作为特征,也就是每个人一个学号,将45个人分到45个桶里,此时的纯度最高,但是对新来的特征没有任何意义,即分叉越多,越肯定,纯度越高,所带来的增益很大,所以我们选用相对值来衡量信息的增益,也就是信息增益率。
逻辑回归是一个平滑的过程,决策树是跳变的过程,每次只有两个结果。
4、基尼指数:CART树(二叉树)
假如现在有一个袋中有黑、白两种球:
① 摸出一个球颜色为C1,放回之后再摸出一个球C2,如果 C1=C2 C 1 = C 2 ,则说明两种颜色个数差比较大,即样本的纯度较高,熵越小。
② 如果 C1≠C2 C 1 ≠ C 2 ,则说明两种球颜色数量比较接近,袋子中样本的熵比较大。
总结: C1=C2 C 1 = C 2 概率越大,说明熵越小,不纯度越小,所以我们希望树朝着 C1=C2 C 1 = C 2 概率增大的方向发展。
基尼指数的意义:1-(两次摸出球颜色相同的概率)=两次摸出颜色不同的概率
颜色不同,表示熵越小,则gini指数表示了往熵减小的方向发展。
5、基尼指数和熵的关系
熵=基尼指数
这三个是非常著名的决策树算法。简单粗暴来说,ID3 使用信息增益作为选择特征的准则;C4.5 使用信息增益比作为选择特征的准则;CART 使用 Gini 指数作为选择特征的准则。
一、ID3
熵表示的是数据中包含的信息量大小。熵越小,数据的纯度越高,也就是说数据越趋于一致,这是我们希望的划分之后每个子节点的样子。
信息增益 = 划分前熵 - 划分后熵。信息增益越大,则意味着使用属性 a 来进行划分所获得的 “纯度提升” 越大 **。也就是说,用属性 a 来划分训练集,得到的结果中纯度比较高。
ID3 仅仅适用于二分类问题。ID3 仅仅能够处理离散属性。
二、C4.5
C4.5 克服了 ID3 仅仅能够处理离散属性的问题,以及信息增益偏向选择取值较多特征的问题,使用信息增益比来选择特征。信息增益比 = 信息增益 / 划分前熵 选择信息增益比最大的作为最优特征。
C4.5 处理连续特征是先将特征取值排序,以连续两个值中间值作为划分标准。尝试每一种划分,并计算修正后的信息增益,选择信息增益最大的分裂点作为该属性的分裂点。但是,对连续属性值需要扫描排序,会使C4.5性能下降。
ID3和C4.5都是分类树,CART(Classification and regression tree)可以是分类/回归树。
如何处理连续值:
因为连续属性的可取值数目不再有限,因此不能像前面处理离散属性枚举离散属性取值来对结点进行划分。因此需要连续属性离散化,常用的离散化策略是二分法,这个技术也是C4.5中采用的策略。
对于数据集中的属性“密度”,决策树开始学习时,根节点包含的17个训练样本在该属性上取值均不同。我们先把“密度”这些值从小到大排序:
取t为不同值时,得到增益值:
总结:将连续值由小到大排序,取一个值作为划分点进行二分,计算增益值。
三、CART
CART 与 ID3,C4.5 不同之处在于 CART 生成的树必须是二叉树。也就是说,无论是回归还是分类问题,无论特征是离散的还是连续的,无论属性取值有多个还是两个,内部节点只能根据属性值进行二分。
CART 的全称是分类与回归树。从这个名字中就应该知道,CART 既可以用于分类问题,也可以用于回归问题。
回归树中,使用平方误差最小化准则来选择特征并进行划分。每一个叶子节点给出的预测值,是划分到该叶子节点的所有样本目标值的均值,这样只是在给定划分的情况下最小化了平方误差。
要确定最优化分,还需要遍历所有属性,以及其所有的取值来分别尝试划分并计算在此种划分情况下的最小平方误差,选取最小的作为此次划分的依据。由于回归树生成使用平方误差最小化准则,所以又叫做最小二乘回归树。
分类树种,使用 Gini 指数最小化准则来选择特征并进行划分;
Gini 指数表示集合的不确定性,或者是不纯度。基尼指数越大,集合不确定性越高,不纯度也越大。这一点和熵类似。另一种理解基尼指数的思路是,基尼指数是为了最小化误分类的概率。
信息增益 vs 信息增益比
之所以引入了信息增益比,是由于信息增益的一个缺点。那就是:信息增益总是偏向于选择取值较多的属性。信息增益比在此基础上增加了一个罚项,解决了这个问题。
Gini 指数 vs 熵
既然这两个都可以表示数据的不确定性,不纯度。那么这两个有什么区别那?
•Gini 指数的计算不需要对数运算,更加高效;
•Gini 指数更偏向于连续属性,熵更偏向于离散属性。
分类树:
分类树,我们知道ID3和C4.5在每次分支的时候,是穷举每个特征属性的一个阈值,得到使得按照feature<阈值和feature>阈值分成的两个分支的熵最大的feature和阈值,按照该标准分支得到两个新结点,用同样的方法继续分支,直到所有的样本都被分入唯一的叶子节点,或者达到预设的终止条件。若叶子节点中性别不唯一,则以多数人的性别作为该叶子节点的性别。
回归树:
回归树整体流程类似,不过在每个结点(不一定是叶子结点)都会得到一个预测值,该预测值等于属于该节点的所有人年龄的平均值,分支时穷举每一个feature的每个阈值作为最好的分割点,但衡量最好的标准不再是最大熵,而是最小化均方误差(真实年龄-预测年龄)^2的和/N,被预测出错的人数越多,错的越离谱,均方差就越大,通过最小化均方差能够找到最靠谱的分枝依据。分枝直到每个叶子节点上人的年龄都唯一(这太难了)或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不唯一,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄。
LR:产生一条决策边界来进行分类
决策树:将空间分成一堆小的矩形
用刀垂直于坐标轴砍,每次只能从新产生的空间砍,不能走回头路。
集成方法(ensemble method)通过组合多个基分类器(base classifier)来完成学习任务,基分类器一般采用的是弱可学习(weakly learnable)分类器,通过集成方法,组合成一个强可学习(strongly learnable)分类器。所谓弱可学习,是指学习的正确率仅略优于随机猜测的多项式学习算法;强可学习指正确率较高的多项式学习算法。集成学习的泛化能力一般比单一的基分类器要好,这是因为大部分基分类器都分类错误的概率远低于单一基分类器的。
集成方法主要包括Bagging和Boosting两种方法,Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法,即将弱分类器组装成强分类器的方法。
Bagging思想:每次从m个样本中抽取n个样本作为训练集,学习出T个弱学习器,之后得到一个集成的学习器,通过投票/ 平均的方法得到预测结果。
T个学习器之间没有联系
基学习器:CART决策树
构成方法:由多个决策树构成森林
生成方法:
随机性体现在两点:
随机森林的特性:
优点:
缺点:
随机森林是一种集成学习+决策树的分类模型,它可以利用集成的思想(投票选择的策略)来提升单颗决策树的分类性能(通俗来讲就是“三个臭皮匠,顶一个诸葛亮”)。
集集成学习和决策树于一身,随机森林算法具有众多的优点,其中最为重要的就是在随机森林算法中每棵树都尽最大程度的生长,并且没有剪枝过程。
随机森林引入了两个随机性——随机选择样本(bootstrap sample)和随机选择特征进行训练。两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。
不均衡样本点处理方法
Boosting的思路则是采用重赋权(re-weighting)法迭代地训练基分类器,主要思想:
每一轮的训练数据样本赋予一个权重,并且每一轮样本的权值分布依赖上一轮的分类结果。
基分类器之间采用序列式的线性加权方式进行组合。
分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类性能。
从上到下,从左到右进行
通过模型训练之后,对正负样本进行分类
第一步左下:将一个正的分为负的,两个负的分为了正的
每个样本初始化的时候都会赋予一个权值,将分错的样本的权重增大,分对的样本的权重进行减小,对权值进行均衡,中上的图就是权值改变程度
第二步中下:将三个负的分错了
增大这三个负样本的权值
迭代完成直到分类准确
每个学习器都有依赖于上一个学习器的结果进行权重的更新,也是boosting和bagging的最大的不同。
bagging和boosting区别
样本选择上:
样例权重:
Bagging:使用均匀取样,每个样例的权重相等。
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
预测函数:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
并行计算:
Bagging:各个预测函数可以并行生成。
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
Boosting和Bagging:
这两种方法都是把若干个分类器整合为一个分类器的方法,只是整合的方式不一样,最终得到不一样的效果,将不同的分类算法套入到此类算法框架中一定程度上会提高了原单一分类器的分类效果,但是也增大了计算量。
下面是将决策树与这些算法框架进行结合所得到的新的算法:
Bagging + 决策树 = 随机森林
AdaBoost + 决策树 = 提升树
Gradient Boosting + 决策树 = GBDT
AdaBoost是adaptive和boosting的缩写,训练过程:
对训练数据中的每个样本,都赋予一个相同的权重,构成权重向量D
在训练数据上训练出一个弱分类器,并计算该分类器的错误率
为了从所有的样本中得到最终的分类结果,为每个分类器都分配一个权值 α α ,权值是根据每个弱分类器的分类错误率计算的。
分类错误率: ξ=未正确分类的样本数目所有样本数目 ξ = 未 正 确 分 类 的 样 本 数 目 所 有 样 本 数 目
每个分类器的权值: α=12ln(1−ξξ) α = 1 2 l n ( 1 − ξ ξ )
计算得到当前的弱分类前的 α α 之后,对样本的权重向量D进行更新,将第一次预测错误的样本的权重增大,预测正确的样本权重减小
如果某个样本被正确分类,则其权值更改为: D(i+1)i=D(i)i⋅e−αSum(D) D i ( i + 1 ) = D i ( i ) ⋅ e − α S u m ( D )
如果某个样本被错误分类,则其权值更改为: D(i+1)i=D(i)i⋅eαSum(D) D i ( i + 1 ) = D i ( i ) ⋅ e α S u m ( D )
计算出新的D之后,进入下一轮迭代迭代训练分类器直到所有的样本分类均正确
重复经过T轮学习之后:
参数 | 输出 |
---|---|
获得T个弱分类器 | h1,h2,...,hT h 1 , h 2 , . . . , h T |
T个弱分类器的权值 | α1,α2,...,αT α 1 , α 2 , . . . , α T |
弱分类器分别的输出 | h1(X),h2(X),...,hT(X) h 1 ( X ) , h 2 ( X ) , . . . , h T ( X ) , |
Adaboost的的输出 | H(X)=sign(∑Ti=1αihi(X)) H ( X ) = s i g n ( ∑ i = 1 T α i h i ( X ) ) |
Adaboost:
利用不同的权重去学习决策函数,再由决策函数去更新权值,反复迭代,得到一系列的弱学习器g(x),这些弱学习器的效果都很弱,但是比随机猜的结果1/2要好一点,这些学习器有很大的不同,都有不同的参数。
g(x):
决策树是一种基本的分类与回归方法。决策树模型具有分类速度快,模型容易可视化的解释,但是同时是也有容易发生过拟合,虽然有剪枝,但也是差强人意。
提升方法(boosting)在分类问题中,它通过改变训练样本的权重(增加分错样本的权重,减小分对样本的的权重),学习多个分类器,并将这些分类器线性组合,提高分类器性能。boosting数学表示为:
其中: wm w m 为每个弱分类器的权重, ϕ ϕ 为弱分类器的集合,最终的强分类器其实就是弱分类器的线性组合。
Gradient Boosting(梯度提升)的思想:Gradient Boosting是一种Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向。损失函数是评价模型性能(一般为拟合程度+正则项),认为损失函数越小,性能越好。而让损失函数持续下降,就能使得模型不断改性提升性能,其最好的方法就是使损失函数沿着梯度方向下降(讲道理梯度方向上下降最快)。
Gradient Boost是一个框架,里面可以套入很多不同的算法。GBDT是GB的一种情况
GBDT=Gradient Boost+Decision Tree 也就是梯度提升+决策树
为什么梯度提升方法选择决策树作为基学习器?
决策树是if-then的规则集合,易于理解,可解释性强,预测速度快,同时相比其他算法所更少的特征工程,可以很好的处理字段缺失的数据,也可以不用关心特征间是否相互依赖,决策树能够自动组合多个特征。
单独使用决策树算法时,有容易过拟合缺点。所幸的是,通过各种方法,抑制决策树的复杂性,降低单颗决策树的拟合能力,再通过梯度提升的方法集成多个决策树,最终能够很好的解决过拟合的问题。由此可见,梯度提升方法和决策树学习算法可以互相取长补短,是一对完美的搭档。
如何抑制单颗决策树的过拟合:
gbdt 是通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或者回归的算法。
GBDT中的树是回归树(不是分类树),GBDT用来做回归预测,调整后也可以用于分类。
回归树总体流程类似于分类树,区别在于,回归树的每一个节点都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。
分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是最大熵,而是最小化平方误差。也就是被预测出错的人数越多,错的越离谱,平方误差就越大,通过最小化平方误差能够找到最可靠的分枝依据。分枝直到每个叶子节点上人的年龄都唯一或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不唯一,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄。
训练集只有4个人,A,B,C,D,他们的年龄分别是14,16,24,26。其中A、B分别是高一和高三学生;C,D分别是应届毕业生和工作两年的员工。现在我们使用GBDT来做这件事,由于数据太少,我们限定叶子节点做多有两个,即每棵树都只有一个分枝,并且限定只学两棵树。我们会得到如下图2所示结果:
在第一棵树分枝和图1一样,由于A,B年龄较为相近,C,D年龄较为相近,他们被分为两拨,每拨用平均年龄作为预测值。此时计算残差(残差的意思就是: A的预测值 + A的残差 = A的实际值),所以A的残差就是15-16=-1(注意,A的预测值是指前面所有树累加的和,这里前面只有一棵树所以直接是15,如果还有树则需要都累加起来作为A的预测值)。进而得到A,B,C,D的残差分别为-1,1,-1,1。然后我们拿残差替代A,B,C,D的原值,到第二棵树去学习,如果我们的预测值和它们的残差相等,则只需把第二棵树的结论累加到第一棵树上就能得到真实年龄了。这里的数据显然是我可以做的,第二棵树只有两个值1和-1,直接分成两个节点。此时所有人的残差都是0,即每个人都得到了真实的预测值。
那么哪里体现了Gradient呢?其实回到第一棵树结束时想一想,无论此时的cost function是什么,是均方差还是均差,只要它以误差作为衡量标准,残差向量(-1, 1, -1, 1)都是它的全局最优方向,这就是Gradient。
gbdt通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度。
弱分类器一般会选择为CART TREE(也就是分类回归树)。由于上述高偏差和简单的要求 每个分类回归树的深度不会很深。最终的总分类器 是将每轮训练得到的弱分类器加权求和得到的(也就是加法模型)。
gbdt 通过经验风险极小化来确定下一个弱分类器的参数。具体到损失函数本身的选择也就是L的选择,有平方损失函数,0-1损失函数,对数损失函数等等。如果我们选择平方损失函数,那么这个差值其实就是我们平常所说的残差。
但是其实我们真正关注的,1.是希望损失函数能够不断的减小,2.是希望损失函数能够尽可能快的减小。所以如何尽可能快的减小呢?
让损失函数沿着梯度方向的下降。这个就是gbdt 的 gb的核心了。 利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值去拟合一个回归树。gbdt 每轮迭代的时候,都去拟合损失函数在当前模型下的负梯度。
这样每轮训练的时候都能够让损失函数尽可能快的减小,尽快的收敛达到局部最优解或者全局最优解。
GBDT基函数为回归树,回归问题可以用平方损失函数,二分类问题可以用对数损失函数(逻辑回归的损失函数)。
1、GBDT概述
GBDT也是集成学习Boosting家族的成员,但是却和传统的Adaboost有很大的不同。回顾下Adaboost,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。
在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是 ft−1(x) f t − 1 ( x ) , 损失函数是 L(y,ft−1(x)) L ( y , f t − 1 ( x ) ) , 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器 ht(x) h t ( x ) ,让本轮的损失损失 L(y,ft(x)=L(y,ft−1(x)+ht(x)) L ( y , f t ( x ) = L ( y , f t − 1 ( x ) + h t ( x ) ) 最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。
GBDT的思想可以用一个通俗的例子解释,假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
2、GBDT的负梯度拟合
上一节中,我们介绍了GBDT的基本思路,但是没有解决损失函数拟合方法的问题。针对这个问题,大牛Freidman提出了用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树。第t轮的第i个样本的损失函数的负梯度表示为:
利用 (xi,rti)(i=1,2,..m) ( x i , r t i ) ( i = 1 , 2 , . . m ) ,我们可以拟合一颗CART回归树,得到了第t颗回归树,其对应的叶节点区域 Rtj,j=1,2,...,J R t j , j = 1 , 2 , . . . , J 。其中J为叶子节点的个数。
针对每一个叶子节点里的样本,我们求出使损失函数最小,也就是拟合叶子节点最好的的输出值 ctj c t j 如下:
这样我们就得到了本轮的决策树拟合函数如下:
从而本轮最终得到的强学习器的表达式如下:
通过损失函数的负梯度来拟合,我们找到了一种通用的拟合损失误差的办法,这样无轮是分类问题还是回归问题,我们通过其损失函数的负梯度的拟合,就可以用GBDT来解决我们的分类回归问题。区别仅仅在于损失函数不同导致的负梯度不同而已。
GBDT分类算法:
GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。
为了解决这个问题,主要有两个方法,一个是用指数损失函数,此时GBDT退化为Adaboost算法。另一种方法是用类似于逻辑回归的对数似然损失函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。
GBDT正则化:
和Adaboost一样,我们也需要对GBDT进行正则化,防止过拟合。GBDT的正则化主要有三种方式。
第一种是和Adaboost类似的正则化项,即步长(learning rate)。
第二种正则化的方式是通过子采样比例(subsample)。取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。
第三种是对于弱学习器即CART回归树进行正则化剪枝
优缺点:
GBDT主要的优点有:
1) 可以灵活处理各种类型的数据,包括连续值和离散值。
2) 在相对少的调参时间情况下,预测的准备率也可以比较高。这个是相对SVM来说的。
3)使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
GBDT的主要缺点有:
1)由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。
与AdaBoost算法不同,梯度提升方法在迭代的每一步构建一个能够沿着梯度最陡的方向降低损失(steepest-descent)的学习器来弥补已有模型的不足。
经典的AdaBoost算法只能处理采用指数损失函数的二分类学习任务2,而梯度提升方法通过设置不同的可微损失函数可以处理各类学习任务(多分类、回归、Ranking等),应用范围大大扩展。
另一方面,AdaBoost算法对异常点(outlier)比较敏感,而梯度提升算法通过引入bagging思想、加入正则项等方法能够有效地抵御训练数据中的噪音,具有更好的健壮性。
这也是为什么梯度提升算法(尤其是采用决策树作为弱学习器的GBDT算法)如此流行的原因,有种观点认为GBDT是性能最好的机器学习算法,这当然有点过于激进又固步自封的味道,但通常各类机器学习算法比赛的赢家们都非常青睐GBDT算法,由此可见该算法的实力不可小觑。
GBDT每一轮训练时所关注的重点是本轮产生结果的残差,下一轮以本轮残差作为输入,尽量去拟合这个残差,使下一轮输出的残差不断变小。所以GBDT可以做到每一轮一定向损失函数减小的梯度方向变化,而传统的boosting算法只能是尽量向梯度方向减小,这是GBDT与传统boosting算法最大的区别,这也是为什么GBDT相比传统boosting算法可以用更少的树个数与深度达到更好的效果。
和AdaBoost一样,Gradient Boosting也是重复选择一个表现一般的模型并且每次基于先前模型的表现进行调整。不同的是,AdaBoost是通过提升错分数据点的权重来定位模型的不足,而GBDT是通过算梯度来定位模型的不足。因此相比AdaBoost,GBDT可以使用更多种类的目标函数。
抽象地说,模型的训练过程是对一任意可导目标函数的优化过程,通过反复地选择一个指向负梯度方向的函数,该算法可被看作在函数空间里对目标函数进行优化。
回归问题
1) 用回归树去拟合残差,其实就是用回归树去拟合目标方程关于f(x)的梯度。
2) 回归的目标函数并不一定会用square loss。square loss的优点是便于理解和实现,缺点在于对于异常值它的鲁棒性较差,一个异常值造成的损失由于二次幂而被过分放大,会影响到最后得到模型在测试集上的表现。可以算则Absolute loss或者Huber loss代替。
分类问题
1) 此时的目标函数常用log loss,如KL-散度或者交叉熵。
2) 除了损失函数的区别外,分类问题和回归问题的区别还在于当多分类问题时,每轮可能会训练多个分类器。
由于决策树是非线性的,并且随着深度的加深,非线性越来越强,所以基于决策树的GBDT也是非线性的。
Xgboost是GB算法的高效实现,xgboost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear)。下面所有的内容来自原始paper,包括公式。
Xgboost的分裂节点:
1、枚举所有不同树结构的贪心法
确定最优分裂属性,最简单的就是枚举法,选择loss function 最好的那个属性。
如何求得最小的损失函数,即二次函数的求导来解决,选择当前损失最小的属性进行分裂,分裂之后再选择损失函数最小的属性,直到把属性用完。
不断地枚举不同树的结构,利用这个打分函数Obj来寻找出一个最优结构的树,加入到我们的模型中,再重复这样的操作。不过枚举所有树结构这个操作不太可行,所以常用的方法是贪心法,每一次尝试去对已有的叶子加入一个分割。对于一个具体的分割方案,我们可以获得的增益可以由如下公式计算。
在分裂的时候,你可以注意到,每次节点分裂,loss function被影响的只有这个节点的样本,因而每次分裂,计算分裂的增益(loss function的降低量)只需要关注打算分裂的那个节点的样本。
2、近似算法
主要针对数据太大,不能直接计算,算出近似的最大得分函数
Shrinkage:
Shrinkage(缩减)的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。本质上,Shrinkage为每棵树设置了一个weight,累加时要乘以这个weight,但和Gradient并没有关系。
如果某个样本label数值为4,那么第一个回归树预测3,第二个预测为1; 另外一组回归树,一个预测2,一个预测2,那么倾向后一种,为什么呢?前一种情况,第一棵树学的太多,太接近4,也就意味着有较大的过拟合的风险。
1、回归树的参数:
2、优化策略=贪心+最优化
贪心策略:决策时刻按照当前目标最优化决定,说白了就是眼前利益最大化,最小化损失函数
二次优化问题:但是损失函数不是二次函数怎么办?——利益泰勒二次展开,不是二次的想办法近似为二次的
3、属性的选择
确定最优分裂属性,最简单的就是枚举法,选择loss function 最好的那个属性。
每次节点分裂,损失函数被影响的只有这个节点的样本,因而每次分裂之后,计算分裂的增益只需要关注打算分裂的那个节点的样本即可。
4、继续分裂
按照上述的方式,形成一棵树,再形成一棵树,每次在上一次的预测基础上取最优进一步分裂/建树,是不是贪心策略?
5、循环迭代的停止条件
当引入的分裂带来的增益小于一个阀值的时候,我们可以剪掉这个分裂,所以并不是每一次分裂loss function整体都会增加的,有点预剪枝的意思,阈值参数为(即正则项里叶子节点数T的系数);
当树达到最大深度时则停止建立决策树,设置一个超参数max_depth,避免树太深导致学习局部样本,从而过拟合;
当样本权重和小于设定阈值时则停止建树,这个解释一下,涉及到一个超参数-最小的样本权重和min_child_weight,和GBM的 min_child_leaf 参数类似,但不完全一样,大意就是一个叶子节点样本太少了,也终止同样是过拟合;
树的最大数量达到之后停止迭代
1)GBDT特指梯度提升决策树算法,以CART为基学习器,而XGBoost中的基学习器也可以是线性分类器,此时的XGBoost相当于带有L1和L2正则项的Logistic回归(分类问题)或者线性回归(回归问题);
2)GBDT在迭代优化中只使用了一阶导数信息,而XGBoost对损失函数进行泰勒展开的二阶近似,既用到了一阶导信息,也用到了二阶导信息;并且XGBoost还支持自定的可一阶导和二阶导的损失函数;
3)XGBoost显式地将树模型的复杂度(即,夜间点的个数和每个叶节点上的权值平方和)作为正则项加入目标函数,以降低模型的方差(variance),使其学习出来的模型更加简单,防止过拟合;
4)XGBoost寻找最佳分割点时,考虑到传统的贪心法效率较低,实现了一种分裂节点近似算法,用于加速和减小内存消耗,除此之外还考虑了稀疏数据集、缺失值的处理(对于特征的值有缺失的样本,XGBoost可以自动学习出它的分裂方向),大大提升算法的效率;
5)XGBoost借用了随机森林的思想,允许使用列抽样(column sampling)来防止过拟合,并且可以减少计算量
6)XGBoost支持分布式并行计算。XGBoost的并行不是tree粒度的并行,而是在特征粒度上的并行。决策树的学习因为要寻找最佳分裂点,最耗时的一步是对特征的值进行排序,XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,在后面的迭代中重复使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。 可并行的近似直方图算法,树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。
根据原始的数据训练m个分类器,未进行抽取,训练都用的是原始的数据集,加上一些新的数据进行预测,最终达到一个较好的分类结果。