python机器学习——xgboost简介

xgboost简介

  • (1)背景
  • (2)什么是 XGBoost
  • (3)为什么要用 XGBoost
  • (4)XGBoost 相比传统 gbdt 有何不同?xgboost为什么快?xgboost如何支持并行?
  • 参考

(1)背景

Boosting 分类器属于集成学习模型,它基本思想是把成百上千个分类准确率较低的树模型组合起来,成为一个准确率很高的模型。这个模型会不断地迭代,每次迭代就生成一颗新的树。对于如何在每一步生成合理的树,大家提出了很多的方法,我们这里简要介绍由 Friedman 提出的 Gradient Boosting Machine :它在生成每一棵树的时候采用梯度下降的思想,以之前生成的所有树为基础,向着最小化给定目标函数的方向多走一步。在合理的参数设置下,我们往往要生成一定数量的树才能达到令人满意的准确率。在数据集较大较复杂的时候,我们可能需要几千次迭代运算,如果生成一个树模型需要几秒钟,那么这么多迭代的运算耗时将会是巨大的。

现在,我们希望能通过 XGBoost 工具库就能更好地解决这个问题。XGBoost 的全称是 EXtreme Gradient Boosting 。正如其名,它是 Gradient Boosting Machine 的一个 c++ 实现,作者为华盛顿大学研究机器学习的大牛陈天奇。XGBoost 的最大特点在于,它能够自动利用 CPU 的多线程进行并行,同时在算法上加以改进提高了精度。它的处女秀是 Kaggle 的希格斯子信号识别竞赛,因为出众的效率与较高的预测准确度在比赛论坛中引起了参赛选手的广泛关注,在 1700 多支队伍的激烈竞争中占有一席之地。随着它在 Kaggle 社区知名度的提高,最近也有队伍借助 xgboost 在比赛中夺得第一。

由于其高效的 C++ 实现,xgboost在性能上超过了最常用使用的 R 包 gbm 和 Python 包 sklearn 。在 Kaggle 的希格斯子竞赛数据上,单线程 xgboost 比其他两个包均要快出 50% ,在多线程上 xgboost更是有接近线性的性能提升。由于其性能和使用便利性,xgboost 已经在 Kaggle 竞赛中被广泛使用,并已经有队伍成功借助其拿到了第一名。

python机器学习——xgboost简介_第1张图片
Kaggle 神器 xgboost,在 Kaggle 的很多比赛中,我们可以看到很多 winner 喜欢用 xgboost,而且获得非常好的表现,今天就来看看 xgboost 到底是什么以及如何应用。

(2)什么是 XGBoost

XGBoost :EXtreme Gradient Boosting
是由 Tianqi Chen 最初开发的实现可扩展,便携,分布式 gradient boosting (GBDT, GBRT or GBM) 算法的一个库,可以下载安装并应用于 C++,Python,R,Julia,Java,Scala,Hadoop,现在有很多协作者共同开发维护。

XGBoost 所应用的算法就是 gradient boosting decision tree( gbdt ),既可以用于分类也可以用于回归问题中。

而 Gradient boosting 是 boosting 的其中一种方法,所谓 Boosting ,就是将弱分离器 fi(x) 组合起来形成强分类器 F(x) 的一种方法。

所以 Boosting 有三个要素:

① 要优化的损失函数(A loss function to be optimized):例如分类问题中用 cross entropy ,回归问题用 mean squared error 。

② 弱学习器做预测(A weak learner to make predictions):例如决策树。

③ 可加模型(An additive model):将多个弱学习器累加起来组成强学习器,进而使目标损失函数达到极小。

Gradient boosting 就是通过加入新的弱学习器,来努力纠正前面所有弱学习器的残差,最终这样多个学习器相加在一起用来进行最终预测,准确率就会比单独的一个要高。之所以称为 Gradient ,是因为在添加新模型时使用了梯度下降算法来最小化的损失。

(3)为什么要用 XGBoost

前面已经知道,XGBoost 就是对 gradient boosting decision tree 的实现,但是一般来说,gradient boosting 的实现是比较慢的,因为每次都要先构造出一个树并添加到整个模型序列中。而 XGBoost 的特点就是计算速度快,模型表现好,这两点也正是这个项目的目标。

表现快是因为它具有这样的设计:

① 并行化:训练时可以用所有的 CPU 内核来并行化建树。

注意:

a). xgboost 的并行不是 tree 粒度的并行,xgboost 也是一次迭代完才能进行下一次迭代的(第 t 次迭代的代价函数里包含了前面 t-1 次迭代的预测值)。xgboost 的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost 在训练之前,预先对数据进行了排序,然后保存为 block 结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个 block 结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

b). 可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以 xgboost 还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

② 分布式计算:用分布式计算来训练非常大的模型。

③ 核外计算:对于非常大的数据集还可以进行 Out-of-Core Computing 。

④ 数据结构和算法的缓存优化:更好地利用硬件。

下图就是 XGBoost 与其它 gradient boosting 和 bagged decision trees 实现的效果比较,可以看出它比 R,python,Spark,H2O 中的基准配置要更快。

python机器学习——xgboost简介_第2张图片
另外一个优点就是在预测问题中模型表现非常好。

(4)XGBoost 相比传统 gbdt 有何不同?xgboost为什么快?xgboost如何支持并行?

如果不考虑工程实现、解决问题上的一些差异,xgboost 与 gbdt 比较大的不同就是目标函数的定义。

python机器学习——xgboost简介_第3张图片

注:红色箭头指向的 l 即为损失函数;红色方框为正则项,包括 L1、L2 ;红色圆圈为常数项。xgboost利用泰勒展开三项,做一个近似,我们可以很清晰地看到,最终的目标函数只依赖于每个数据点的在误差函数上的一阶导数和二阶导数。

① 传统 GBDT 以 CART 作为基分类器,xgboost 还支持线性分类器,这个时候 xgboost 相当于带 L1 和 L2 正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。

② 传统 GBDT 在优化时只用到一阶导数信息,xgboost 则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。另外,xgboost 工具支持自定义代价函数,只要函数可一阶和二阶求导。

③ xgboost 在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的 score 的 L2 模的平方和。从 Bias-variance tradeoff 角度来讲,正则项降低了模型的 variance ,使学习出来的模型更加简单,防止过拟合,这也是 xgboost 优于传统 GBDT 的一个特性。

④ Shrinkage(缩减),相当于学习速率( xgboost 中的 eta )。xgboost 在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把 eta 设置得小一点,然后迭代次数设置得大一点。(补充:传统 GBDT 的实现也有学习速率)

⑤ 列抽样( column subsampling )。xgboost 借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是 xgboost 异于传统 gbdt 的一个特性。

⑥ 对缺失值的处理。对于特征的值有缺失的样本,xgboost 可以自动学习出它的分裂方向。

参考

入门教程

安装教程

应用示例

最好的资源当然就是项目的 Github 主页

https://www.zhihu.com/question/37683881

你可能感兴趣的:(python机器学习及实践,python,机器学习)