机器之心整理
作者:蒋思源
近日,ApacheCN 开放了 XGBoost 中文文档项目,该项目提供了 XGBoost 相关的安装步骤、使用教程和调参技巧等中文内容。该项目目前已完成原英文文档 90% 的内容,机器之心简要介绍了该文档并希望各位读者共同完善它。
梯度提升树已经在实践中证明可以有效地用于分类和回归任务的预测挖掘。之前我们所选择的提升树算法一直都是 MART(multiple additive regression tree)。但从 2015 年开始,一种新的且总是获胜的算法浮出了水面:XGBoost。这种算法重新实现了树提升,并在 Kaggle 和其它数据科学竞赛中屡获佳绩,因此受到了人们的欢迎。
在介绍陈天奇等人提出的 XGBoost 之前,我们需要先了解一些关于提升方法的概念。首先提升方法是一种使用多个更简单的模型来拟合数据的学习算法,它所用的这些更简单的模型也被称为基本学习器(base learner)或弱学习器(weak learner)。它通过改变训练样本的权重而学习多个分类器,并将这些分类器进行线性组合以提升分类性能。
对于 AdaBoost 算法来说,提高那些被前一轮弱分类器错误分类样本的权重,而降低那些被正确分类样本的全职。这样,那些没有得到正确分类的数据,由于权重的加大而受到后一轮的弱分类器的更大关注,因此分类问题就被一些列弱分类器分而治之。
若我们将提升算法与树方法结合起来,就能构建提升树算法,它在很多 Kaggle 竞赛中都能得到十分优秀的结果。提升后的树模型可以看作是自适应基函数模型,其中的基函数是分类回归树。提升树模型是多个树模型的和,所以也被称为树集成或加性树模型(additive tree model)。一般来说,提升树往往使用很浅的分类回归树,即仅有少数叶结点的回归树。相对于更深度的树,这样的方差较低,但偏差更大。
因此,在提升树模型(即自适应的确定邻域)的帮助下,MART 和 XGBoost 一般可以比其它方法实现更好的拟合。它们可以执行自动特征选择并且获取高阶交互,而不会出现崩溃。
通过比较 MART 和 XGBoost,尽管 MART 确实为所有树都设置了相同数量的叶结点,但 XGBoost 通过设置 Tmax 和一个正则化参数而使树变得更深,且同时仍然让方差保持很低。相比于 MART 的梯度提升,XGBoost 所使用的牛顿提升很有可能能够学习到更好的结构。XGBoost 还包含一个额外的随机化参数,即列子采样,这有助于进一步降低每个树的相关性。
因此总而言之,XGBoost 在很多方面都优于一般的 MART 算法,它带来了一种改进提升树的新方法。
在最近的 ApacheCN 项目中,他们开放了一份 XGBoost 中文文档:可伸缩且灵活的梯度提升。
该项目不仅包含完整的安装指南:
安装页面提供了有关如何在各种操作系统上构建和安装 xgboost 软件包的说明. 由如下两个步骤组成:
1. 首先, 从 C++ 代码中构建共享库(针对 linux/osx 的是 libxgboost.so 然后针对 windows 的是 libxgboost.dll)。
2. 然后, 安装相关的编程语言软件包(例如. Python 软件包)。
重要提示:最新版本的 xgboost 使用子模块来维护软件包, 所以当你 clone repo 时, 记得按如下方式使用递归选项。
git clone --recursive https://github.com/dmlc/xgboost
针对使用 github 工具的 windows 用户, 可以打开 git shell, 然后输入以下命令。
git submodule init
git submodule update
如果你在安装期间有任何问题, 请首先参考 故障排除部分. 如果其中的说明不适合你, 请放心的到 xgboost-doc-zh/issues 上提问题, 或者如果你能解决该问题, 最好发起一个 pull request。
安装页面内容目录
除了安装外,学习教程页面还介绍了提升树、AWS 上的分布式 XGBoost YARN 和 DART Booster。这三个教程都有详细的推导或实现步骤,是 XGBoost 包中的官方教程。
在我们正式使用 XGBoost 时,还有很重要的步骤就是参数调整。该文档的参数调整部分介绍了如何理解 Bias-Variance(偏差-方差)权衡、控制过拟合和处理不平衡的数据集等方面。
此外,本文档还提供了非常重要的 XGBoost 运行过程,包括 libsvm 文本格式、Numpy 2 维数组和 xgboost 二进制缓存文件等数据接口,参数设置、训练过程、预测和绘图等方法。以下是使用 Python 的概要:
import xgboost as xgb
# 读取数据
dtrain = xgb.DMatrix('demo/data/agaricus.txt.train')
dtest = xgb.DMatrix('demo/data/agaricus.txt.test')
# 通过 map 指定参数
param = {'max_depth':2, 'eta':1, 'silent':1, 'objective':'binary:logistic' }
num_round = 2
bst = xgb.train(param, dtrain, num_round)
# 预测
preds = bst.predict(dtest)
本文为机器之心整理,转载请联系本公众号获得授权。