随机森林、AdaBoost、GBDT
组合分类器
- 思想:将多个分类器的结果进行多票表决或取平均值,以此作为最终的结果。
- 好处:
- 提升模型精度,整合各个分类器结果,得到更合理的决策边界,减少整体错误
- 处理较大数据集,可以划分多个子集,对子集构建分类器;处理较小数据集,通过自助采样boostrap产生多个数据集,构建分类器
- 当决策边界比较复杂,可以针对特定区域的数据进行构造多个数据集,然后构建分类器,再集成
- 处理多源异构数据(存储方式、类别不同),可以用同样的方法去构建模型
随机森林
随机森林就是一种组合分类器,如果过拟合,就减少树的深度
1.特点
(1)数据的随机抽取(bagging的特点)
有放回的自助采样去构造子数据集,数量与原始数据集一样,会有元素重复,分类结果由子决策树的投票表决决定的
(2)待选特征的随机选取(RF独有特点)
子决策树的分裂过程并未用到所有特征,而是随机选取K个特征,每次树进行分裂时在随机选取的特征中找最优的特征,提升系统多样性,从而提升分类性能. K代表了随机性,k=d就是传统决策树,k=1就是随机选一个特征划分,推荐k=log2d
(3)每棵树尽可能生长,无剪枝过程
2.优点
- 能够处理高维度数据(特征多),且不用做特征选择
- 训练结束,可以给出feature的重要性
- 训练RF时,对泛化误差使用的是无偏估计(在多次重复下,它们的平均数接近所估计的参数真值)
- 训练中能检测到feature的互相影响
- 实现简单,训练速度快
3.影响分类效果的参数
(1)森林中任意两棵树的相关性:相关性越大,错误率越大
(2)每棵树的分类能力:树的分类能力越强,森林的错误率越低
重点:特征个数K是RF的唯一关键参数,减少k,树的相关性和分类能力降低,反之则同时增加,所以最优K的选择很重要
选择最优K的方法:袋外错误率out-of-bag error:
对于每棵树来说,部分训练实例没有参与这棵树的生成,这些示例称谓第K颗树的oob样本。oob error的计算方法:
- 计算每个样本作为oob在树中的分类情况
- 用简单投票法作为该样本的分类结果
- 用误分个数占样本总数的比率作为RF的oob error
Bagging(减少方差,即提高稳定性)
并行学习,每一次从原始数据中根据均匀概率分布有放回的抽取比原始样本数量少的样本。样本点可以出现重复,然后对每一次产生的数据集构造一个分类器,再对分类器进行组合。随机森林就属于bagging的一种变形。bagging的代价是提升了准确率损失了解释性
通常的基学习器:对训练集十分敏感的不稳定学习算法(方差大的)
Boosting(减少偏差,即提高模型拟合的准确度)
串行学习,每一次抽样的样本分布是不一样的,每一次迭代,都是根据上一次迭代的结果,增加被错误分类的样本的权重。使模型在之后的迭代中更加注重难以分类的样本。迭代之后,将每次迭代的基分类器进行集成,那么如何进行样本权重的调整和分类器的集成是我们需要考虑的关键问题。本质:不断学习,不断纠错,不断提升的过程
通常的基学习器:泛化能力很弱的学习器
Stacking(改进预测)
训练多个不同的模型,把这些模型的输出结果作为下一层模型的训练样本,新的训练样本拼接上各个样本的真实标签,训练一个新模型,最终再预测得到的结果就是stacking融合之后的最终预测结果。第二层模型通常使用较为简单的模型,防止过拟合
具体过程:
- 有训练集500条,测试集100条,训练集划分为5份,记为t1,t2,t3,t4,t5
- 假设使用3种算法,A、B、C法
- 针对每一个算法,执行K-fold,这里我们用5-fold,一共得到5个训练结果,每个算法都有5个结果,记为d1 ~ d5. 同时也对测试集进行预测,结果记为td1~td5
- td1~td5相加后求平均值,得到TA、TB、TC。每个算法的d1 ~ d5拼接起来,得到新训练集DA,DB,DC
- DA,DB,DC作为输入,构建新模型,将TA,TB,TC看做测试数据进行测试
图由这篇文章获取
Bagging和Boosting的区别
(1)样本选择:bagging是有放回抽取,各轮的训练集独立;boosting是每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。
(2)样例权重:bagging使用均匀取样,每个样例的权重相等;boosting根据错误率不断调整权值,错误率越大则权重越大。
(3)预测函数:Bagging的所有预测函数的权重相等;Boosting的每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
(4)并行计算:Bagging的各个预测函数可以并行生成,而Boosting的各个预测函数只能顺序生成
Bagging与Random Forest的比较
RF的多样性更强,由于属性扰动的加入,其初始泛化性能较差,但是随着集成数目的增多,其往往可以收敛到更低的泛化误差。
RF选样本与原始数目一样,bagging通常比原始数目少一点
bagging是用全部特征来得到分类器,Random forest是需要从全部特征中选取其中的一部分来训练得到分类器
结合策略
统计方面看,多种假设在训练集上可能性能相同,只选其一只能选择部分假设,那么结合起来,就有多种假设,提高泛化性能。
计算方面看,单个学习器容易进入局部最优解,多个学习器结合有助于降低陷入局部最优解风险
表示方面看,多个学习器结合有助于扩大假设空间,可能学到更好的近似
回归问题的结合策略
简单平均法:
加权平均法:
权值由训练中得到,真实情况下可能训练数据有缺失值或噪声,权值不一定可靠,加权平均不一定比简单平均好。可以采用一个思想:对于差异不大的学习器,我们采用简单平均;差异较大的,我们采用加权平均。
分类问题的结合策略
绝大多数投票法: 概率大于0.5
相对多数投票法:选最多票数即可,可能有多个多票数的,随便选一个
加权投票法:
分类任务中,基学习器的输出结果类型可能不同,分为类标记和类概率
- 类标记:样本被预测为类别 i i i,则取值为1,否则为0,也叫硬投票
- 类概率:对后验概率P(i|x)的一个估计,样本x被预测为类别 i i i,软投票
类概率的结合一半比类标记好,对于结构不同的模型结合(如树模型和神经网络),类概率不能直接比较,要换成类标记再投票
Adaboost
Boosting要解决的两个问题:
- 每一轮如何改变训练数据的权值或概率分布
- 如何组合弱分类器
adaboost通过提高错分样本的权值,减少正确分类样本的权值,解决第一个问题,采取加权多数表决方法解决第二个问题
假设弱分类器为 Gi(x),它在强分类器中的权重 αi,那么就可以得出强分类器 f(x):
第一个问题:改变样本权值
通过改变样本的数据分布来实现的,
D是样本数据集,k+1代表迭代轮数,N代表第N个样本,W是权重
第 k+1 轮中的样本权重,是根据该样本在第 k 轮的权重以及第 k 个分类器的准确率而定。
Z
k
Z_k
Zk是一个规范因子,它的作用在于使
D
k
+
1
D_{k + 1}
Dk+1成为一个概率分布。
第二个问题:加权多数表决
α
\alpha
α代表弱分类器的权重,公式为:
e
i
e_i
ei 代表第 i 个分类器的分类错误率。对数采用的是自然对数。当
e
i
≤
1
2
e_i\leq \frac{1}{2}
ei≤21时,
α
i
≥
0
\alpha_i\geq0
αi≥0,即错误率越小,权重越大;反之,
e
i
≥
1
2
e_i\geq \frac{1}{2}
ei≥21是相反的,且验证了分类精度必须大于0.5的前提条件.
adaboost的训练步骤:
- 初始化训练集数据的权值分布,赋予相同权值 1 N \frac{1}{N} N1
- 使用当前权值学习基分类器,有多个阈值,计算不同阈值下的分类误差率。
- 找到分类误差率最小的情况,并基于这个基分类器,计算计算分类器权重 α \alpha α
- 更新样本权值,进入下一轮训练,重回第二步,一直迭代
- 最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器
GBDT(梯度提升决策树)
GBDT都是回归树,回归树用的衡量准则是平方误差最小化,GBDT的核心是累加所有树的结果作为最终结果
回归树
利用最小二乘回归树算法,生成回归树f(x),递归地把每个区域分为两个子区域并决定子区域的输出值,构建二叉决策树:
(1)选择最优切分变量j与切分点s
(2)用选定的(j,s)划分区域并决定相应输出值
(3)递归调用,知道满足停止条件
(4)划分了M个区域RM,每个单元
R
m
R_m
Rm都有固定输出值
c
m
c_m
cm
提升树
以决策树为基函数的提升方法叫提升树,提升树是迭代多颗回归树来共同决策的。采用平方误差损失函数时,每一棵回归树学习了之前所有树的结论和残差,拟合得到一个当前的残差回归树。
-
残差=真实值 - 预测值
-
提升树的算法步骤:
- 初始化 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0
- 对于m=1,2,…M:
计算残差: r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , . . . , N r_{mi} = y_i - f_{m-1}(x_i), i=1,2,...,N rmi=yi−fm−1(xi),i=1,2,...,N
拟合残差 r m i r_{mi} rmi学习一个回归树得到 T ( x ; Θ m ) T(x; Θm) T(x;Θm)
更新 f m ( x ) = f m − 1 ( x ) + T ( x ; Θ m ) f_m(x) = f_{m-1}(x) + T(x; Θm) fm(x)=fm−1(x)+T(x;Θm) - 得到回归问题提升树:
提升树的好处:考虑了对模型过拟合。可以舍弃一些本来普通回归树中有的特征,用更少特征也能达到很好的预测效果,体现了奥卡姆剃刀原理
结合回归树和提升树,提升树算法的实例步骤
首先是有数据,训练数据有取值范围,考虑只用二叉树作为基函数:
(1)求
f
1
(
x
)
f_1(x)
f1(x)即回归树
T
1
(
x
)
T_1(x)
T1(x)
先找到最优的切分点s,计算方法就是上面提到的回归树,切分点由自己去决定,然后都试一遍,找最小平方误差的那个,就搭起了回归树T1。6.24和8.91是两个叶子节点的c值,也是下一轮的真实值
(2)用
f
1
(
x
)
f_1(x)
f1(x)拟合训练数据的残差,
r
2
i
=
y
i
−
f
1
(
x
i
)
r_{2i} = y_i − f_1(x_i)
r2i=yi−f1(xi),计算平方误差,就是残差的平方和:
(3)求
T
2
(
x
)
T_2(x)
T2(x),与上面步骤一样,找切分点,然后基于上一步得到的残差计算当前残差,不断重复这个过程,直到
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x))达到要求。最后是所有的树叠加起来
GBDT原理(正文)
根据上面内容,发现了核心点就是使得损失函数达到最小,所以问题关键是对损失函数的度量,不同的损失函数在优化上的难度都不同,【绝对值loss和huber loss就比较难】,所以GBDT希望能找到一种通用的拟合方法。
梯
度
提
升
算
法
:
利
用
最
速
下
降
的
近
似
方
法
,
即
利
用
损
失
函
数
的
负
梯
度
在
当
前
模
\color{red}梯度提升算法:利用最速下降的近似方法,即利用损失函数的负梯度在当前模
梯度提升算法:利用最速下降的近似方法,即利用损失函数的负梯度在当前模
型
的
值
作
为
残
差
的
近
似
值
(
可
以
说
残
差
是
负
梯
度
的
一
种
特
例
)
\color{red}型的值作为残差的近似值(可以说残差是负梯度的一种特例)
型的值作为残差的近似值(可以说残差是负梯度的一种特例)
GBDT的公式步骤:
(1)初始化弱学习器【平均loss的话就是求均值】
f
0
(
x
)
=
a
r
g
m
i
n
⏟
c
∑
i
=
1
m
L
(
y
i
,
c
)
f_0(x) = \underbrace{arg\; min}_{c}\sum\limits_{i=1}^{m}L(y_i, c)
f0(x)=c
argmini=1∑mL(yi,c)
(2)在T轮的迭代中:
a. 对于N个样本,计算损失函数的负梯度值,作为残差的估计【算残差】
r
t
i
=
−
[
∂
L
(
y
i
,
f
(
x
i
)
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
t
−
1
(
x
)
r_{ti} = -\bigg[\frac{\partial L(y_i, f(x_i)))}{\partial f(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)}
rti=−[∂f(xi)∂L(yi,f(xi)))]f(x)=ft−1(x)
b.对 ( x i , r t i ) (x_i,r_{ti}) (xi,rti)拟合CART回归树,得到第t棵树,树有叶节点区域 R t j , j = 1 , 2 , . . . , J R_{tj}, j =1,2,..., J Rtj,j=1,2,...,J, 其中J为回归树t的叶子节点的个数。【寻找最佳划分点(阈值)】
c. 对于每个叶子节点,求出loss最小,就是拟合叶子结点最好的输出
c
t
j
c_{tj}
ctj【残差更新为实际值】
c
t
j
=
a
r
g
m
i
n
⏟
c
∑
x
i
∈
R
t
j
L
(
y
i
,
f
t
−
1
(
x
i
)
+
c
)
c_{tj} = \underbrace{arg\; min}_{c}\sum\limits_{x_i \in R_{tj}} L(y_i,f_{t-1}(x_i) +c)
ctj=c
argminxi∈Rtj∑L(yi,ft−1(xi)+c)
d. 更新回归树
f
t
(
x
)
=
f
t
−
1
(
x
)
+
∑
j
=
1
J
c
t
j
I
(
x
∈
R
t
j
)
f_{t}(x) = f_{t-1}(x) + \sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj})
ft(x)=ft−1(x)+j=1∑JctjI(x∈Rtj)
(3)最终模型:
f
(
x
)
=
f
T
(
x
)
=
f
0
(
x
)
+
∑
t
=
1
T
∑
j
=
1
J
c
t
j
I
(
x
∈
R
t
j
)
f(x) = f_T(x) =f_0(x) + \sum\limits_{t=1}^{T}\sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj})
f(x)=fT(x)=f0(x)+t=1∑Tj=1∑JctjI(x∈Rtj)
一句话总结
GBDT属于Boosting算法,它是利用损失函数的负梯度方向在当前模型的值作为残差的近似值,进而拟合一棵CART回归树。GBDT的会累加所有树的结果,而这种累加是无法通过分类完成的,因此GBDT的树都是CART回归树,而不是分类树(尽管GBDT调整后也可以用于分类但不代表GBDT的树为分类树)
gbdt简单容易记忆的步骤
1.初始化一个残差,若是平方误差loss就是求均值,f(0) = r = loss
2.计算残差,差 = 真实值 - f(0)。
3.残差作为真实值,去寻找回归树的最佳划分点(阈值)。遍历每个特征的每个特征值作为阈值,通过阈值将数据二分,计算两边的真实值,然后针对两边计算平方误差,两边加起来最小就是最佳划分点
4.将二分后的残差值更新为实际值,计算实际值平均值作为残差,构成第二个弱学习器
5.最后合并强学习器。
GBDT和RF和Adaboost区别:
我觉得Adaboost就是boosting方法的分类,而GBDT就是boosting的回归
RF可以是回归树和分类树,而GBDT只能是回归树,RF是bagging,所以抽取数据方法不一样,RF的最终结果是投票,而GBDT是加权累加。随机森林对异常值不敏感;GBDT对异常值非常敏感;随机森林是通过减少模型方差提高性能;GBDT是通过减少模型偏差提高性能。一个并行,一个串行