模型融合和提升算法详解(bagging和boosting)

1.两者的区别

(1)样本的选择上:Bagging:训练集是在原始数据上进行有放回的随机抽样,在原始数据中选出的各个训练集是相互独立的。Boosting:每一轮的训练集不变,只是训练集当中每一个样本在分类器当中的权重发生变化,且权重是根据上一轮的分类结果进行调整。
(2)样本权重:Bagging:进行均匀抽样,每一个样本的权重相等。Boosting:根据上一轮分类结果的错误率不断调整样本的权重,错误率越大则权重越高。
(3)预测函数:Bagging:所有预测函数的权重相等。Boosting:每一个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重
(4)并行计算:Bagging:每一个预测函数都可以并行生成。Boosting:各个预测函数只能顺序生成,因为后一个模型的参数需要前一轮模型的调整
下面是相关图解:
模型融合和提升算法详解(bagging和boosting)_第1张图片
模型融合和提升算法详解(bagging和boosting)_第2张图片

2.相关算法

2.1随机森林(RandomForest)

随机森林是一种Bagging算法,其基模型为决策树,关于决策树的讲解可以看这篇文章,可用于分类和回归问题。具体的过程如下所示
1.从原始训练集中使用Bootstraping(有放回的随机抽样)方法随机有放回采样选出m个样本,共进行n_tree次采样,生成n_tree个训练集
2.对于n_tree个训练集,我们分别训练n_tree个决策树模型
3.对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数选择最好的特征进行分裂
4.每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝
5.将生成的多棵决策树组成随机森林。对于分类问题,按多棵树分类器投票决定最终分类结果;对于回归问题,由多棵树预测值的均值决定最终预测结果

2.2 Adaboost(adaptive boosting)

Adaboost是一种boosting经典算法,基模型也是决策树模型
具体算法流程如下所示:
1.计算样本权重
赋予训练集中每一个样本一个权重,构成权重向量D,将权重向量D初始化相等值。假设我们有m个样本,则每一个样本的权重相等,就是1/m.
2.计算错误率
在训练集中训练出一个弱分类器,并计算分类器的错误率
在这里插入图片描述
3.计算弱分类器的权重
为当前的分类器赋予权重alpha,则alpha的计算公式为:
在这里插入图片描述
4.调整权重值
根据上一次训练结果,调整权重值,上一次分错的权重增加,分对的权重减少。
模型融合和提升算法详解(bagging和boosting)_第3张图片
之后,在同一个训练集上面在一次训练弱分类器,循环上述过程,直到训练错误率为0或者弱分类器的数目达到指定数目。
5.最终强分类器结果
模型融合和提升算法详解(bagging和boosting)_第4张图片

2.3 随机森林和adaboost的区别

adaboost:通过调整错分数据点的权重来更新模型,即样本的概率分布,减少上一轮被正确分类的样本权重,提高被错误分类的样本权值,对于最终预测,将所有的树加权投票进行预测,每一个树的权重跟错误率有关
随机森林:训练每一棵树的时候,随机森林挑选部分样本数据进行训练,每一个样本的权重相等,对于所有的树的结果按照少数服从多数进行预测。

2.4 GBDT(Gradient Boosting Decision Tree)

是一种基于决策树的分类回归模型。

2.5 XGBoost(Extreme Gradient Boosting)

2.5.1 梯度提升算法(Gradient boosting)

XGBoost的基础为梯度提升算法,是集成学习当中Boosting的代表算法。集成算法通过在数据上构建多个弱评估器,整合所有的弱评估器的预测结果,以获得比单个弱评估器更好的回归和分类结果。其中弱评估器定义为至少比随机猜测好的模型,即预测结果不低于50%的模型。Xgboost是根据梯度提升树发展而来的,其背后为cart树,也就是xgboost的所有的树都是二叉树。
首先,梯度提升回归树是专注于回归的树模型的提升集成模型,其建模过程大致如下:开始先建立一棵树,然后逐 渐迭代,每次迭代过程中都增加一棵树,逐渐形成众多树模型集成的强评估器。
模型融合和提升算法详解(bagging和boosting)_第5张图片
对于决策树而言,每个被放入模型的任意样本i最终一个都会落到一个叶子节点上。而对于回归树,每个叶子节点上的值是这个叶子节点上所有样本的均值。
模型融合和提升算法详解(bagging和boosting)_第6张图片
而分类树的预测为少数服从多数的策略。对于梯度提升回归树,每一个样本的预测结果就是所有树上面的结果的加权求和。
XGB vs GBDT 核心区别1求解预测值 的方式不同
GBDT中预测值是由所有弱分类器上的预测结果的加权求和,其中每个样本上的预测结果就是样本所在的叶子节 点的均值。而XGB中的预测值是所有弱分类器上的叶子权重直接求和得到,计算叶子权重是一个复杂的过程。

2.5.2 有放回的随机抽样

模型融合和提升算法详解(bagging和boosting)_第7张图片
首先我们有一个巨大的数据集,在建第一棵树时,我们对数据进行初次又放回抽样,然后建模。建模完毕后,我们对 模型进行一个评估,然后将模型预测错误的样本反馈给我们的数据集,一次迭代就算完成。紧接着,我们要建立第二 棵决策树,于是开始进行第二次有放回抽样。但这次有放回抽样,和初次的随机有放回抽样就不同了,在这次的抽样 中,我们加大了被第一棵树判断错误的样本的权重。也就是说,被第一棵树判断错误的样本,更有可能被我们抽中。
基于这个有权重的训练集来建模,我们新建的决策树就会更加倾向于这些权重更大的,很容易被判错的样本。建模完 毕之后,我们又将判错的样本反馈给原始数据集。下一次迭代的时候,被判错的样本的权重会更大,新的模型会更加 倾向于很难被判断的这些样本。如此反复迭代,越后面建的树,越是之前的树们判错样本上的专家,越专注于攻克那 些之前的树们不擅长的数据对于一个样本而言,它被预测错误的次数越多,被加大权重的次数也就越多。我们相信,只要弱分类器足够强大,随着模型整体不断在被判错的样本上发力,这些样本会渐渐被判断正确。如此就一定程度上实现了我们每新建一棵树模型的效果都会提升的目标。

2.5.3 目标函数的求解

在这里插入图片描述
上述为XGBoost的目标函数,左边为正常的损失函数,衡量偏差,模型越不准确,则值就会越大,表示为预测值和真实值之间的差异,右边为模型的复杂度,衡量方差,模型越复杂,则学习就会越具体,我们的目标就是求解Obj的最小值,也就是求解方差和偏差的平衡点,以求的模型的泛化误差最小,运行速度最快。我们知道树模型和树的集成模型是容易过拟合的模型,需要通过剪枝操作降低过拟合的风险,但是XGBoost的损失函数考虑到模型的复杂度,也就是他更加的聪明,可以学习到使得方差降低,降低了过拟合的风险,这也是XGBoost如此强大的原因之一。

我们通过优化第一棵树,优化完毕之后再优化第二棵树,直至优化第k棵树为止。
模型融合和提升算法详解(bagging和boosting)_第8张图片
损失函数就变成:
模型融合和提升算法详解(bagging和boosting)_第9张图片
其中constant表示为前t-1棵树的模型复杂度
假设使用MSE作为损失函数的前一项:
模型融合和提升算法详解(bagging和boosting)_第10张图片
进行泰勒二阶展开:
模型融合和提升算法详解(bagging和boosting)_第11张图片
其中:
模型融合和提升算法详解(bagging和boosting)_第12张图片
有很多常数项:则变成:
模型融合和提升算法详解(bagging和boosting)_第13张图片
模型的正则化项:
模型融合和提升算法详解(bagging和boosting)_第14张图片
在这里插入图片描述
使用L2正则化项:
模型融合和提升算法详解(bagging和boosting)_第15张图片
模型融合和提升算法详解(bagging和boosting)_第16张图片
模型融合和提升算法详解(bagging和boosting)_第17张图片
模型融合和提升算法详解(bagging和boosting)_第18张图片
令:
模型融合和提升算法详解(bagging和boosting)_第19张图片
则:
模型融合和提升算法详解(bagging和boosting)_第20张图片
求偏导:
模型融合和提升算法详解(bagging和boosting)_第21张图片

模型融合和提升算法详解(bagging和boosting)_第22张图片
求解最佳分枝:
模型融合和提升算法详解(bagging和boosting)_第23张图片
模型融合和提升算法详解(bagging和boosting)_第24张图片
在这里插入图片描述
XGB vs GBDT 核心区别2:正则项的存在
在普通的梯度提升树GBDT中,我们是不在目标函数中使用正则项的。但XGB借用正则项来修正树模型天生容易 过拟合这个缺陷,在剪枝之前让模型能够尽量不过拟合。

3 GBDT和XGBoost的区别

  1. 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
  2. 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
  3. xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
  4. Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
  5. 列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
  6. 对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
  7. xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

引用:链接

你可能感兴趣的:(面试技巧,机器学习)