LASSO回归,Ridge回归,Elastic Net
(1) 范数正则化(Ridge Regression,岭回归)
(2)范数正则化(LASSO)
(3)正则项
正则项结合(Elastic Net)
而范数正则化比
范数更易获得“稀疏”解,即
范数正则化求得的
会有更少的非零分量,所以
范数可用于特征选择,而
范数在参数规则化时经常用到
决策树
What?
从根节点开始一步步走到叶子节点。
如何切分特征?
目标:找出一种衡量标准,来计算通过不同特征进行分支选择后的分类情况,找出最好的那个来当成根节点,以此类推。
衡量标准:
熵:
熵是表示随机变量不确定的度量。(物体内部的混乱程度)混乱程度越高,熵值越高。
公式:
分支过程中优先考虑熵值低的。
信息增益(ID3算法):
表示特征x使得类Y的不确定性减少的程度。
信息增益率(C4.5):
CART:
使用GINI系数来当做衡量标准
GINI系数:
决策树的剪枝策略:
WHY?为什么要枝剪?
决策树过拟合风险很大,理论上可以完全把一棵树分完。
HOW?
剪枝策略:预剪枝,后剪枝
预剪枝:边建立树边进行剪枝的操作。
后剪枝:建立后进行剪枝。
预剪枝:1.限制深度。2.叶子节点个数。3.叶子节点样本数 4.信息增益量
后剪枝:通过一定的衡量标准:
剪枝前的状态:有|Tt|个叶子节点,预测误差是C(Tt)
剪枝后的状态:只有本身一个叶子节点,预测误差是C(t)
因此剪枝前的以t节点为根节点的子树的损失函数是
Cα(Tt)=C(Tt)+α|Tt|
Bagging
Bagging是一种在原始数据集上通过有放回抽样重新选出k个新数据集来训练分类器的集成技术。它使用训练出来的分类器的集合来对新样本进行分类,然后用多数投票或者对输出求均值的方法统计所有分类器的分类结果,结果最高的类别即为最终标签。此类算法可以有效降低bias,并能够降低variance。
随机森林
CART树
随机森林的弱分类器使用的是CART数,CART决策树又称分类回归树。当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很好的解决分类问题。
Boosting
Boosting方法思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。(三个臭皮匠定个诸葛亮)。
对于Boosting算法来说,有两个问题需要回答:一是,每一轮如何改变训练数据的权重或者概率分布;二是,如何将弱分类器组合成一个强分类器。
AdaBoost算法
关于上述第一个问题,AdaBoost的做法是,提高那些被前一轮弱分类器错误分类的权值,而降低那些被正确分类样本的权值。这样一来那些没有得到正确分类的数据,由于其权值的加大而受到后一轮的弱分类器的更大关注。 第二个问题,AdaBoost采用了多数表决的方法。具体地,加大误差率较小的分类器的弱分类器权值,使得它在表决中起较大的作用, 减小分类误差大的弱分类器的权值,使其在表决中起较小的作用。
GBDT(Gradient Boosting Decision Tree)
WHAT?
是一种迭代的决策树算法,它又可以简称为MART(Multiple Additive Regression Tree)或GBRT(Gradient Boosting Regression Tree)。该算法由多棵决策树组成,所有树的结论累加起来做最终答案。
GBDT主要由三个概念组成:Regression Decistion Tree(即DT),Gradient Boosting(即GB),Shrinkage (算法的一个重要演进分枝,目前大部分源码都按该版本实现)。
DT:回归树 Regression Decision Tree
千万不要以为GBDT是很多棵分类树。决策树分为两大类,回归树和分类树。前者用于预测实数值,如明天的温度、用户的年龄、网页的相关程度;后者用于分类标签值,如晴天/阴天/雾/雨、用户性别、网页是否是垃圾页面。这里要强调的是,前者的结果加减是有意义的,如10岁+5岁-3岁=12岁,后者则无意义,如男+男+女=到底是男是女?而分类树的结果显然是没办法累加的,所以GBDT中的树都是回归树,不是分类树。
作为对比,简要回顾下分类树的运行过程:以ID3为例,穷举每一个属性特征的信息增益值,每一次都选取使信息增益最大的特征进行分枝,直到分类完成或达到预设的终止条件,实现决策树的递归构建。
回归树的运行流程与分类树基本类似,但有以下两点不同之处:
- 第一,回归树的每个节点得到的是一个预测值而非分类树式的样本计数,假设在某一棵树的某一节点使用了年龄进行分枝(并假设在该节点上人数>1),那么这个预测值就是属于这个节点的所有人年龄的平均值。
一般来讲,回归树的分枝不太可能实现每个叶子节点上的属性值都唯一,更多的是达到我们预设的终止条件即可(例如叶子个数上限),这样势必会存在多个属性取值,那么该节点处的预测值自然就为基于这些样本所得到的平均值了。
- 第二,在分枝节点的选取上,回归树并没有选用最大熵值来作为划分标准,而是使用了最小化均方差,即
。这很好理解,被预测出错的次数越多,错的越离谱,均方差就越大,通过最小化均方差也就能够找到最靠谱的分枝依据。
二、GBDT之GB——梯度提升
首先需要明确,GB本身是一种理念而非一个具体的算法,其基本思想为:沿着梯度方向,构造一系列的弱分类器函数,并以一定权重组合起来,形成最终决策的强分类器。
每一棵树所学习的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。
举一个简单的例子,同样使用年龄进行分枝,假设我们A的真实年龄是18岁,但第一棵树的预测年龄是12岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁……以此类推学习下去,这就是梯度提升在GBDT算法中的直观意义。
三、 GBDT工作过程实例。
还是年龄预测,简单起见训练集只有4个人,A,B,C,D,他们的年龄分别是14,16,24,26。其中A、B分别是高一和高三学生;C,D分别是应届毕业生和工作两年的员工。如果是用一棵传统的回归决策树来训练,会得到如下图1所示结果:
现在我们使用GBDT来做这件事,由于数据太少,我们限定叶子节点做多有两个,即每棵树都只有一个分枝,并且限定只学两棵树。我们会得到如下图2所示结果:
在第一棵树分枝和图1一样,由于A,B年龄较为相近,C,D年龄较为相近,他们被分为两拨,每拨用平均年龄作为预测值。此时计算残差(残差的意思就是: A的预测值 + A的残差 = A的实际值),所以A的残差就是16-15=1(注意,A的预测值是指前面所有树累加的和,这里前面只有一棵树所以直接是15,如果还有树则需要都累加起来作为A的预测值)。进而得到A,B,C,D的残差分别为-1,1,-1,1。然后我们拿残差替代A,B,C,D的原值,到第二棵树去学习,如果我们的预测值和它们的残差相等,则只需把第二棵树的结论累加到第一棵树上就能得到真实年龄了。这里的数据显然是我可以做的,第二棵树只有两个值1和-1,直接分成两个节点。此时所有人的残差都是0,即每个人都得到了真实的预测值。
XGBoost
回归树的介绍(基础学习模型)
概述
回归树,也叫做分类与回归树,我认为就是一个叶子节点具有权重的二叉决策树。它具有以下两点特征
- 决策规则与决策树的一样
- 每个叶子节点上都包含了一个权重,也有人叫做分数
下图就是一个回归树的示例:
回归树有以下四个优点:
1. 使用范围广,像GBM,随机森林等。(PS:据陈天奇大神的统计,至少有超过半数的竞赛优胜者的解决方案都是用回归树的变种)
2. 对于输入范围不敏感。所以并不需要对输入归一化
3. 能学习特征之间更高级别的相互关系
4. 很容易对其扩展
模型
假设我们有KK棵树,那么
上式中F表示的是回归森林中的所有函数空间。fk(xi)表示的就是第ii个样本在第k棵树中落在的叶子的权重。以下图为例
可见小男孩落在第一棵树的最左叶子和第二棵树的最左叶子,所以它的得分就是这两片叶子的权重之和,其余也同理。
那么现在我们需要求的参数就是每棵树的结构和每片叶子的权重,或者简单的来说就是求fkfk。那么为了和上一节所说的通用结构统一,可以设
如果我们只看一棵回归树,那么它可以绘成分段函数如下
可见分段函数的分割点就是回归树的非叶子节点,分段函数每一段的高度就是回归树叶子的权重。那么就可以直观地看到欠拟合和过拟合曲线所对应的回归树的结构。根据我们上一节的讨论,Ω(f)表示模型复杂度,那么在这里就对应着分段函数的琐碎程度。L(f)表示的就是函数曲线和训练集的匹配程度。
综上所述,我们可以得出该模型的表达式如下
训练时的目标函数
训练误差如下
模型复杂度如下
因此,训练时的目标函数如下
如果训练误差
对于Ω(fk)来说,可以用树的节点个数,树的深度,树叶权重的L2范数等等来进行描述。
参数
于是现在未知的就是fkfk,这就是我们下一节所要解决的问题
Θ={f1,f2,f3,⋅⋅⋅,fk}Θ={f1,f2,f3,⋅⋅⋅,fk}
Gradient Boosting(如何构造回归树)
上一节说明来回归树长啥样,也就是我们的模型最后长啥样。但是该模型应该怎么去求出ΘΘ呢?这一节就介绍两种算法,一种是贪心算法,一种是近似算法。
贪心算法
完善目标函数的定义
这个算法的思想很简单,一棵树一棵树地往上加,一直到KK棵树停止。过程可以用下式表达:
XGBoost是Gradient Boosting的高效实现。
XGBoost最大的特点在于它能够自动利用CPU的多线程进行并行计算,同时在算法上加以改进提高了精度。
目标函数:损失与正则
在监督学习中,我们通常会构造一个目标函数和一个预测函数,使用训练样本对目标函数最小化学习到相关的参数,然后用预测函数和训练样本得到的参数来对未知的样本进行分类的标注或者数值的预测。在XGBoost中,目标函数的形式为:
:损失函数,常用损失函数有:
XGBoost的推导过程
1. 目标函数的迭代与泰勒展开
- 平方损失:
- Logistic损失:
由于之前已经学习过树的生成及集成方法,这里不再赘述。首先,我们可以把某一次迭代后集成的模型表示为:
相对应的目标函数:
将这两个公式进行扩展,应用在前轮的模型迭代中,具体表示为:
就是前
轮的模型预测,
为新
轮加入的预测函数。
这里自然就涉及一个问题:如何选择在每一轮中加入的呢?答案很直接,选取的
必须使得我们的目标函数尽量最大地降低(这里应用到了Boosting的基本思想,即当前的基学习器重点关注以前所有学习器犯错误的那些数据样本,以此来达到提升的效果)。先对目标函数进行改写,表示如下:
如果我们考虑使用平方误差作为损失函数,公式可改写为:
更加一般的,对于不是平方误差的情况,我们可以采用如下的泰勒展开近似来定义一个近似的目标函数,方便我们进行这一步的计算。
泰勒展开:
其中,
很明显,上式中后面那项对于该目标函数我们求最优值点的时候并无影响,所以,现在可把优化函数写为
现在我们对其进行数学公式化。设w∈RT,w为树叶的权重序列,
q为树的结构。那么q(x)表示的就是样本x所落在树叶的位置。可以用下图形象地表示
于是ft(x)可以用下式进行表示
现在对训练误差部分的定义已经完成。那么对模型的复杂度应该怎么定义呢?
树的深度?最小叶子权重?叶子个数?叶子权重的平滑程度?等等有许多选项都可以描述该模型的复杂度。为了方便,现在用叶子的个数和叶子权重的平滑程度来描述模型的复杂度。可以得到下式:
上式中前一项用叶子的个数乘以一个收缩系数,后一项用L2范数来表示叶子权重的平滑程度。下图就是计算复杂度的一个示例:
好了,最后把优化函数重新按照每个叶子组合,并舍弃常数项: