集成方法 Ensemble
一、bagging
用于基础模型复杂、容易过拟合的情况,用来减小 variance(比如决策树)。基础模型之间没有太多联系(相对于boosting来说),训练可以并行。但用 bagging 并不能有助于把数据拟合的更准(那是减小 bias,要用 boosting)。
每次训练一个基础模型,都从 N 条训练数据中有放回的随机抽取出(bootstrapping) N' 条作为训练集(虽然一般 N = N',但由于是有放回的抽,所以具体的数据还是不同的)。
模型做预测的时候用 average(回归)或者 voting(分类)。
Out-of-bag validation(self-validation)
用 bagging 方法不一定要把训练数据切分成训练集和验证集。因为每轮随机采样都会有一部分数据没有被采样到,可以用这部分数据来验证模型的泛化能力。而且理论上有 1/e 比例的数据是从来不会被采样出去(一轮没有被采样的概率是1-1/N,N 轮都没被采样到的概率是 (1 - 1/N)N ,当 N = ∞ 时极限是 1/e)。
例如,训练基础模型的数据情况如下表
那就可以用 f2+f4 在 x1 上测试;f2+f3 在 x2 上测试;...
据此,可以不用单独分一个验证集出来,直接用 OOB error 来衡量就行了,实做效果也是比较准确。
Random Forest(对 decision tree 的 bagging)
可以作出比较平滑的决策边界。
特点:
1. 限定使用 CART 决策树作为基础模型
2. 只是有放回的 resample 训练数据是不够的(只这样做的话,得到每棵树都会差不多)。还需要每次分裂的时候随机限制一些特征不能用(在剩下的 p' 维特征中选择最优特征进行 split),p' 越小意味着得到的决策树模型鲁棒性越好(但同时对训练数据的拟合肯定也会变差),相当于 variance会变小但 bias 会变大,通过交叉验证选择一个合适的 p'
3. 对单棵树不剪枝,以此来减小单棵树的 bias(让其“专精于”那一部分特征,所以 RF 中的决策树比较深),再借助 bagging 减小整体模型的variance(相当于从不同的角度解决问题)
进一步的考虑 diversifying feature expansion,每次分裂的时候只随机选择一部分特征来考虑,相当于输入 x 乘上一个随机投影矩阵 p。更 powerful 的做法是,随机选择一部分特征而且还做随机组合的投影(特征重组)。(在这种情况下的分割就很像是 perceptron 了)
基于 permutation test 的特征选择
如果某一维特征很重要,那么加入一些随机噪声(比如高斯)后,模型结果应该会变差。或者对数据的某一个维度做随机重新排列(permutation),重新训练模型后衡量到底变差多少。
如果不想完全重新训练模型呢?在验证的时候,算 gt(xn) 的某个时刻会用到 xn, i 的值,就换成从,对 gt 来说 OOB 的数据中随机选取的值,选出来的就还是 OOB 的值。
对 RF 的总结:bagging of randomized CART trees with automatic validation and feature selection
Isolation Forest(异常检测)
类似 Random Forest ,不同点:
1. 采样个数 N' 远小于训练样本个数 N。因为只需要部分样本就能够检测出异常点了。
2. 建立决策树时,随机选择特征 + 随机选择阈值来 split 。
3. 最大决策树深度选择一个比较小的值,原因同 1 。
对于测试样本 x,把其拟合到 T 棵决策树,计算该样本的叶子结点深度 ht(x),进一步计算出平均深度 h(x)。样本点是异常的概率为:
s(x, N) = 2 -h(x)/c(N) ; 其中 c(N) = 2log(N-1) + ξ - 2(N-1)/N , ξ 为欧拉常数。取值范围在[0, 1] ,越大越可能是异常点。
二、boosting
强力的保证:只要基础分类器能够在训练集上实现小于 50% 的错误率,使用 boosting 就能在训练集上实现 0% 错误率。
boosting 方法中,基础模型的训练是有顺序的、迭代的(新的基础模型去补强已有的基础模型)。
怎么实现在不同的训练集上训练模型?
1. resampling
2. reweighting
3. 实际应用的时候给样本不同的权重系数就行了。
boosting 方法围绕四个基本问题展开:
1. 如何计算误差率 ε
2. 如何得到基础分类器的权重 α
3. 如何更新样本权重系数 u
4. 如何综合所有的基础分类器
Adaboost
主要思想:在让 f1(x) 的分类效果变成随机的新的训练集上训练 f2(x) ;... ;以此类推训练新的基础分类器,综合起来就是整体分类器。(前向分步学习的加法模型)
二分类问题,输出为{+1, -1}。在训练集上训练 f1(x) 得到小于 0.5 的错误率。Z 为规范化因子
改变训练样本的权重参数 u ,令 f1(x) 的错误率等于 0.5 (变成随机分类器的效果);
在新的训练集上训练 f2(x) 得到小于 0.5 的错误率;
...
具体怎么求解新的样本参数 u ?(强调被错误分类的样本的影响)
初始化 u1 = [1, 1, ..., 1]T,N维向量。如果第 i 个样本 xi 被 ft(x) 正确分类,就减小其权重参数 uit (除以dt);反之,如果被分错就增大 uit (乘dt)。
d 的计算也很简单,t+1 时刻的样本权重系数要让ft(x) 错误率等于 0.5
dt = ( (1 - εt)/εt )1/2 ,由于前提是 ft(x) 的错误率一定小于 0.5,所以 d > 1。
统一乘除两种情况的形式:令 αt = log dt ;乘 dt 等价于乘 exp(αt),除以 dt 等价于乘 exp(-αt)
想办法把负号和分类情况联系起来,最后结果为:ut+1i = uti * exp(-yi * ft(xi) * αt )
得到 T 个基础分类器后,综合模型 H(x) = sign(Σ αt * ft(x)),sum for t = 1, 2, ..., T。
为什么要做 weighted sum 呢?—— 错误率低的 ft 对应的 αt 比较大,对最后结果影响就更大,这样综合基础分类器是比较合理的。
证明 Adaboost 能够在训练集上实现 0% 的错误率
计算 H(x) 的错误率,发现其存在上界 exp( -yi * g(xi) )
证明了错误率的上界会越来越小,以及 Adaboost 的损失函数是指数函数。
设 Zt 是训练 ft 的权重参数之和,可以得到 ZT+1 的表达式,发现exp里面正好出现了g(x) = Σ αt * ft(x),得证T个基础分类器构成的模型在训练集的错误率上界训练集错误率上界等于 ZT+1 / N
这也等价于证明了训练样本权重的平均值会越来越小。
根据 Z 的递推公式,发现 Z 是随 t 单调减,得证。
margin
Boosting 的一般形式(从损失函数的角度解释 Adaboost)
定义优化目标为最小化刚才求解出来的错误率上界(指数函数的 loss):
怎么实现这个优化过程呢? —— 用gradient descent
Gradient Boosting
L 对函数 g 求梯度,得到更新公式
要找到一个 ft(x) ,乘上权重 αt 后加到 gt-1(x) 里面,和梯度下降求解得到的对 g(x) 的更新一样,那就让 ft(x) 和负梯度方向一致,即内积越大越好。(先看方向,用整体损失函数的负梯度拟合第 t 轮的损失值)
转换后的优化目标如下,相当于最小化 ft(x) 在权重参数为 ut 的训练集上的误差(因为要找到 ft(x) 最大化下面这个求和式子,就要让 ft(x) 可以使得尽可能多的 n 让 yn * ft(xn) 大于0),而 exp(-yn* gt(xn)) 恰好等于 utn ,
而 αt 如何确定呢?求导令其等于0(因为要找到一个αt 令 L(g) 最小)。可以发现:令 L 对 αt 偏导数为 0 得到的解,和Adaboost 中的 αt 定义相同。
三、stacking
各做各的,然后把前面已经有的模型输出作为最后一个 layer 的 new features,而且训练数据要分成两个部分,一部分用来训练前面的系统,另一部分用来训练 Final classifier。