提升算法
一.什么是提升
1. 偏差和方差
我们给定一个数据D,自变量x对应的真实值为y(x),根据模型预测值的结果为为 h θ ( x , D ) h_{\theta}(x,D) hθ(x,D)
我们使用平方误差作为目标函数,则目标函数就是: E D [ y ( x ) − h θ ( x , D ) ] 2 E_{D}[y(x) - h_{\theta}(x,D)]^2 ED[y(x)−hθ(x,D)]2
我们把上一个式子进行拆解,就得到了方差和偏差。
那么这两者有和区别呢?
偏差:描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,越偏离真实数据。
方差:描述的是预测值的变化范围,离散程度,也就是离其期望值的距离。方差越大,数据的分布越分散
Bagging能够减少训练方差,对于不剪枝的决策树、神经网络等学习器有良好的集成效果;
Boosting减少偏差,能够基于泛化能力较弱的学习器构造强学习器。
2.提升的概念
提升这个词,是建立在决策树的基础上的。而随机森林的决策树是通过Bagging策略分别进行采样并建立的,各个树之间相对独立。为了提升分类的性能,将分类能力较弱的模型,通过一系列手段,变为分类能力较强的模型,是否有这种可能呢?假定当前已经得到了m-1颗决策树,是否可以通过现有样本和决策树的信息,对第m颗决策树的建立产生有益的影响呢?各个决策树组成随机森林后,最后的分类过程可否在建立决策树时即确定呢?
针对以上这些问题,有人想到了:加权。我们在当前的模型基础上,进行一定程度的加权,是否就可以把弱分类器的泛化功能得到进一步的加强呢?当前已经得到了m-1颗决策树,通过加权的方式,能否让第m棵决策树的建立效果更好呢?在这种情况下,提升的概念就被引出来了。
实际上,提升不仅仅用于决策树,它的思想可以用在很多场景,提升的定义如下:
提升:是一个机器学习技术,可以用于回归和分类问题(是回归还是分类,取决于损失函数是什么),它每一步产生一个弱预测模型(如决策树),并加权累加到总模型中
3. 提升的基本数学理论
如果每一步的弱预测模型生成都是依据损失函数的梯度方向,则称之为梯度提升(Gradient boosting)。乍一听,和回归算法当中的梯度下降法还真是有很多相似支出。
- 首先我们得知道损失函数具体是什么。这个损失函数的定义域是所有可行的弱函数集合(基函数)。
- 我们通过求梯度的方式,进行迭代计算,找到一个负梯度方向上的基函数来逐渐逼近局部极小值。
具体落实到理论,我们做如下假设:
我们给定输入向量x和输出变量y组成的若干训练样本(x1 , y1 ),(x2 ,y2 ),…,(xn , yn )。我们的目标就是找到近似函数 F ^ ( x → ) \hat{F}(\overrightarrow{x}) F^(x),使得损失函数L(y, F(x))最小。
L(y, F(x))的定义不止一种,有两种常见的定义:
那么最优函数就是:
如果L函数取的是带平方的那个,我们称之为平方误差,那么预测值就是期望,
如果用的是第二个定义(带绝对值的那个),我们叫它:绝对值误差。假如此时F(x)是一个常数,且这个常数取y1,y2, y3 ……的中位数时,是绝对最小最优解,在这个时候,我们认为F(x)是一组基函数fi(x)的加权和,即:
那么,为什么F(x)取y的中位数时,就是绝对最小最优解呢?我们做如下证明:
首先,我们给定样本x1, x2, x3 ……,xn,我们计算:
μ ∗ = a r g m i n ∑ i = 1 n ∣ x i − μ ∣ \mu* = argmin \sum_{i=1}^{n}|x_{i} - \mu| μ∗=argmin∑i=1n∣xi−μ∣
为了方便计算,我们假定x1到xn是递增排序的,于是,我们可以构造一个函数:
我们之后求偏导:
可见,只有k取到中间的数,也就是中位数的时候,上面这个式子才能为0.所以,取中位数
4. 提升算法推导
梯度提升方法寻找最优解F(x),使得损失函数在训练集上的期望最小,一个重要的思想就是:贪心
首先,给定一个常函数,这个也是贪心算法和迭代的起点:
我们按照贪心的思想进行拓展,拓展到第m个函数:
在实际操作中,每次用贪心,其实并不具有多少可行性,于是,老生常谈的方法就被提了出来:梯度下降
将样本带入基函数f得到f(x1),f(x2),…,f(xn),从而,L退化为向量L(y1 , f(x1)),L(y2 ,f(x2)),…,L(yn ,f(xn)),于是我们就有了:
其中,γ为梯度下降的步长,这是一个超参数,可以手动指定,也可以使用线性搜索的方式求最优步长:
5. 如何操作呢?
以上给出了提升的相关理论和算法的推导,但是,在计算机当中,我们肯定不能直接使用这么一大长串的式子。在计算机中,通常用一个循环来模拟迭代的过程如下:
-
首先,给定初始模型常函数F0(x)
-
对于m=1到M:
- 计算伪残差:
其中i=1,2,3 ……n。这个L,是基于平方差进行计算的。即:
L ( F ( x i ) ) = 1 m