7 Blending and Bagging
之前都是通过特征转换达到更好的分类目的,而有另一种思路就是将多个模型的分数线性组合起来以期得到更好的效果。它们的权重应为x的函数,这样能包含投票、取最大等多种情况。
本节从理论上探讨了blend的可行性:
G(x)=1T∑Tt=1gt(x)
则:
avg((gt−f)2)=avg((gt−G2))+(G−f)2
可以看出,任选一个g_t其误差期望是大于平均后的误差期望的。另外,令f=0:
avg(Eout(gt))=avg((gt−G)2)+Eout(G)
可以看出,blend做的事就是令前一项尽量小以得到更加稳定的结果。
在给定gt的情况下如何求解将它们线性组合起来的权重αn呢。即先计算每个gt的结果,并将T个结果作为特征,对它们进行二次线性训练,其得到的权重即对应gt的αt。该方法即linear Blending。这里需要注意的是,αt可能为负,我们可以把它的符号给gt,这意味着gt起了反作用,我们将它反向使用。
另外,在选择gt的时候应注意如果将数据集划分为了训练集和验证集,最后计算得到αt后应当在完整数据集上重新训练gt。
另外,如果在两次训练中不使用线性模型,而使用非线性模型,则该方法称为Any Blending或是stacking。如果使用非线性模型,应当注意过拟合问题。
7.4 Bagging Booststrap Aggregation
如果gt之间差距很大,那么它们组合起来效果越好。而之前提到过一种方法就是,通过同一个分布采样出N个数据集,并在这N个数据集上跑出N个gt。这种思路的一种实现方法是在数据集中进行re-sample,即经过多次有放回采样获得N个数据集。
本节主要讲述了boost算法的动机,即一个分类器没有办法很好的分类,但是当一个分类器犯错之后加大犯错样本的权重,让后来的分类器更重视这个样本,最后把所有方法组合起来能得到一个好的分类器。
在bootstrap中我们通过对训练集进行可重复采样得到不同的训练集,我们可以把这一过程看做是对不同样本集进行了加权处理。因此,当我们使用多个分类器进行聚合的时候,我们希望不同的分类器通过对样本进行不同加权的方法使他们表现的区别很大。具体的来说,就是在给定分类器gt所使用的样本加权u(t)n,分类器gt+1所使用的样本加权u(t+1)n的情况下,gt+1在样本加权u(t)n的条件下所得到的分类表现接近于12.
我们希望的是
ϵ=∑Nn=1u(t+1)nI[yn≠gt(xn)]∑Nn=1u(t+1)n
可以看到,分子是分类错误的权重,分母是分类正确与分类错误的权重和,而我们要做的是让分类错误的权重和等于分类正确的权重和。因此,假设分类错误的权重和是1126,分类正确的权重和是6211,则在每个错误分类的权重上乘以6211,在每个正确分类的权重上乘以1126即可。注意的是,乘以的比例可以拉伸,因此将6211拉伸成正确率,将1126拉伸成错误率。
8.3 Adaptive Boosting Algorithm
接上节的思路,我们可以让错误的样本权重乘以1−ϵϵ‾‾‾‾√,而让正确的样本权重除以1−ϵϵ‾‾‾‾√,这样的效果与上述一致(可以两者相除来进行验证)。可以看到,当正确率大于0.5的时候,错误样本权重上升而正确样本权重下降。另外,为了使得g1在Ein上表现最好,我们令最开始的样本权重为1N。
由此,我们得到了每一轮训练之后的样本权重变化方式,那么还有个问题就在于算法如何组合起来。这里可以排除投票法,因为不能让一个在某些样本上表现很差的g也和其他表现好的g有相同的权重,因此我们根据g的表现决定它们的权重,即1−ϵϵ‾‾‾‾√的函数。
这里使用了ln((1−ϵ)/ϵ‾‾‾‾‾‾‾‾√)作为权重的决定函数,因为当ϵ=12的时候,这个分类器接近于乱猜,就给他0的权重,当ϵ很小的时候,则权重无限大,说明我们很信赖这个分类器。
最后得到线性组合是:
f(x)=sign(∑Tt=1αtgt(x))
另外,从VC维的角度说,该算法的误差上限是:
Eout(G)≤Ein(G)+O((O(dvc(H)TlogT)logNN)‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾√)
根据作者的相关证明,当每个分类器的错误率略大于一半时,经过T=O(logN)次迭代,Ein(G)=0。同时由于T的复杂度是logN的,因此右边O(dvc(H)TlogT)也会相应很小,故当N比较大时,这会是个好算法。
8.4 Adaptive Boosting in Action
在实际上经常应用于adaboost的算法是decision stump:
hs,i,θ(x)=s⋅sign(xi−θ)
这个分类器的意思是,在所有维度里面选择一个维度、一个阈值以及一个方向,据此决定这个样本的分类,例如当第三个向量大于2时为负。选择它是因为实现简单,只需O(d⋅NlogN)的时间复杂度就可以训练出来。
9 Decision Tree
9.1 Decision Tree Hypothesis
本节主要讲述了决策树的两种解释,一种是决策树是由叶子节点和路径组成的,当选择叶子节点对应的路径时采用对应的叶子节点结果;另一种观点是由分叉的树递归组成,当选择某一分支时将采用分支对应的子树的演算法结果。
决策树的优点在于可解释性强,高效。缺点是理论保证不足,并且算法多样。
9.2 Decision Tree Algoithm
决策树主要有4个关键部分:
(1)分支分成几支?
(2)该怎么分支?
(3)什么时候停止?
(4)最终回传的叶子节点的base hypothesis是什么?
以下介绍CART的4个关键:
(1)分成2支。
(2)用decision stump分支。
(3)通过加权不纯度衡量什么时候停止,其中权重是所分类数据大小:
当值域是连续时,不纯度为方差;当值域是离散时,不纯度为基尼系数。有时候可能会使用分类错误。
(4)最终回传一个常数。
9.3 Decision Tree Heuristics in CART
9.3.1 多分类
需要改变的地方有两处,第一是回传的时候的值,第二是不纯度的计算。
9.3.2 过拟合
可以每次在剩余的叶子中减掉一个可以得到更好的Ein的叶子,直到剪到只有一个叶子,最后通过下式来选择:
9.3.3 类别特征
如果遇到类别特征,可以使用decision subset来代替decision stump:
其中S是部分类别的集合。
9.3.4 数值缺失
可以考虑填充缺失数据,或者在建立树时同时选择替代特征,替代特征的分类结果必须要和原特征类似。
9.4 Decision Tree in Action
展示了决策树的判断过程。
10 Random Forest
10.1 Random Forest Algorithm
随机森林就是将bagging和决策树结合起来,每次bagging训练一个决策树,最后投票。另外它在训练决策树时通过一个转换矩阵来线性组合出新的特征以供训练。
10.2 Out of Bag Estimate
本节讲述了评估随机森林的Ein的方法。当训练完随机森林后,将每一个样本看作是没有用到它训练的决策树的验证集,并认为该样本的预测标签是这些决策树所投票决定的。最后将每个样本的错误累加平均。
另外可以知道,当数据量足够大,抽取的数目和样本集大小相同时,没被选取到的样本大约占总样本的三分之一。
这个方法叫Out of Bag,简称OOB。
10.3 Feature Selection
本节讲述了在随机森林中如何评估特征的重要性。特征重要性的指标是:
其中,performance(D)代表原来的数据集的表现,而performance(D′)代表第i个特征的数据经过重新排列之后的表现。
具体的来说,当我们在验证第i个特征重要性时,不需要重新针对乱序的数据集重新训练,只需在OOB验证的时候对样本的特征进行乱序。另外需要注意到的是,在对第t颗树进行OOB时,进行乱序的样本应同为OOB样本。
10.4 Random Forest in Action
本节描述了了随机森林的应用情况,一般来说,所使用的树越多,结果越收敛,并且能表现出large margin的性质。
11 Gradient Boosted Decision Tree
11.1 Adaptive Boosted Decision Tree
上一节讲了将bagging和决策树组合在一起成为随机森林,本节描述将adaboost和决策树组合在一起。
将它们组合在一起的方式就是给样本加上权重然后用来训练决策树,最后根据权重将决策树线性组合。其中有一些特殊之处,其一是权重将通过按比例抽取数据的方式表现;其二是决策树不能完全展开,否则其权重为无穷大,因此需要进行剪枝,在极端情况下的剪枝即只剩一个节点,成为decision stump。
如此就是adaboost-DTree的一个特殊例子,AdaBoost-Stump。
11.2 Optimization View of AdaBoost
将AdaBoost对某一样本的分类看做是对其评分,其中,gt(x)是对样本特征的转换,αt是权重。因此,AdaBoost的目标是使样本的平均得分最大化,把样本权值的变化过程看做是有关αtgt(xn)yn的连乘结果,因此可以将AdaBoost的目标转换成使得样本权重un更小。
AdaBoost的损失函数是指数损失函数。将该损失函数泰勒展开,可以看做是在原损失函数的基础上加上一个梯度,使得损失函数更小,这个梯度是一个函数。该函数的求解结果即AdaBoost的新树。
另外,我们希望gt(x)的权重η尽可能大,即在梯度确定的情况下走更大的一步以获得更小的损失函数。这个η的求解结果即AdaBoost的树权重αt。
本节对上节的思想做了扩展。在这里尝试将上节的AdaBoost的指数错误函数转换成平方错误函数,并用同样的思路先泰勒展开求损失函数的梯度(梯度是一个函数),这里需要注意到的是,在利用梯度最小化损失函数的时候需要在目标函数中减去h(x)的平方项。这一步是通过选择h(x)拟合原函数G的残差。
然后再将h(x)加入并利用单变量线性回归获得最优值η.
11.4 Summary of Aggregation Models
本节总结了过去几节提出的集成的方法:
在得到不同的gt(x)之后,我们有如下的方式可以将它们组合起来:
(1)uniform:简单地利用投票的方式将它们组合起来。
(2)non-uniform:将gt(x)视为一种特征转换,并用线性模型将它们组合起来。
(3)conditional:将gt(x)视为一种特征转换,并用非线性模型将它们组合起来。
第一种的好处在于简单、稳定,后两者的好处在于能处理更加复杂的情况。
在不知道gt(x)的情况下,有如下方法可以学习gt(x):
(1)bagging:用bootstrap的方法获得样本,并进行学习。
(2)AdaBoost:用重新设置权重的方法学习gt(x),并用steepest search的方法搜寻权值,最后线性组合起来。同时这里GradientBoost使用了类似的方法,与重置样本权值类似,它是对之前模型的拟合残差进行fiiting,并用steepest search的方法搜寻权值,最后线性组合。
(3)Decision Tree:通过切割样本的方式获得gt(x)。
另外,可以把以上的方式融合起来:
(1)随机森林:bagging和完全决策树的融合。
(2)AdaBoost-DTree、GBDT:分别用AdaBoost和GradientBoost来组合弱决策树(即Decision stump)。
最后可以注意到的是,组合(ensemble)的方式有large margin的效果。