[数据算法攻城狮]决策树

决策树这个分支算是很庞大了,今天来整理一下这个很流弊的东西。其实树形算法的效果是很好的,和现在深度学习一样,比如人人都接触GBDT=。=

常见的值处理

  连续值处理:emmm离散化,中位点是不错的选择。

  缺失值处理:其实就是在树生成的过程中不考虑缺失值,但是在对样本的分类过程中,对属性值未知的结点分别取对应的不带缺失值的概率,然后同时进入该结点的所有分支。换句话说,最后该样本的结果需要比较这些概率的大小。

树的剪枝操作

剪枝操作是需要同时使用训练集和验证集的,训练集找出信息增益最大的特征,验证集对选出的特征对应的分支进行精度计算。

  预剪枝:在对决策树加入特征结点的时候就计算精度,当待加入的某特征结点的精度较之前的决策树高的时候才确定加入,因此预剪枝的欠拟合是主要的问题。

  后剪枝:在决策树生成后对特征结点进行精度判断,当待删除的某特征结点较之前的决策树精度提升时才确定删除,相等时可考虑保留。一般来说,后剪枝是更好的方法。

单颗决策树

  ID3:这就是书上讲解决策树的理论时最常用的树了,直接使用信息增益(别忘了算信息增益的时候,熵是要乘以概率的)进行计算。不过直接使用信息增益有一个问题,就是当结点的取值数目较多的(也就是某一个取值下样本数较少)时,信息增益会相当高(按照信息增益的式子来看的话),这会导致过拟合,泛化能力下降。

  C4.5:改进了ID3取结点的方式,使用了信息增益率,不过从式子可以看出(还不会用数学公式的添加,之后加=。=),信息增益率偏好结点取值取值较少的,所以C4.5使用了启发式的选择方法,从信息增益高于平均水平的一堆特征(属性)中挑选出信息增益率最高的。

  CART:分类回归树,这个其实是一种决策树的标准,即建立的是二叉树,其次就是用于判断结点的并非是信息增益,而是基尼系数(式子变了,其实道理一样)。这里说说回归树,所谓的回归树其实就是为所求值给定了一个区间,这个区间的要求是MSE最小,和分类树使用信息增益等一个道理,只是指标变了=。=,当树的生成达到限定的上限或者达到划分的要求时,回归树就算生成结束了。

集成学习中的决策树

  AdaBoost:这个没什么好说的,使用全部训练集串行训练,每次错分提权->决策树的线性组合,效果还行。

  GBDT:梯度提升树,很多关于GBDT的理论写的很复杂,其实原理是和分类树的Boosting一样的,只不过分类是使用错分样本提权迭代,回归是使用MSE(或者其他损失函数)迭代,并且树的生成遵循低方差高偏差的原则(因为要迭代,所以泛化能力一定不能差),GBDT的目标就是最小化损失函数。这里不得不提一下XGBoost,XGBoost是GBDT的改进,一个是分类器的改进,GBDT使用的是CART,而XGBoost可以使用线性分类器(这个时候其实不能算是树了=。=)。一个是XGBoost的损失函数考虑了二阶导数信息(具体不是很清楚=。=),并且在损失函数中加入了正则化(例如L2范数)用于得到更简单又高效的模型。一个是XGBoost增加了叫做Shrinkage的东西,类似ETA,将树的叶结点乘上这个缩减,可以减小每颗树的影响,使之后迭代产生的弱分类器有更大的学习空间。一个是并行机制,其实Boosting是串行的,而XGBoost的并行指的是预先对数据的特征做了排序(这也是本来最耗时的地方,因为要找到最佳分割点),这样每次训练弱分类器使用的都是同样的数据,当然就可以开多线程并行了=。=

  Random Forest:与AdaBoost对应,随机抽取训练集(放回/不放回)并行训练->决策树的线性组合,一般来说效果比AdaBoost好,可以使用OOB(袋外误差)作为估计泛化能力。

  Extremely Randomized Trees:极端随机树,比Random Forest的随机性更强,ET虽是使用全部数据进行训练,但结点的选择是随机的,怎么理解呢,就是不用基尼系数这些指标去判断要不要取某个结点了,而是随机设置(当然对于不同的结点,这个随机还是会有一定范围),这样生成的树可以说每颗都不一样了,单颗树的结果是不准确的,但组合起来效果就很好,泛化能力很强。

先写这么多,撒花~~~

猜你喜欢

转载自www.cnblogs.com/leegendlee/p/8922435.html