ID3算法使用信息增益指标实现根节点或中间节点的字段选择,那个属性的信息增益大,选择那个属性作为分隔的节点,但是该指标存在一个非常明显的缺点,即信息增益会偏向于取值较多的字段。
信息增益率,C4.5使用
HA参考
就是在信息增益的基础上进行相应的惩罚。其中,HA为事件A的信息熵。事件A的取值越多,GainA(D)可能越大,但同时HA也会越大,这样以商的形式就实现了GainA(D)的惩罚。
条件基尼指数的计算公式可以表示为:
决策树中的C4.5算法使用信息增益率指标实现根节点或中间节点的字段选择,但该算法与ID3算法一致,都只能针对离散型因变量进行分类,对于连续型的因变量就显得束手无策了。为了能够让决策树预测连续型的因变量,Breiman等人在1984提出了CART算法,该算法也称为分类回归树。
集成学习
根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类?即个体学习器问存在强依赖关系、必须串行生成的序列化方法?以及个体学习器间不存在强依赖关系、可同时生成的并行化方法;前者的代表是 Boosting,后者的代表是 Bagging 和"随机森林" (Random Forest)。
常见的集成学习框架有三种:Bagging,Boosting 和 Stacking。三种集成学习框架在基学习器的产生和综合结果的方式上会有些区别,我们先做些简单的介绍。
Bagging 和 Stacking 中的基模型为强模型(偏差低,方差高),而Boosting 中的基模型为弱模型(偏差高,方差低)。
1.1 Bagging
Bagging 全称叫 Bootstrap aggregating,看到 Bootstrap 我们立刻想到著名的开源前端框架(抖个机灵,是 Bootstrap 抽样方法) ,每个基学习器都会对训练集进行有放回抽样得到子训练集,比较著名的采样法为 0.632 自助法。每个基学习器基于不同子训练集进行训练,并综合所有基学习器的预测值得到最终的预测结果。Bagging 常用的综合方法是投票法,票数最多的类别为预测类别。
1.2 Boosting
Boosting 训练过程为阶梯状,基模型的训练是有顺序的,每个基模型都会在前一个基模型学习的基础上进行学习,最终综合所有基模型的预测值产生最终的预测结果,用的比较多的综合方式为加权法。
1.3 Stacking
Stacking 是先用全部数据训练好基模型,然后每个基模型都对每个训练样本进行的预测,其预测值将作为训练样本的特征值,最终会得到新的训练样本,然后基于新的训练样本进行训练得到模型,然后得到最终预测结果。
随机森林属于集成算法,该算法的核心思想就是采用多棵决策树的投票机制,完成分类或预测问题的解决。对于分类问题,将多棵树的判断结果用作投票,根据少数服从多数的原则,最终确定样本所属的类型;对于预测性问题,将多棵树的回归结果进行平均,最终用于样本的预测值。
假设用于建模的训练数据集中含有N个观测、P个自变量和1个因变量,首先利用Bootstrap抽样法,从原始训练集中有放回地抽取出N个观测用于构建单棵决策树;然后从P个自变量中随机选择p个字段用于CART决策树节点的字段选择;最后根据基尼指数生长出一棵未经剪枝的CART树。最终通过多轮的抽样,生成k个数据集,进而组装成含有k棵树的随机森林。
在图10-5中,最左边为原始的训练数据集,包含N个观测和P个自变量;最右边为随机森林的输出结果。可以将图10-5中随机森林的建模过程详细描述为:
基本思想:Bagging基于bootstrap(自采样),也就是有放回的采样。训练子集的大小和原始数据集的大小相同。Bagging的技术使用子集来了解整个样本集的分布,通过bagging采样的子集的大小要小于原始集合。
Bagging是一种并行式的集成学习方法,即基学习器的训练之间没有前后顺序可以同时进行,Bagging使用“有放回”采样的方式选取训练集,对于包含m个样本的训练集,进行m次有放回的随机采样操作,从而得到m个样本的采样集,这样训练集中有接近36.8%的样本没有被采到。按照相同的方式重复进行,我们就可以采集到T个包含m个样本的数据集,从而训练出T个基学习器,最终对这T个基学习器的输出进行结合。
Boosting 是一族可将弱学习器提升为强学习器的算法.这族算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值 T , 最终将这 T 个基学习器进行加权结合。
Boosting训练过程:
属于一种有监督的集成学习算法,与前面几章介绍的监督算法类似,同样可用于分类问题的识别和预测问题的解决。该集成算法
体现了三方面的优势,分别是提升Boosting、梯度Gradient和决策树Decision Tree。提升是指将多个弱分类器通过线下组合实现强分类器的过程;梯度是指算法在Boosting过程中求解损失函数时增强了灵活性和便捷性,决策树是指算法所使用的弱分类器为CART决策树。都是由回归树组成。
梯度提升树算法实际上是提升算法的扩展版,在原始的提升算法中,如果损失函数为平方损失或指数损失,求解损失函数的最小值问题会非常简单,但如果损失函数为更一般的函数(如绝对值损失函数或Huber损失函数等),目标值的求解就会相对复杂很多。为了解决这个问题,Freidman提出了梯度提升算法,即在第m轮基础模型中,利用损失函数的负梯度值作为该轮基础模型损失值的近似,并利用这个近似值构建下一轮基础模型。利用损失函数的负梯度值近似残差的计算就是梯度提升算法在提升算法上的扩展,这样的扩展使得目标函数的求解更为方便。GBDT算法属于梯度提升算法中的经典算法.
当因变量为离散的类别变量时,无法直接利用各个类别值拟合残差r
mi(因为残差是连续的数值型)。为了解决这个问题,通常将GBDT算法的损失函数设置为指数损失函数或对数似然损失函数,进而可以实现残差的数值化。如果损失函数选择为指数损失函数,GBDT算法实际上退化为AdaBoost算法;如果损失函数选择为对数似然损失函数,GBDT算法的残差类似于Logistic回归的对数似然损失。
XGBoost是由传统的GBDT模型发展而来的,在上一节中,GBDT模型在求解最优化问题时应用了一阶导技术,而XGBoost则使用损失函数的一阶和二阶导,更神奇的是用户可以自定义损失函数,只要损失函数可一阶和二阶求导。除此,XGBoost算法相比于GBDT算法还有其他优点,例如支持并行计算,大大提高算法的运行效率;XGBoost在损失函数中加入了正则项,用来控制模型的复杂度,进而可以防止模型的过拟合;XGBoost除了支持CART基础模型,还支持线性基础模型;XGBoost采用了随机森林的思想,对字段进行抽样,既可以防止过拟合,也可以降低模型的计算量。
实际上使用二阶泰勒展开是为了xgboost能够【自定义loss function】
正如前文所说,提升算法的核心思想就是多个基础模型的线性组合,对于一棵含有t个基础模型的集成树来说,该集成树可以表示为:
1 优点
精度更高:GBDT 只用到一阶泰勒展开,而 XGBoost 对损失函数进行了二阶泰勒展开。XGBoost引入二阶导一方面是为了增加精度,另一方面也是为了能够自定义损失函数,二阶泰勒展开可以近似大量损失函数;
灵活性更强:GBDT 以 CART 作为基分类器,XGBoost 不仅支持 CART 还支持线性分类器,(使用线性分类器的 XGBoost相当于带 L1 和 L2 正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题))。此外,XGBoost工具支持自定义损失函数,只需函数支持一阶和二阶求导;
正则化:XGBoost 在目标函数中加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、叶子节点权重的 L2范式。正则项降低了模型的方差,使学习出来的模型更加简单,有助于防止过拟合;
Shrinkage(缩减):相当于学习速率。XGBoost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间;
列抽样:XGBoost 借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算;
缺失值处理:XGBoost 采用的稀疏感知算法极大的加快了节点分裂的速度;
可以并行化操作:块结构可以很好的支持并行计算。
2 缺点
“那像你提到有用到Xgboost,你有测试过Xgboost和GBDT的效果区别吗?你认为在你的项目上是什么导致原因导致了这个区别”?
答:“是的,我们有试过,Xgboost的精度要比GBDT高而且效率也要更高。我认为精度高的最大原因是大部分的CTR特征中,我们会将一些高基类别的离散值转化为连续值,会产生很多含有缺失值的稀疏特征,而Xgboost会对缺失值做一个特殊的处理。效率高是因为建树时采用了更好的分割点估计算法”
“对缺失值是怎么处理的?”
“在普通的GBDT策略中,对于缺失值的方法是先手动对缺失值进行填充,然后当做有值的特征进行处理,但是这样人工填充不一定准确,而且没有什么理论依据。而Xgboost采取的策略是先不处理那些值缺失的样本,采用那些有值的样本搞出分裂点,然后在遍历每个分裂点的时候,尝试将缺失样本划入左子树和右子树,选择使损失最优的情况。”
“那你知道在什么情况下应该使用Onehot呢?”
“对于non-ordered特征来说需要做一个onehot,实践中我发现在线性模型中将连续值特征离散化成0/1型特征效果会更好(线性模型拟合连续特征能力弱,需要将连续特征离散化 成one hot形式提升模型的拟合能力)。所以对于稠密的类别型特征,可以对离散特征做一个OneHot变化,对于高基类别特征我们最好还是采用bin count或者embedding的方法去处理”
“你能讲一下Xgboost和GBDT的区别吗?”
“Xgboost是GBDT算法的一种很好的工程实现,并且在算法上做了一些优化,主要的优化在一下几点。首先Xgboost加了一个衰减因子,相当于一个学习率,可以减少加进来的树对于原模型的影响,让树的数量变得更多;其次是在原GBDT模型上加了个正则项,对于树的叶子节点的权重做了一个约束;还有增加了在随机森林上常用的col subsample的策略;然后使用二阶泰勒展开去拟合损失函数,加快优化的效率;然后最大的地方在于不需要遍历所有可能的分裂点了,它提出了一种估计分裂点的算法。在工程上做了一个算法的并发实现,具体我并不了解如何实现的”
LightGBM使用一种全新的基于梯度的单侧采样(GOSS)技术来过滤数据实例,以寻找分割值。而XGBoost则是使用预分类算法(presorted algorithm)和基于直方图的算法来计算最佳分割。这里,实例意味着观察值/样本。
与 XGBoost 的对比
本节主要总结下 LightGBM 相对于 XGBoost 的优点,从内存和速度两方面进行介绍。
1 内存更小
2 速度更快
CatBoost是俄罗斯的搜索巨头Yandex在2017年开源的机器学习库,是Categorical Features(类别型特征)+Gradient Boosting(梯度提升) ,也是基于梯度提升决策树的机器学习框架。
大多数流行的梯度提升算法利用决策树作为基本预测器。对于数值型特征使用决策树很方便,但是实际中,许多数据集包括类别型特征,这些特征对预测也很重要。类别型特征具有离散的值,比如省份名(山东,山西,河北等),城市名(北京,上海,南京等)。梯度提升算法中处理这类特征的最常用的方法就是在学习之前,也就是数据预处理阶段,将这些特征的值转换为数字。一般类别型特征会转化为一个或多个数值型特征(one-hot编码等)。
而Catboost从名字就可以看出:可以很好的处理类别型特征的梯度提升算法,该算法的改进之处就在于在学习的时候处理这些特征,而不是在数据预处理阶段,不需要任何显式的预处理来将类别转换为数字。
不同点
第一,Catboost使用对称树。XGboost一层一层地建立节点,lightGBM一个一个地建立节点,而Catboost总是使用完全二叉树。它的节点是镜像的。Catboost称对称树有利于避免overfit,增加可靠性,并且能大大加速预测等等。
参考链接