【机器学习】树类模型总结

目录

 

前言

决策树算法

Bagging——RF

Boosting——GBDT、XGBOOST、LIGHTGBM、CATBOOST


前言

想对自己所学的东西进行一个总结。

决策树算法

决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。

1. ID3

  • 信息增益:表示得知特征X的信息而使得类Y的信息的不确定性减少的程度
  • 使用信息增益准则选择特征
  • 分裂至信息增益很小或者没有特征可选为止
  • 只有树的生成,容易过过拟合

2. C4.5

  • 信息增益倾向于选择取值较多的特征,所以C4.5在ID3基础上利用信息增益比

3. CART

  • 考虑了剪枝,CART算法由特征选择、决策树生成、决策树剪枝
  • 特征选择:回归树用平方误差最小化准则,分类树用基尼指数最小化原则
  • 决策树生成:基于训练集生成决策树,树尽量大
  • 决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝标准
  • 熵与基尼指数:熵是描述随机变量的不确定性,基尼指数描述的是集合的不确定性

Bagging——RF

  • Bagging:给定一个大小为n的训练集D,Bagging算法从中均匀、有放回地(即使用自助抽样法,bootstrap)选出m个大小为n'的子集Di,作为新的训练集。在这m个训练集上使用分类、回归等算法,则可得到m个模型,再通过取平均值(回归)、投票(分类)等方法,即可得到Bagging的结果。

RF

  • 随机森林采用了Bagging的思想,基分类器可以是回归数、分类树
  • 可以用来解决分类和回归问题,因为基分类器可以是回归树、分类树。
  • RF具有较好的准确率,减小方差。
  • 能够有效地运行在大数据集上,或者高维数据集,特征子集随机选择的。可以评估特征的重要性。(可以参考博客:https://www.cnblogs.com/justcxtoworld/p/3447231.html)
  • 对数据缺失不敏感
  • 可以并行进行,因为每棵树都是独立的。

Boosting——GBDT、XGBOOST、LIGHTGBM、CATBOOST

  • Boosting可以用来提高其他弱分类算法的识别率,也就是将其他的弱分类算法作为基分类算法放于Boosting 框架中,通过Boosting框架对训练样本集的操作,得到不同的训练样本子集,用该样本子集去训练生成基分类器;每得到一个样本集就用该基分类算法在该样本集上产生一个基分类器,这样在给定训练轮数 n 后,就可产生 n 个基分类器,然后Boosting框架算法将这 n个基分类器进行加权融合,产生一个最后的结果分类器
  • Boosting方法训练基分类器时采用串行的方式,各个基分类器之间有依赖。它的基本思路是将基分类器层层叠加,每一层在训练的时候,对前一层基分类器分错的样本,给予更高的权重。测试时,根据各层分类器的结果的加权得到最终结果。

GBDT

  • 基分类器是决策回归树。
  • 每一轮迭代,对所有样本进行训练,目标是去拟合上一轮的残差(预测值和真实值的差)
  • 当损失函数是均方误差时,求导后的梯度即为残差
  • 当损失函数为其他时,用当前基分类器的负梯度去近似代替残差

上式为损失函数的一阶泰勒展开,T为残差,这个时候T如果选择负梯度,那么L后面的一部分就是减去梯度的平方,则损失函数一定可以收敛。

  • 串行进行

Xgboost

  • 是GBDT的加强版,以叫X (Extreme) GBoosted
  • 详细介绍可以参考https://blog.csdn.net/v_JULY_v/article/details/81410574
  • 相比较GBDT的目标函数不同点

【机器学习】树类模型总结_第1张图片

  • 箭头所指为损失函数,方框处为正则项,椭圆处是常数项
  • 对于损失函数,展开至泰勒二阶导,f(t)为当前的树

  • 上图为正则化项,T为叶子个数,w为叶子节点的分数
  • 目标函数只依赖于每个数据点在误差函数上的一阶导数g和二阶导数h
  • 分裂节点:枚举所有不同树结构的贪心法,计算分裂增益。对于所有的特征x,我们只要做一遍从左到右的扫描就可以枚举出所有分割的梯度和GL和GR。然后用计算Gain的公式计算每个分割方案的分数就可以了
  • 分裂节点:近似算法。对于某个特征k,算法首先根据特征分布的分位数找到特征切割点的候选集合Sk​={sk1​,sk2​,...,skl​},然后将特征kkk的值根据集合Sk划分到桶(bucket)中,接着对每个桶内的样本统计值G、H进行累加统计,最后在这些累计的统计量上寻找最佳分裂点。有两种近似算法,一种是全局算法,即在初始化tree的时候划分好候选分割点,并且在树的每一层都使用这些候选分割点;另一种是局部算法,即每一次划分的时候都重新计算候选分割点。(建议参考https://blog.csdn.net/anshuai_aw1/article/details/83025168)
  • Level-wise迭代方式:XGBoost采用的是按层生长level(depth)-wise生长策略,能够同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合;但不加区分的对待同一层的叶子,带来了很多没必要的开销。因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。
  • 预排序:首先,空间消耗大。这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如排序后的索引,为了后续快速的计算分割点),这里需要消耗训练数据两倍的内存。其次时间上也有较大的开销,在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。

LightGBM

  • 可以参考(https://www.biaodianfu.com/lightgbm.html)
  • 相比Xgboost的优点:更快更准内存低,可以并行学习,可以处理大规模数据,支持直接使用类别特征。
  • LightGBM使用的是histogram算法,占用的内存更低,数据分隔的复杂度更低。其思想是将连续的浮点特征离散成k个离散值,并构造宽度为k的Histogram。然后遍历训练数据,统计每个离散值在直方图中的累计统计量。在进行特征选择时,只需要根据直方图的离散值,遍历寻找最优的分割点。消耗的内存降低,计算也降低。同时相当于增加了正则,放弃了数据的差异。同时直方图做差也加快了计算
  • 使用了带有深度限制的按叶子生长 (leaf-wise)算法。LightGBM采用leaf-wise生长策略,每次从当前所有叶子中找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
  • 直接支持类别特征
  • 离散特征分到bin中,个数较少的bin过滤掉
  • 支持高效并行:特征并行,不同机器在不同特征集上分别寻找最优分裂点,通过在本地保存全部数据避免对数据切分结果的通信;。数据并行,不同机器拥有不同数据集本地构建直方图,再全局合并,找到最佳分裂点。用分散规约(Reduce scatter)把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。
  • LightGBM可以不需要通过所有样本计算信息增益了,而且内置特征降维技术,所以更快。可以参考(https://zhuanlan.zhihu.com/p/89360721),GOSS(单边梯度采样法)和EFB(互斥特征绑定)。
  • GOSS:如果一个样本的梯度较小,证明这个样本训练的误差已经很小了,所以不需要计算了。为了不改变数据的分布,在保留大梯度样本的同时,随机地保留一些小梯度样本,同时放大了小梯度样本带来的信息增益。这样说起来比较抽象,我们过一遍流程: 首先把样本按照梯度排序,选出梯度最大的a%个样本,然后在剩下小梯度数据中随机选取b%个样本,在计算信息增益的时候,将选出来b%个小梯度样本的信息增益扩大 (1 - a )/ b 倍。这样就会避免对于数据分布的改变。
  • EFB:特征降维技术。举个例子,对于一列特征[1,nan,1,nan,1]和一列特征[nan,1,nan,1,nan],他们正好可以合并成一列特征[1,2,1,2,1]。目标就是在于找到这样的特征并且将他们合并在一起。能减少维度,又能将它们分出来。

CatBoost

  • 网上资料不多,大致了解可以参考https://www.jianshu.com/p/49ab87122562
  • 它自动采用特殊的方式处理类别型特征(categorical features)。首先对类别型特征做一些统计,计算某个类别特征出现的频率,之后加上超参数,生成新的数值型特征。

  • catboost还使用了组合类别特征,可以利用到特征之间的联系,这极大的丰富了特征维度

  • catboost的基模型采用的是对称树,同时计算leaf-value方式和传统的boosting算法也不一样,传统的boosting算法计算的是平均数,而catboost在这方面做了优化采用了其他的算法,这些改进都能防止模型过拟合

你可能感兴趣的:(机器学习,学习)