首先需要说一下决策树:
三个主要步骤:特征选择——决策树生成——决策树修剪
ID3和C4.5分类树,CART树即可分类也可以回归。
在进行特征选择时,各个算法采用的选择分裂准则不同:
ID3算法使用信息增益准则,选择信息增益最大(互信息、熵最小)的特征作为分裂属性。
C4.5算法使用信息增益比准则,选择信息增益比最大的特征作为分裂属性。
CART算法使用基尼指数准则,选择基尼指数最小的特征作为分裂属性。
但当CART算法用于回归的时候,用平方误差最小化准则。故又称为最小二乘回归树生成算法。
信息熵:熵越大,随机变量的不确定性就越大,分类能力就越低.
剪枝主要为了防止过拟合:分为预剪枝和后剪枝
预剪枝:在构建决策树中,提前终止决策树生长。但这种方法不常用,因为我们无法判断什么时候终止生长。
后剪枝:在决策树构成后剪枝。包括:PEP悲观错误剪枝;MEP最小错误剪枝;CCP:代价复杂度剪枝(CART树度量每减少一个叶节点所得到的平均错误);EBP:基于错误的剪枝。
决策树的优点:训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等。
在工业应用中,决策树比较多,在kangle比赛中,基于决策树的XBOOST效果优异。在于决策树特征不用归一化,速度快,非线性,适合已加工过的高维特征。
bagging与boost:
但是,决策树也存在一些缺点,容易过拟合,虽然有剪枝的操作,但是还是不够。由多个弱决策树分类器,加权或投票的得到一个强分类器、
组合模型(bagging 与 boost),这些算法最终的结果是生成N(可能会有几百棵以上)棵树,这样可以大大的减少单决策树带来的毛病。
Bootstrap是一种有放回的抽样方法思想。两方面:bagging和boosting
虽然都是有放回的抽样,但二者的区别在于:Bagging采用有放回的均匀取样,而Boosting根据错误率来取样(Boosting初始化时对每一个训练例赋相等的权重1/n,然后用该学算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重),因此Boosting的分类精度要优于Bagging。Bagging的训练集的选择是随机的,各轮训练集之间相互独立,而Boostlng的各轮训练集的选择与前面各轮的学习结果有关。
boost:最初为每个样例赋予相同的权重,通过迭代的方式,对每一次分类错误的样例给予更高的权重。进行N次迭代,得到N个分类器,再将它们组合起来(加权或投票),最终得到结果 .
随机森林是在bagging基础上,有放回的采样,随机选取K个特征,同时独立的建立N个决策树,最后由投票表决的方式决定最后的结果。并行
GBDT(Gradient Boost Decision Tree 梯度提升决策树),GBDT的核心就在于:每一棵树学的是之前所有树结论和的残差,迭代、串行。将决策树结果累加的得到最后的结果。故可知,GBDT基于回归树(CART树)。
xgboos也是以(CART)为基学习器的GB算法,但是扩展和改进了GDBT。相比GBDT的优点有:
(1)xgboost在代价函数里自带加入了正则项,用于控制模型的复杂度。
(2)特征抽样采样并行(xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。),xgboost在进行节点的分裂时,支持各个特征多线程进行增益计算,因此算法更快,准确率也相对高一些。
(3)优化时,GBDT梯度下降一阶求导,xgboost是二阶泰勒级数展开。
(4)传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
XGBOOST参数:https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/
Adaboost(自适应增强)是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。在训练集的不同子集上,多次调用弱学习算法,最终按加权方式联合多次弱学习算法的预测结果就可得到最终学习结果。
与Boosting算法不同的是,adaboost算法不需要预先知道弱学习算法学习正确率的下限即弱分类器的误差,并且最后得到的强分类器的分类精度依赖于所有弱分类器的分类精度,
Adaboost(Adaptive Boosting)算法,对于boosting算法,存在两个问题:
1. 如何调整训练集,使得在训练集上训练的弱分类器得以进行;
2. 如何将训练得到的各个弱分类器联合起来形成强分类器。
针对以上两个问题,adaboost算法进行了调整:
1. 使用加权后选取的训练数据代替随机选取的训练样本,这样将训练的焦点集中在比较难分的训练数据样本上;
2. 将弱分类器联合起来,使用加权的投票机制代替平均投票机制。让分类效果好的弱分类器具有较大的权重,而分类效果差的分类器具有较小的权重。
RandomForest 与 GBDT 的区别:
相同点:
1.都由很多棵树组成
2.最终的结果是由多棵树一起决定的
不同点:
1.RandomForest中的树可以是分类树,也可以是回归树,而GBDT只能由回归树(CART)组成,这也说明GBDT各个树相加是有意义的
2.RandomForest中的树是并行生成的,而GBDT是串行生成的,GBDT中下一颗树要去拟合前一颗树的残差,所以GBDT中的树是有相关关系的,而RandomForest中的树的相关性依赖于Boostrap生成的样本子集的相关性
3.RandomForest 对异常值不敏感,GBDT敏感
4.RandomForest是通过降低模型方差来提高性能的,而GBDT是通过降低偏差来提高性能
GBDT 与 XGBOOST的比较:
1.传统的GBDT以CART树作为基分类器,而XGBOOST还支持线性分类器,此时的线性分类器自带正则项
2.传统的GBDT在优化时,只用到了loss function的一阶导信息,而XGBOOST对loss function做了Taylor展开,用到了二阶导信息
3.XGBOOST在loss function中引入了正则项,防止过拟合,正则项里包含叶节点数以及每个叶节点上的score的L2的平方和
在计算划分增益时,如果gain < gamma, 不划分,gain> gamma,划分,这相当于决策树的预剪枝。 gamma是叶节点个数的参数
4.XGBOOST还借用了RandomForest中的列抽样思想,也支持在划分节点时,只考虑部分属性
(现状sklearn中的GBDT也实现了列抽样)
5.XGBOOST可以自动学习出缺失值的分裂方向,论文中的default direction
(具体做法时,遍历的尝试将所有的缺失值分裂到所有方向{left or right},split and default directions with max gain)
6.XGBOOST实现了并行化,这个并行化是特征粒度上的并行化:划分节点时,每个特征并行计算,同时每个特征的划分节点也是并行计算(这是加速最猛的处理)
7.XGBOOST提出了block的概念,简单的说将排序后的特征值放在block中,以后划分特征的时候,只需要遍历一次即可,因为决策树在处理属性值时,需要将属性值先排序,这是最耗时的步骤,而block预先存储了排序的特征值,在后续过程中可以重复利用这个结构中的数据,同时,计算每个特征的划分增益可以并行处理了
Collecting statistics for each column can be parallelized,giving us a parallel algorithm for split finding!!
8.贪心算法在选择最佳划分方式时需要遍历所有的划分点子集,在数据非常大时,这会非常低效,xgboost提出了近似直方图计算,根据数据的二阶导信息进行排序,提出一些候选划分点子集