集成学习(1)

2019-11-04  本文已影响0人  Manfestain

随机森林


1. 原理

随机森林属于Bagging的扩展变体

Bagging:有放回抽样,多数表决(分类)或简单平均(回归),同时Bagging的基学习器之间属于并列生成,不存在强依赖关系。

RF以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机特征选择,因此可以概括RF包括四个部分:

​ 1、随机选择样本(放回抽样);

​ 2、随机选择特征;

​ 3、构建决策树;

​ 4、随机森林投票(平均)。

随机选择特征:在树的构建中,会从样本集的特征集合中随机选择部分特征,然后再从这个子集中选择最优的属性用于划分,这种随机性导致随机森林的偏差会有稍微的增加(相比于单棵不随机树),但是由于随机森林的平均’特性,会使得它的方差减小,而且方差的减小补偿了偏差的增大,因此总体而言是更好的模型。

在构建决策树的时候,RF的每棵决策树都最大可能的进行生长而不进行剪枝;在对预测输出进行结合时,RF通常对分类问题使用简单投票法,回归任务使用简单平均法。


2. 随机森林的生成方法

  1. 对于t=1,2,…,T
  1. 如果是分类算法预测,则T个弱学习器投出最多票数的类别或者类别之一为最终类别。如果是回归算法,T个弱学习器得到的回归结果进行算术平均得到的值为最终的模型输出。

RF使用了CART决策树作为弱学习器;

RF通过随机选择节点上的一部分样本特征,这个数字小于n,从中选择一个最优的特征来做决策树的左右子树划分,这样进一步增强了模型的泛化能力。


3. 什么是袋外数据(Out of Bag)

在一个含有m个样本的训练集中进行随机采样,样本被采到的概率是\frac{1}{m},不被采到的概率是1-\frac{1}{m},则:

m\rightarrow\infty,\quad\lim_{n\rightarrow+\infty}(1 - \frac{1}{m})^{m}=0.368


4. 随机森林是否需要做交叉验证

结论:不需要

它可以在内部进行评估,也就是说在生成的过程中可以对误差进行无偏估计,由于每个基学习器只使用了训练集中约63.2%的样本,剩下约36.8%的样本可用做验证集来对其泛化性能进行“包外估计”。


5. 为什么随机森林不会发生过拟合

在建立每一棵决策树的过程中,有两点需要注意采样完全分裂


6. 随机森林与Bagging的对比

RF的起始性能较差(当只有一个基学习器时)随着学习器增多,随机森林通常会收敛到更低的泛化误差。

RF选择与输入样本数目相同多的样本(采样样本次);Bagging一般选择比输入样本少的样本。

随机森林的训练效率也会高于Bagging,因为在单个决策树的构建中,Bagging使用的是确定性决策树,在选择特征划分结点时,要对所有的特征进行考虑,而随机森林使用的是随机性特征数,只需考虑特征的子集。


7. 随机森林的优缺点

优点:

(1)不必担心过度拟合(模型方差小,泛化能力强);
(2)对于部分缺失特征不敏感;
(3)能够处理很高维的数据并且不需要特征选择,训练完成后可以给出特征的重要性;
(5)算法容易理解;
(6)可以高度并行处理。

缺点:

(1)在噪声较大的分类或者回归问题上会过拟合。
(2)执行速度虽然比Boosting等快,但是比单个的决策树慢很多。
(3)可能会出现一些差异度非常小的树,淹没了一些正确的决策。
(4)由于树是随机生成的,结果不稳定(kpi值比较大)



GBDT


1. 原理

Boosting:使用多个分类器,不同的分类器是通过串行训练而获得的,每个新分类器都根据已训练的分类器的性能来进行训练。Boosting是通过关注被已有分类器错分的那些数据来获得新的分类器

Boosting分类的结果是基于所有分类器的加权求和结果的(bagging中权值是一致的)

GBDT与传统的Boosting区别较大,它的每一次计算都是为了减少上一次的残差

而为了消除残差,我们可以在残差减小的梯度方向上建立模型

残差:和预测值相加后能得到真实值的累加量

在GradientBoost中,每个新的模型的建立是为了使得之前的模型的残差往梯度下降的方向,与传统的Boosting中关注正确错误的样本加权有着很大的区别。

结论GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,通过不断减少训练过程中产生的残差对问题不断优化


2. GBDT的生成方法

  1. GBDT通过迭代M轮,每轮产生一个弱分类器T\left ( x;\theta _m \right )

    弱分类器的损失函数为\hat\theta_{m} = \mathop{\arg\min}_{\theta_{m}} \sum_{i=1}^{N}L\left ( y_{i},F_{m-1}(x_{i})+T(x_{i};\theta_{m} ) \right )

    样本x_i的损失函数的负梯度为y_i^` = -[\frac{\partial L(y_i, F(x_i))}{\partial F(x_i)}]_{F(x)=F_{m-1}(x)},利用(x_i,y_I^`)拟合一颗CART树

    每个弱分类器在当前模型F_{m-1}(x) 的基础上进行训练

    弱分类器的要求:足够简单,低方差高偏差(训练过程是通过降低偏差来提高分类精度的)

  2. 最终的总分类器是将每轮训练的弱分类器加权得到的(加法模型)

    F_{m}(x) = \sum_{m=1}^{M}T\left ( x;\theta _m \right )

GBDT通过经验风险及消化来确定下一个分类器的参数。如果选择平方损失函数,那么这个差值就是残差:

min\frac{1}{2}\sum_{i=1}^{N}(y_i - (F_{m-1}(x_i) + T(x_i;\theta_m)))^2\rightarrow y_i-F_{m-1}=T

  • 希望损失函数能够不断减小,并且快速的减小
  • 让损失函数沿着梯度下降的方向

3. GBDT如何选择特征

GBDT默认的弱分类器是CART树

  1. 假设总共有M个特征,首先选取一个特征j作为二叉树的第一个切分特征,然后对特征j选择一个切分点m
  2. 特征j的值小于m,则分为一类,如果大于m,则分为另一类
  • 遍历每个特征,然后对每个特征遍历它所有可能的切分点,找到最优特征m的最优切分点 j
  • 衡量我们找到的特征m和切分点 j
    • 回归:平房误差min_{j,m}[min_{c_1}\sum_{x_i\in R_1(j,m)}(y_i - c_1)^2 + min_{c_2}\sum_{x_i\in R_2(j,m)}(y_i - c_2)^2]c_m=ave(y_i|x_i\in R_m)
    • 分类:Gini(p)=\sum_{k=1}^{K}p_k(1-p_k)=1 - \sum_{k=1}^{K}p_k^2,对于给定的集合D,基尼系数为Gini(D)=1 - \sum_{k=1}^{K}[\frac{C_k}{D}]^2

4.GBDT如何构建特征

GBDT可以产生特征的组合

在CTR预估中,工业界一般会采用逻辑回归,但LR本身只适合处理线性问题,如果要处理非线性,可以进行特征组合

Facebook发表过一篇文章,利用GBDT去产生有效的特征组合,以便逻辑回归进行训练来提升最终的效果。

GBDT 生成了两棵树,两颗树一共有五个叶子节点。我们将样本 X 输入到两颗树当中去,样本X 落在了第一棵树的第二个叶子节点,第二颗树的第一个叶子节点,于是我们便可以依次构建一个五纬的特征向量[0,1,0,1,0]


5.GBDT如何用于分类

GBDT 无论用于分类还是回归一直都是使用的CART 回归树

GBDT 每轮的训练是在上一轮的训练的残差基础之上进行训练的。这里的残差就是当前模型的负梯度值 。这个要求每轮迭代的时候,弱分类器的输出的结果相减是有意义的。残差相减是有意义的。

弱分类器是分类树,类别相减是没有意义的

  1. 在训练时,针对样本x_i每个可能的类(总共K类)都训练一个分类回归树

    实质上是在每轮训练的时候同时训练K颗树。第k颗树针对样本x_i的第k类,输入为(x_i, y_k),y_{k=c}=1

    对应的K个输出为f_k(x_i)

    仿照Softmax,则属于类别c的概率为:p_{c}=\frac{exp(f_c(x_i)}{\sum_{k=1}^{K}exp(f_k(x_i))}

  2. 计算每个树针对类别1的残差

    残差y_{ck}=k-p_c,k=1,…,K

    针对下一轮,将本轮的残差作为输入(x_i,y_{ck}(x_i))输入k第颗树(同样K有棵树)


6. GBDT如何做正则化

为了防止过拟合,需要对GBDT做正则化,主要有三种方式:

  1. 与Adaboost类似的正则化项:步长(learning rate),定义为v

    F_k(x)=F_{k-1}(x)+f_k(x)\rightarrow F_k(x)=F_{k-1}(x)+vf_k(x)

    0<v\leq1,较小的v意味着更多的弱学习期迭代次数

  2. 通过子采样步长(subsample),定义为s\in (0,1]。RF采用有放回抽样,GBDT采用不放回抽样

    s=1,则不采用子采样;当s<1,则使用部分样本做GBDT

    部分样本可以减少方差(防止过拟合),但是会增加样本拟合偏差,所以s不能太低

  3. 正则化剪枝


7. GBDT通过什么方式减少误差

每棵树都是在拟合当前模型的预测值和真实值之间的误差,GBDT是通过不断迭代来使得误差减小的过程。


8. GBDT相比于传统的LR,SVM效果为什么好一些?

GBDT基于树模型,继承了树模型的优点 [对异常点鲁棒、不相关的特征干扰性低(LR需要加正则)、可以很好地处理缺失值、受噪音的干扰小]


9. GBDT如何求梯度

BGDT进行梯度下降时是损失函数目标函数求导:\frac{\part L}{\part f_{m-1}},而不是对特征值

决策树的目标函数没法用一个表达式求解,每个节点都是用一个值来分离样本,无法直接通过表达式来求解

把函数f_{m-1}理解成在所有样本上的函数值,即负梯度为-\frac{\part L}{\part f_{m-1}(x_i)}

对于样本x_i,i=1,…,N,都有一个梯度值,最终的函数梯度为所有样本的梯度和


10. GBDT的训练问题


10. RF与GBDT的区别


GBDT的优缺点

优点

可以灵活处理各种类型的数据,包括连续值和离散值。
相对于SVM来说,在相对少的调参时间情况下,预测的准备率也可以比较高。
使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。

缺点

由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。



XGBoost


XGBoost是一个大规模、分布式的通用Gradient Boosting库,它在GB框架下实现了GBDT和一些广义线性机器学习算法。

XGBoost与GBDT的区别


Bagging、RF、Boosting、Adaboost、GBDT

Bagging:可以看成投票选举的方式。通过训练多个模型(每个模型从初始训练集中随机选取出N个组成训练集训练模型),将这些训练好的模型进行加权组合来获得最终的输出结果(分类/回归)。

在特征一定的情况下,用Bagging思想去提升效果。

RF:RF在Bagging的基础上做了修改。在样本集中采用Boostrap采样N个样本,建立CART树,在树的每个节点上,从所有属性中随机选择K个属性,选择出一个最佳属性特征作为节点。

随机森林既可以处理离散属性,也可以处理连续值

Boosting:Boosting算法是一个迭代过程,每次新的训练都是为了改进上一次的结果。Boosting在采样时给样本增加了一个权重,使得Loss Function尽量考虑哪些分错类的样本。

Boosting采样的不是样本,而是样本的分布。对分类正确的样本降低权重,分类错误的样本增加权重(通常是边界附近的点),最有加权组合多个弱分类器

Adaboost:对数据集,建立个弱分类器。每次将分错的数据权重提高,将分对的数据权重降低,再进行分类。

每次迭代的样本是一样的,即没有采样过程,只是不同样本的权重不一样

  1. 初始化训练集相等的权重,
  2. 在训练集上进行轮,每次训练后,对失败的权重加大,让学习器在后续学习中更加关注这些样本,从而得到一个预测函数,预测函数也有一定的权重。

GBDT:每一次的计算是为了减少上一次的残差,在残差梯度减少的梯度方向上建立一个新的模型

上一篇下一篇

猜你喜欢

热点阅读