参考文章
决策树(中)-集成学习、RF、AdaBoost、Boost Tree、GBDT
XGBoost、GBDT超详细推导
[Machine Learning & Algorithm] 决策树与迭代决策树(GBDT)
改进的决策树
决策树不需要进行数据的训练就可以得到较好的结果,但是其自身也存在一定的问题,例如容易过拟合,这即使在进行了剪枝之后依然效果不够好。因此为了试泛化的效果更好需要在决策树的基础上进行再提升。
集成学习
训练多个模型组合从而可以得到更好的模型
在集成学习理论中,我们将弱学习器(或基础模型)称为「模型」,这些模型可用作设计更复杂模型的构件。在大多数情况下,这些基本模型本身的性能并不是非常好,这要么是因为它们具有较高的偏置(例如,低自由度模型),要么是因为他们的方差太大导致鲁棒性不强(例如,高自由度模型)。
bagging
- 从样本集中重采样(有重复的)筛选出n个样本。
- 在所有属性上,对着n个样本建立分类器。
- 重复以上两步m次,即获得了m个分类器将数据放在这m个分类器上,最后根据这m个分类器的投票结果,决定数据属于哪一类。
- 通过在广度上增加树的宽度从而限制树的深度
经过计算63.2%的数据会被分类器使用,而剩下的36.8%的样本是没有用到的,一般这些可以取代测试集用于误差估计。
boosting
boosting是一种机器学习技术,可以用于回归与分类,每一步会产生于一个弱预测模型,并加权累加到模型中,如果每一个弱分类器生成都是根据损失函数的梯度方向,则可以将其称之为梯度提升(Gradient boosting)。
对于boosting来说,其可以减少bias,能够基于泛化能力较弱的学习期构造强学习期。相应的对于bagging能够减少训练方差,对于不剪枝的决策树,神经网络过有良好的集成效果
从上可以得到,对于boosting算法来说,使得第m个决策树的生成效果好于第m-1个算法的基础为指定一个损失函数,基于这前m-1个树模型生成的损失函数
我们可以使得第m个决策树更优的方法。
Adaptive Boosting(自适应boosting)
Adaboosting的含义可以简单的理解为将 自适应 和 boosting 相结合,boosting指的是通过迭代的方式对样本的分布进行调整,而对于自适应表示的是在迭代中不断的学习与调整每个树的权重,其核心是不变的,依然是紧盯着错误的分类样本,通过加大分类误差小的权值,减少分类误差较大的权值,从而调整弱分类器的权值,调整他们在表决时的效果。
Adaptive Boosting(自适应boosting) 算法推导
Adaboosting算法的基础在与紧盯着被分类错误的样本点,争取在下次的树的更新中将这个错误点进行重新分类。
其算法的大概思想如下:
-
假设目前存在M个样本点 M 1 , M 2 , . . . M n {M_1,M_2,...M_n} M1,M2,...Mn其初始化的权值都为 1 N \frac{1}{N} N1,此时意味着每个样本在分类树的眼中都是平等的,假设每个都是正确的。
-
假设现在为一个二分类问题(AdaBoosting 算法同样可以进行多分类,这个后面可以参考这个文章:Adaboost多分类)
-
初始化一个分类器,找到其中最优的分割点,计算在这个分割点下,计算分类错误的概率并更新每个样本的权值,其中被分类错误的样本其权值要大一些,以便于我们下次更新树的信息的时候可以更加注重权值较大的错误分类点
-
在更新权值后,重新计算分割点,更新权值后重新再计算。
算法的推导如下:
Adaboost算法的基础为加法模型,加法模型的公式如下:
f ( x ) = ∑ m = 1 M α m G m ( x ) f(x) = \sum \limits_{m = 1}^M {\alpha _m}{G_m}(x) f(x)=m=1∑MαmGm(x)
- G m ( x ) G_m(x) Gm(x)为基学习器
- α m α_m αm为系数
在第m步,我们的目标是最小化一个指定的损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x)),即
对于经过迭代的公式我们只需要关注其中某一步的实现即可,因为其中每一步的实现都是一样的。我们假设每一步的学习率都是固定的。因此可以得到如下的公式:
f
m
(
x
)
=
f
m
−
1
(
x
)
+
α
m
G
m
(
x
)
f_m(x)=f_{m-1}(x)+\alpha_mG_m(x)
fm(x)=fm−1(x)+αmGm(x)
AdaBoost采用的损失函数为指数损失,形式如下:
L
(
y
,
f
(
x
)
)
=
e
−
y
f
(
x
)
L(y,f(x))=e^{-yf(x)}
L(y,f(x))=e−yf(x)
结合上文,我们现在的目标是在指数函数最小的情况下求得第m个树的下最小的损失函数即求得最小的
α
m
α_m
αm和
G
m
(
x
)
G_m(x)
Gm(x)
(
α
m
,
G
m
(
x
)
)
=
∑
i
=
1
N
L
(
y
i
,
f
(
x
i
)
)
=
arg
min
(
α
,
G
)
∑
i
=
1
N
e
−
y
i
f
m
(
x
i
)
=
arg
min
(
α
,
G
)
∑
i
=
1
N
e
−
y
i
(
f
m
−
1
(
x
i
)
+
α
G
(
x
i
)
)
(\alpha_m,G_m(x))=\sum_{i=1}^N{L(y_i,f(x_i))}=\underset{(\alpha,G)}{\arg\min}\sum_{i=1}^Ne^{-y_if_m(x_i)}=\underset{(\alpha,G)}{\arg\min}\sum_{i=1}^Ne^{-y_i(f_{m-1}(x_i)+\alpha G(x_i))}
(αm,Gm(x))=i=1∑NL(yi,f(xi))=(α,G)argmini=1∑Ne−yifm(xi)=(α,G)argmini=1∑Ne−yi(fm−1(xi)+αG(xi))
设 w i ( m ) = e − y i f m − 1 ( x i ) w_i^{(m)}=e^{-y_if_{m-1}(x_i)} wi(m)=e−yifm−1(xi),由于w(m)i不依赖于α和G(x),所以可认为其是第m步训练之前赋予每个样本的权重。然而 w i ( m ) w^{(m)}_i wi(m)依赖于 f m − 1 ( x i ) f_{m−1}(x_i) fm−1(xi),所以每一轮迭代会改变。
∑ i = 1 N w i ( m ) e − y i α G ( x i ) = e − α ∑ y i = G ( x i ) w i ( m ) + e α ∑ y i ≠ G ( x i ) w i ( m ) \sum_{i=1}^Nw_i^{(m)}e^{-y_i\alpha G(x_i)}=e^{-\alpha}\sum_{y_i=G(x_i)}w_i^{(m)}+e^\alpha\sum_{y_i\neq G(x_i)}w_i^{(m)} i=1∑Nwi(m)e−yiαG(xi)=e−αyi=G(xi)∑wi(m)+eαyi=G(xi)∑wi(m)
GB (Gradient Boosting)
GBDT定义以及算法原理推导
GBDT(Gradient Boosting Decision Tree)全梯度下降树。是boosting算法中的一种,其原理为,通过
对于前m个树,对于每一个样本来说,每个样本在一颗树中必定对应一个叶节点,因此每一个树可以看做一个函数(也就是基函数)。从上面讲到我们希望第m个函数可以以前m-1个函数为基础,获得更好的效果。可以使用贪心算法,我前面的基础上得到一个最优的新函数。
其中f(x)表示一个假定的函数值,上一个函数的意义在与找到一个f(x)使得每次迭代中,都可以得到最优的函数(决策树)。
那么如何使得我们的决策树的效果可以变得更好呢?
我们可以在一直之前分类错误的基础上,再进行学习,使得我们的决策树可以更好的分类我们的样本,因此如果我们假设第m个决策树的函数表示为
F
m
(
x
)
F_m(x)
Fm(x)则,第m-1个决策树可以表示为
F
m
−
1
(
x
)
F_{m-1}(x)
Fm−1(x)则可以再之前的基础上得到公式1
F
m
(
x
)
=
F
m
−
1
(
x
)
+
h
(
x
)
{F_m}(x) = {F_{m - 1}}(x) + h(x)
Fm(x)=Fm−1(x)+h(x)
其中h(x)为一个增强模型效果的函数,我们假设在加入这个函数之后,模型的效果变得更好了。同时我们知道这个函数是和之前的模型相关的,因此我们可以将h(x)表示为:
h
(
x
)
=
f
(
y
,
F
m
−
1
(
x
)
)
h(x) = f(y,{F_{m - 1}}(x))
h(x)=f(y,Fm−1(x))
假设我们正在做的模型为回归模型,则损失函数可以表示为:
L
=
1
2
(
y
−
F
(
x
)
)
2
L = \frac{1}{2}{(y - F(x))^2}
L=21(y−F(x))2
对F(x)进行求导可以得到
∂
L
∂
F
(
x
)
=
−
y
+
F
(
x
)
\frac{{\partial L}}{{\partial F(x)}} = - y + F(x)
∂F(x)∂L=−y+F(x)
而
F
(
x
)
−
y
F(x)-y
F(x)−y我们称之为残差。由此我们可以知道,我们之前谈到的在之前基础上对模型进行优化的方式其主要的方式是通过之前模型中的残差值来进行优化的。由此对于回归问题来说,残差即是我们所要求出的负梯度。
我们再回到之前的公式1,对于公式1我们同样可以求出其损失函数为
L
(
y
,
F
m
(
x
)
)
=
L
(
y
,
F
m
−
1
(
x
)
+
h
(
x
)
)
L(y,{F_m}(x)) = L(y,{F_{m - 1}}(x) + h(x))
L(y,Fm(x))=L(y,Fm−1(x)+h(x))
根据拉格朗日公式的一阶展开可以得到
L ( y , F m − 1 ( x ) + h ( x ) ) = L ( y , F m − 1 ( x ) ) + ∂ L ( y , F m − 1 ( x ) ) ∂ F m − 1 ( x ) h ( x ) L(y,{F_{m - 1}}(x) + h(x)) = L(y,{F_{m - 1}}(x)) + \frac{{\partial L(y,{F_{m - 1}}(x))}}{{\partial {F_{m - 1}}(x)}}h(x) L(y,Fm−1(x)+h(x))=L(y,Fm−1(x))+∂Fm−1(x)∂L(y,Fm−1(x))h(x)
其中如果 h ( x ) = − ∂ L ( y , F m − 1 ( x ) ) ∂ F m − 1 ( x ) h(x)=-\frac{{\partial L(y,{F_{m - 1}}(x))}}{{\partial {F_{m - 1}}(x)}} h(x)=−∂Fm−1(x)∂L(y,Fm−1(x))即h(x)为损失函数的负梯度的方向,则损失函数是必定变小的。对于 ∂ L ( y , F m − 1 ( x ) ) ∂ F m − 1 ( x ) \frac{{\partial L(y,{F_{m - 1}}(x))}}{{\partial {F_{m - 1}}(x)}} ∂Fm−1(x)∂L(y,Fm−1(x))我们称之为伪残差
这个就是Freidman的梯度提升算法的思想,我们现在将其算法流程写出如下:
算法中,N表示数据的数量,M表示基分类器的数量,
h
(
x
i
;
a
m
)
h({x_i};{a_m})
h(xi;am)表示基本分类器(weak learner or base learner),4中
a
m
a_m
am 表示拟合负梯度能力最好的分类器参数 (也就是可以得到的最好的损失函数),负梯度只是表示下降的方向,但是下降多少没有确定,5中
p
m
p_m
pm 可以认为是下降最快的步长(也可以认为是学习率),可以让Loss最小,可以用线性搜索的方式来估计
p
m
p_m
pm 的值。
我们的模型现在为回归树,对于一个J个叶子节点的回归树模型可以表示为:
则根据上图中第6个公式,这个可以等价替换为:
XGBoost
参考文献:XGBoost超详细推导
随机森林
随机森林的工作原理如下:
-
从数据集(表)中随机选择k个特征(列),共m个特征(其中k小于等于m)。然后根据这k个特征建立决策树。
-
重复n次,这k个特性经过不同随机组合建立起来n棵决策树(或者是数据的不同随机样本,称为自助法样本)。
-
对每个决策树都传递随机变量来预测结果。存储所有预测的结果(目标),你就可以从n棵决策树中得到n种结果。
-
计算每个预测目标的得票数再选择模式(最常见的目标变量)。换句话说,将得到高票数的预测目标作为随机森林算法的最终预测。
针对回归问题,随机森林中的决策树会预测Y的值(输出值)。通过随机森林中所有决策树预测值的平均值计算得出最终预测值。而针对分类问题,随机森林中的每棵决策树会预测最新数据属于哪个分类。最终,哪一分类被选择最多,就预测这个最新数据属于哪一分类。(民主集中制,谁的得分高选择谁)。
随机森林的优点与缺点
优点:
-
可以用来解决分类和回归问题:随机森林可以同时处理分类和数值特征。
-
抗过拟合能力:通过平均决策树,降低过拟合的风险性。
-
只有在半数以上的基分类器出现差错时才会做出错误的预测:随机森林非常稳定,即使数据集中出现了一个新的数据点,整个算法也不会受到过多影响,它只会影响到一颗决策树,很难对所有决策树产生影响。
缺点:
-
据观测,如果一些分类/回归问题的训练数据中存在噪音,随机森林中的数据集会出现过拟合的现象。
-
比决策树算法更复杂,计算成本更高。
-
由于其本身的复杂性,它们比其他类似的算法需要更多的时间来训练。