机器学习笔记--xgboost核心思想

今天给大家讲xgboost,这是一个非常优秀的算法,在各大回归类的人工智能竞赛中,经常可以在榜首看到这个算法的身影。

前面我们已经讲了决策树,提升树(BoostingDecision Tree)是迭代多棵决策树来共同决策,当采用平方误差作为损失函数的时候,每一棵树学习的是之前所有树之和的残差值,残差=真实值-预测值。

比如A的年龄是18岁,第一棵树的预测值是13岁,与真实值相差了5岁(就是我们说的残差),那么第二棵树的预测目标就是5岁,如果第二棵树的预测结果是5岁,那么两棵树的预测值相加就是18岁,即A的真实年龄。如果第二棵树的预测值是4岁,那么两棵树预测值相加是17岁,与真实值残差1岁,继续学。

梯度提升树GBDT是一种更广泛的boosting算法,当损失函数是平方损失和指数损失的时候,每一步优化是很简单的,但对一般损失函数而言,往往每一步优化没那么容易,比如绝对值损失函数和Huber损失函数。

更一般地说,使得损失函数最小化的方法,就是调整参数,使得损失沿着梯度方向下降。(不懂就去翻周志华的西瓜书)。

XGBoost最初由陈天奇开发的,陈天奇是美国华盛顿大学的博士生,主攻大规模机器学习。这是一个牛人,到底有多牛有兴趣可以去百度一下。

XGBoost除了对GBDT算法进行修改以外,还在【工程上】做了大量的优化,使得xgboost算法在准确性和运算速度上都比GBDT有了很大提升,真正实现了又快又准。。。

算法上的优化:

  1. xgboost在代价函数里加入了正则项,用于控制模型得复杂度,降低了过拟合的可能性。正则项里包含了树的叶子节点的个数、每个叶子节点上输出的score的L2模的平方和。
  2. 列抽样。XGBoost借鉴了随机森林的做法,支持列抽样,不仅防止过拟合,还能减少计算;
  3. 对缺失值的处理。对于特征的值有缺失的样本,XGBoost还可以自动学习出它的分裂方向;
  4. 节点分裂的方式不同,gbdt是用gini系数,xgboost是经过优化推导后的。
  5. 传统的GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数,二阶导数有利于梯度下降的更快更准。使用泰勒展开取得函数做自变量的二阶导数形式,可以在不选定损失函数具体形式的情况下,仅仅依靠输入数据的值就可以进行叶子分裂优化计算,本质上也就把损失函数的选取和模型算法优化/参数选择分开了,这种去耦合增加了xgboost的适用性,使得它按需选取损失函数,可以用于分类,也可以用于回归

工程上的优化:

  1. xgboost工具支持并行。注意xgboost的并行并不是tree粒度的并行,xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复的使用这个结构,大大减小计算量。这个block结构也使得并行成为可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
  2. 有效利用硬件资源。这是通过在每个线程中分配内部缓冲区来存储梯度统计信息来实现缓存感知来实现的。

。。。。

看了陈天奇的算法优化,我懂了一个道理,要想算法搞得好,软件硬件都得懂。。。。

python 里已经有了封装好的xgboost,我们不需要自己造轮子,直接用命令pip install xgboost安装即可。

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