对于任意Boosting算法,我们都需要明确以下几点:
- 损失函数L(x,y)L(x,y)L(x,y)的表达式是什么?损失函数如何影响模型构建?
- 弱评估器f(x)f(x)f(x) 是什么,当下boosting算法使用的具体建树过程是什么?
- 综合集成结果H(x)H(x)H(x)是什么?集成算法具体如何输出集成结果?
同时,还可能存在其他需要明确的问题,例如:
- 是加权求和吗?如果是,加权求和中的权重如何求解?
- 训练过程中,拟合的数据XXX与yyy分别是什么?
- 模型训练到什么时候停下来最好?
同时,别忘记boosting算法的基本规则:
并使用L(x,y)L(x,y)L(x,y)自适应地影响下一个弱评估器f(x)tf(x)_tf(x)t的构建。
集成模型输出的结果,受到整体所有弱评估器f(x)0f(x)_0f(x)0 ~ f(x)Tf(x)_Tf(x)T的影响。
AdaBoost.R2算法是当前AdaBoost实现流程中使用最多的回归类实践方式,它囊括了对数据进行有放回抽样、按损失函数结果调整样本权重、自动计算弱分类器权重、并输出预测结果等AdaBoost算法经典的全流程。
假设现有数据集N,含有样本MMM个,任意样本编号为iii,同时,弱评估器为决策树fff,总共学习TTT轮,则AdaBoost.R2的基本流程如下所示:
- 初始化原始数据集的权重wiw_iwi,其中任意wi=1Mw_i = \frac{1}{M}wi=M1
开始循环,for t in 1,2,…T:
- 在现有数据集NNN中,有放回抽样MMM个样本,构成训练集NtN^tNt。在每次抽取一个样本时,任意样本被抽中的概率为Pit=wi∑wiP_i^t = \frac{w_i}{\sum w_i}Pit=∑wiwi,很显然,该概率就是当前样本在训练集NtN^tNt中的权重。当从初始权重中抽样时,概率Pi1=1MP_i^1 = \frac{1}{M}Pi1=M1,当后续权重变化时,拥有更大权重的样本被抽中的概率会更大。
- 在训练集NtN^tNt上按照CART树规则建立一棵回归树ftf^tft,训练时所拟合的标签为样本的真实标签yity^t_iyit。
- 将NtN^tNt上所有的样本输入ftf^tft进行预测,得出预测结果ft(xi)f^t(x_i)ft(xi),其中i = 1,2,…M。
- 计算单一样本iii上的损失函数Lit=L(ft(xi),yi)L^t_i = L(f^t(x_i),y_i)Lit=L(ft(xi),yi),计算过程如下所示:
D=sup∣ft(xi)−yi∣,i=1,2,...,ND = sup|f^t(x_i) - y_i|, i = 1,2,...,ND=sup∣ft(xi)−yi∣,i=1,2,...,N
D为训练集上的最大误差。
- 计算每个样本的相对误差:LitL^t_iLit,值域都在[0,1]之间
线性损失:Li=∣ft(xi)−yi∣D线性损失:L_i = \frac{|f^t(x_i) - y_i|}{D}线性损失:Li=D∣ft(xi)−yi∣
平方损失:Li=∣ft(xi)−yi∣2D2平方损失:L_i = \frac{|f^t(x_i) - y_i|^2}{D^2}平方损失:Li=D2∣ft(xi)−yi∣2
指数损失:Li=1−exp(−∣ft(xi)−yi∣D)指数损失:L_i = 1 - exp \left( \frac{-|f^t(x_i) - y_i|}{D} \right)指数损失:Li=1−exp(D−∣ft(xi)−yi∣)
- 计算全样本上的加权平均损失:
Ltˉ=∑i=1MLitPit\bar{L^t} = \sum_{i=1}^ML_i^tP_i^tLtˉ=i=1∑MLitPit
其中,PitP_i^tPit就等于样本的权重。由于Pit=wi∑wiP_i^t = \frac{w_i}{\sum w_i}Pit=∑wiwi,所以PitP_i^tPit一定位于[0,1]范围内(当样本量比较大时,PitP_i^tPit远远小于1),并且∑Pit,i=1,2,...M\sum{P_i^t}, i=1,2,...M∑Pit,i=1,2,...M一定为1。
当权重之和为1时,加权平均值一定会小于等于单一数值的最大值(同时大于等于单一数值的最小值),因此加权平均的值域不会超出单一平均数的值域。
例如:当L=[10,20,5],P=[0,1,0],LP最大且为20;当[0,0,1],LP最小且为5。
由于所有损失的值域都是[0,1],因此加权平均值Ltˉ\bar{L^t}Ltˉ的值域也是[0,1]。同时,由于损失的最大值为1,而权重PitP_i^tPit的最大值一定是远远小于1的,因此加权平均值Ltˉ\bar{L^t}Ltˉ的最大值一般也是远远小于1的。
- 依据加权平均损失Ltˉ\bar{L^t}Ltˉ计算衡量当前集成算法的置信度βt\beta^tβt:
βt=Ltˉ1−Ltˉ+λ\beta^t = \frac{\bar{L^t}}{1-\bar{L^t} + \lambda}βt=1−Ltˉ+λLtˉ
其中λ\lambdaλ是为了防止分母为0的常数
不难发现,当加权平平均损失很高时,βt\beta^tβt很大,因此置信度小,当加权平均损失很低时,βt\beta^tβt很小,因此置信度大。置信度越大,集成算法当前的预测结果越好。
已知Ltˉ\bar{L^t}Ltˉ的理论值域是[0,1],因此βt\beta^tβt的理论值域是[0,+∞+\infty+∞],因此βt\beta_tβt的值越接近0越好。
同时,我们还知道Ltˉ\bar{L^t}Ltˉ的实际范围大约都在0.2~0.3之间,因此一般来说βt\beta^tβt的实际范围基本都是小于1的。
- 依据置信度评估βt\beta_tβt更新样本权重:
wi=wiβ(1−Li)w_i = w_i\beta^{(1-L_i)}wi=wiβ(1−Li)
我们可以根据LiL_iLi的范围[0,1],以及β\betaβ的计算公式,绘制出横坐标为LiL_iLi,纵坐标为β(1−Li)\beta^{(1-L_i)}β(1−Li)的图像。不难发现,单一样本的损失越大、β(1−Li)\beta^{(1-L_i)}β(1−Li)也会越大,因此该样本的权重会被更新得越大。
- 求解迭代过程中弱分类器ftf^tft所需的权重:
ϕt=log(1βt)\phi^t = log(\frac{1}{\beta^t})ϕt=log(βt1)
其中log的底数为e或者为2皆可。当β\betaβ值越接近于0,说明损失越小、置信度越高,则log(1βt)log(\frac{1}{\beta^t})log(βt1)的值越大。所以,损失更小的树对应的权重更大,损失更大的树对应的权重更小。
- 求解出当前迭代ttt下集成算法的输出值:
Ht(xi)=Ht−1(xi)+ηϕtft(xi)H^t(x_i) = H^{t-1}(x_i) + \eta \phi^t f^t(x_i)Ht(xi)=Ht−1(xi)+ηϕtft(xi)
其中η\etaη为学习率。
- Adaboost如何做提前停止?
在步骤2~10中循环,直到迭代次数被使用完毕。理想上来说,Adaboost至少应该迭代到TTT次以满足下列条件:
(∑t:Ht(x)≤ylog1βt) ≥ (12∑t=1Tlog1βt)\left(\sum_{t:H^t(x) \leq y} log\frac{1}{\beta^t} \right)\ \ \geq \ \ \left(\frac{1}{2}\sum_{t=1}^T log\frac{1}{\beta^t} \right)⎝⎛t:Ht(x)≤y∑logβt1⎠⎞ ≥ (21t=1∑Tlogβt1)
等同于:
(∑t:Ht(x)≤yϕt) ≥ (12∑t=1Tϕt)\left(\sum_{t:H^t(x) \leq y} \phi^t \right)\ \ \geq \ \ \left(\frac{1}{2}\sum_{t=1}^T \phi^t \right)⎝⎛t:Ht(x)≤y∑ϕt⎠⎞ ≥ (21t=1∑Tϕt)
并且,最终算法的输出值是上述等式满足“等于”条件时所对应的Ht(x)H^t(x)Ht(x)。对于一个正常迭代的AdaBoost来说,每一轮迭代后获得的H(xi)H(x_i)H(xi)都是累加结果,因此H(xi)H(x_i)H(xi)之间应该满足以下关系:
H0(xi)<H1(xi)<,...,<HT(xi)H^0(x_i) < H^1(x_i) <, ... , < H^T(x_i)H0(xi)<H1(xi)<,...,<HT(xi)
在H0(xi)H^0(x_i)H0(xi)到HT(xi)H^T(x_i)HT(xi)过程中,必然只有部分H(xi)H(x_i)H(xi)是小于真实标签yiy_iyi的,假设有ttt次迭代中H(xi)H(x_i)H(xi)都小于yiy_iyi,则理想状况下,前ttt次迭代中权重的累加,应该大于0.5 * 所有TTT次迭代中权重的累加。当两者相等时,t就是最佳迭代次数,而ttt对应的Ht(x)H^t(x)Ht(x)也就是最佳预测值。