提升 (boosting) 方法是一种常用的统计学习方法,应用广泛且有效,在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类器性能。
我们知道随机森林的决策树分别采样建立, 相对独立。 那么引来了如下思考 :
答案是肯定的,这也就是提升(boosting)的方法所解决的问题。
提升是一个机器学习技术, 可以用于回归和分类问题, 它每一步产生一个弱预测模型(如决策树), 并加权累加到总模型中,最终得带一个强预测模型; 如果每一步的弱预测模型生成都是依据损失函数的梯度方向, 则称之为梯度提升(Gradient boosting)。
提升的方法基于这样一个思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。实际上,就是“三个臭皮匠顶个诸葛亮”的道理。
梯度提升算法首先给定一个目标损失函数, 它的定义域是所有可行的弱函数集合(基函数); 提升算法通过迭代的选择一个负梯度方向上的基函数来逐渐逼近局部极小值。这种在函数域的梯度提升观点对机器学习的很多领域有深刻影响。
梯度提升算法实际上和梯度下降算法是一样的,只不过看问题的角度不同,比如在线性回归中,我们通过梯度下降来优化参数 ,使损失函数能达到(局部)最小值;如果我们换个角度,我们优化的不是 ,而是 这个函数,再通过沿梯度方向下降的方法达到损失函数(局部)最小值,就变成了梯度提升算法。
给定输入向量 和输出变量 组成的若干训练样本 , 目标是找到近似函数 , 使得损失函数 的损失值最小。
损失函数 的定义不唯一,典型定义有以下两种:
假设最优解为 ,则:
该式的意思就是使损失函数期望风险最小化的参数 为最优解 。
我们知道任何函数都可以被分解为一族基函数的线性组合,比如傅立叶分解可以把任何函数分解为三角函数的线性组合,所以这里的 也不例外,我们假设它是一族基函数 的线性组合,即:
算法推导
我们使用梯度提升方法寻找最优解 , 使得损失函数在训练集上的期望最小。方法如下:
首先, 令 ,求常系数 :
提升算法
在提升算法中,如果基函数选择的是决策树,那么算法又叫梯度提升决策树,也就是GBDT。
GBDT
令树 的叶节点数目为 , 即树 将输入空间划分为 个不相交区域 ,并且决策树 可以在每个区域中给出某个类型的确定性预测。使用指示记号 , 对于输入 , 为:
其中, 是样本 在区域 的预测值,
使用线性搜索计算学习率,最小化损失函树
参数设置和正则化
对训练集拟合过高会降低模型的泛化能力, 需要使用正则化技术来降低过拟合。
GBDT总结
普通提升算法包括GBDT在计算上式实采用的是梯度提升,也就是只用了一阶导数信息,如果常识二阶导数的信息呢?
目标函数:
其中, 为正则项, 为常数,目的是要求出使目标函数最小的 。
二阶Taylor展式:
令:
对 二阶Taylor展开并省略高阶无穷小得:
决策树的描述
- 使用决策树对样本做分类(回归),是从根结点到叶节点的细化过程;落在相同叶节点的样本的预测值是相同的
- 假定某决策树的叶结点数目为 ,每个叶结点的权值为 ,决策树的学习过程,就是构造如何使用特征得到划分,从而得到这些权值的过程。叶权值就是这个叶节点的预测结果,若是分类问题,也就是这类样本的标签。
- 样本 落在叶结点 中,定义描述决策树函数为:
- 一个决策树的核心即“树结构”和“叶权值”
决策树的复杂度可考虑叶结点数和叶权值,如使用叶结点总数和叶权值平方和的加权:
我们继续来推导目标函数 :
令 ,,从而:
对 求偏导得:
令 ,得:
回代入目标函数得:
这就是目标函数最后的结果,值越小代表决策树的结构越好。
我们要构建一颗决策树 ,使目标函数 达到最小,构建时可借鉴ID3/C4.5/CART的做法:
XGBOOST总结
思考:如果对GBDT的基函数的学习中,不止考虑函数的参数和权值,而是对样本本身也加权,会得到什么结果呢?这其实就是Adaboost的思想。
AdaBoost算法
设训练数据集 ,初始化训练数据的权值分布 , , 。
对于 , 为树的棵数:
使用具有权值分布 的训练数据集学习, 得到基本分类器
计算 在训练数据集上的分类误差率:
计算 的系数
更新训练数据集的权值分布
构建基本分类器的线性组合
得到最终分类器:
算法解释
我们先分析 的系数:,这里的 是分类错误率。
这个式子实现了这么一个理论:如果一个分类器的分类错误率超过50%,那么这个分类器还不如随机分类(默认均匀分布,随机分50%错误率)来得好,把这个分类器直接反转效果反而会更好。
再来看权值更新公式,
是用来归一化的,不用看,把其他部分合起来:
结论:如果分类器预测错了则增加该样本的权值,在下次分类时重点关注该样本;如果分类正确则降低该样本的权值,在下次分类时弱化该样本。也就是样本的权值动态变化,如下图所示:
AdaBoost算法最终的误差界为:
证明
后半部分:
由 的定义式得:
后半部分得证
这一结果说明,可以在每一轮选取适当的 使得 最小,从而使训练误差下降最快。
训练误差界
因为 ,,
所以
由此得到:
取 的最小值,记为 ,
则有:
这表明AdaBoost训练误差是以指数速率下降的!
AdaBoost总结