机器学习---手推xgboost

XGBOOST算法总结

  • 1. 前言
  • 2. xgboost可以做什么
  • 3. xgboost的兄弟们
    • 3.1 简单介绍adaboost/GBDT
  • 4. 手推xgboost
  • 5. 如何分裂结点构造一棵树

1. 前言

一直都有听说xgboost的大名,并且在kaggle比赛中也是获奖法宝,更有甚者有人说模型不精准就上xgboost。最近阅读相关xgboost的文章,将自己所能获得的知识记录下来,用通俗易懂的语言表述出来,在后续的学习中温故而知新。

2. xgboost可以做什么

在机器学习中,其实很大一部分算法实现的目的归根到底是分类和回归问题。给一张图片,判断图片里的实体是小猫还是小狗,或者给你一堆历年房价的数据,拟合一条曲线。当然面临不同的问题算法也不一样,就像你不能用线性回归去拟合天气的变化趋势等复杂问题。而xgboost作为集成学习中非常出色的一种算法,解决的其实也是分类和回归问题

在分类问题中,有逻辑回归,决策树等基础算法;在回归问题中,有线性回归等……但是这些算法在面临复杂问题时,要么面临着数据维度过大,比如逻辑回归,当特征过多时,目标函数的项数会呈几何增加;要么单一的分类器显得绝对而苍白,如决策树,准确率不够。所以这就要引入集成学习,将多个弱分类器集成在一起,共同决策,俗称“三个臭皮匠,顶个诸葛亮”。

3. xgboost的兄弟们

集成学习,是指构建多个分类器(弱分类器)对数据集进行预测,然后用某种策略将多个分类器预测的结果集成起来,作为最终预测结果。每个分类器之间要具有一定的准确性,不同分类器要存在差异性,这个很好理解,如果两个分类器一模一样,就没有存在的必要了。并且一般来说,会存在一个指标,用于判断在加入一个新的学习器之后,整体的性能是否有提升。

集成学习根据各个弱分类器之间有无依赖关系,分为BoostingBagging两大阵营:

  1. Boosting:各分类器之间有依赖关系,必须串行,比如Adaboost、GBDT(Gradient Boosting Decision Tree)、Xgboost等;
  2. Bagging流派,各分类器之间没有依赖关系,可各自并行,比如随机森林(Random Forest)

弱分类器:
弱分类器有很多,在boosting中用到比较多的是决策树,xgboost就是很多CART树的集成,CART(Classification And Regression Tree),分类回归树,是分类树和回归树的总称。

分类树顾名思义是用于做分类问题的树,根据分类的方式不同——信息增益、信息增益率、基尼指数等可以分为ID3、C4.5等不同的算法。
回归树自然就是做回归问题的树,可以用分为一类样本的平均值作为预测值,当然还有很多方式。

3.1 简单介绍adaboost/GBDT

AdaBoost,前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。

GBDT,与AdaBoost增加分类错误样本的权重这一思想不同,GBDT每一次的计算是都为了减少上一次的残差,进而在残差减少(负梯度)的方向上建立一个新的模型,也就是在下一个分类器中不会得到全体样本的原始数据,得到的是样本的残差数据。

残差是指实际的值减去现有的分类器组合在一起得出的预测值。比如房价真实值为100万,在经过第一个分类器后预测为80万,那么残差=100-80=20万,输入下一个分类器的数据就是20万,经过第二个分类器预测值为10万,与第一个分类器进行组合得到新的分类器,所以新的预测值为80+10=90万,此时残差=100-90=10万,在迭代完成后,理想的情况是经过所有学习器的集成,预测值和准确值的残差接近0。
那么为什么说是负梯度呢,回归任务下,GBDT 在每一轮的迭代时对每个样本都会有一个预测值,此时的损失函数为均方差损失函数,
在这里插入图片描述
此时的负梯度是这样计算的
在这里插入图片描述
可以看出负梯度就是残差。

4. 手推xgboost

其实xgboost可以说是GBDT中的一种,因为它也是用残差来输入下一个分类器的。事实上,如果不考虑解决问题上的一些差异,xgboost与gbdt比较大的不同就是目标函数的定义。
机器学习---手推xgboost_第1张图片
具体xgboost的原理讲解推荐这篇博客,通俗理解kaggle比赛大杀器xgboost

这篇博文讲的很详细,大家可以参阅,以下推导过程仅记录博主手推xgboost的笔记

机器学习---手推xgboost_第2张图片
机器学习---手推xgboost_第3张图片
在通过最小化损失函数obj,计算分类前后obj之差,得出Gain之后,可以说仅仅只是得出一个判断树结构好坏的指标,还没有说如何完成一颗树的构建。很显然,一棵树的生成是由一个节点一分为二,然后不断分裂最终形成为整棵树。那么树怎么分裂的就成为了接下来我们要探讨的关键。

5. 如何分裂结点构造一棵树

在求出了树结构的损失函数obj,需要最小化Obj来寻找最优的树形结构,并且得出了一个指标Gain=上一颗树的Obj-下一颗树的Obj,不难看出Gain是越大越好,因为只有Obj差值越大,树形结构才会往最优的结构构造。即从所有的树结构中寻找最优的树结构是一个NP-hard问题,因此在实际中往往采用贪心法来构建出一个次优的树结构,基本思想是从根节点开始,每次对一个叶子节点进行分裂,针对每一种可能的分裂,根据特定的准则选取最优的分裂。不同的决策树算法采用不同的准则,如IC3算法采用信息增益,C4.5算法为了克服信息增益中容易偏向取值较多的特征而采用信息增益比,CART算法使用基尼指数和平方误差,XGBoost也有特定的准则来选取最优分裂,那就是分裂前后损失函数的差值Gain,我们已经计算出Gain为:

机器学习---手推xgboost_第4张图片
XGBoost采用最大化这个差值作为准则来进行决策树的构建,通过遍历所有特征的所有
取值,寻找使得损失函数前后相差最大时对应的分裂方式。此外,由于损失函数前后存在差
值一定为正的限制,此时γ起到了一定的预剪枝效果。

你可能感兴趣的:(机器学习,算法,python,机器学习,人工智能)