史上最详细的XGBoost实战(上)

作者:章华燕

编辑:祝鑫泉

环境介绍:

· Python版本:3.6.2

· 操作系统:Windows

· 集成开发环境:PyCharm

安装Python环境:

1.安装Python:

首先,我们需要安装Python环境。本人选择的是64位版本的Python 3.6.2。去Python官网https://www.python.org/选择相应的版本并下载。如下如所示:

接下来安装,并最终选择将Python加入环境变量中。

2.安装依赖包:

可以去网址:http://www.lfd.uci.edu/~gohlke/pythonlibs/中去下载你所需要的如下Python安装包:

numpy-1.13.1+mkl-cp36-cp36m-win_amd64.whl

scipy-0.19.1-cp36-cp36m-win_amd64.whl xgboost-0.6-cp36-cp36m-win_amd64.whl

假设上述三个包所在的目录为D:\Application,则运行Windows 命令行运行程序cmd,并将当前目录转到这两个文件所在的目录下。并依次执行如下操作安装这两个包:

>> pip install numpy-1.13.1+mkl-cp36-cp36m-win_amd64.whl

>> pip install scipy-0.19.1-cp36-cp36m-win_amd64.whl

>> pip install xgboost-0.6-cp36-cp36m-win_amd64.whl

3.安装Scikit-learn

众所周知,scikit-learn是Python机器学习最著名的开源库之一。因此,我们需要安装此库。执行如下命令安装scikit-learn机器学习库:

>> pip install -U scikit-learn

4.测试是否安装成功

from sklearn import svm
X = [[0, 0], [1, 1]]>>> y = [0, 1]
clf = svm.SVC() >>> clf.fit(X, y)
clf.predict([[2., 2.]]) array([1])
import xgboost as xgb

注意:如果如上所述正确输出,则表示安装完成。否则就需要检查安装步骤是否出错,或者系统是否缺少必要的Windows依赖库。常用的一般情况会出现缺少VC++运行库,在Windows 7、8、10等版本中安装Visual C++ 2015基本上就能解决问题。

5.安装PyCharm

  • 对于PyChram的下载,请点击PyCharm官网去下载,当然windows下软件的安装不用解释,傻瓜式的点击 下一步 就行了。

注意:PyCharm软件是基于Java开发的,所以安装该集成开发环境前请先安装JDK,建议安装JDK1.8。

经过上述步骤,基本上软件环境的问题全部解决了,接下来就是实际的XGBoost库实战了……

XGBoost的优点

1.正则化

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

2.并行处理

XGBoost工具支持并行。Boosting不是一种串行的结构吗?怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。

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

3.灵活性

XGBoost支持用户自定义目标函数和评估函数,只要目标函数二阶可导就行。

4.缺失值处理

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

5.剪枝

XGBoost 先从顶到底建立所有可以建立的子树,再从底到顶反向进行剪枝。比起GBM,这样不容易陷入局部最优解。

6.内置交叉验证

XGBoost允许在每一轮boosting迭代中使用交叉验证。因此,可以方便地获得最优boosting迭代次数。而GBM使用网格搜索,只能检测有限个值。

XGBooST详解:

1.数据格式

XGBoost可以加载多种数据格式的训练数据:  

  1. libsvm 格式的文本数据;
  2. Numpy 的二维数组;
  3. XGBoost 的二进制的缓存文件。加载的数据存储在对象 DMatrix 中。

下面一一列举:

  • 加载libsvm格式的数据 >>> dtrain1 = xgb.DMatrix('train.svm.txt')
  • 加载二进制的缓存文件 >>> dtrain2 = xgb.DMatrix('train.svm.buffer')
  • 加载numpy的数组 >>> data = np.random.rand(5,10) # 5 entities, each contains 10 features >>> label = np.random.randint(2, size=5) # binary target >>> dtrain = xgb.DMatrix( data, label=label)
  • 将scipy.sparse格式的数据转化为 DMatrix 格式 >>> csr = scipy.sparse.csr_matrix( (dat, (row,col)) ) >>> dtrain = xgb.DMatrix( csr )
  • 将 DMatrix 格式的数据保存成XGBoost的二进制格式,在下次加载时可以提高加载速度,使用方式如下 >>> dtrain = xgb.DMatrix('train.svm.txt') >>> dtrain.save_binary("train.buffer")
  • 可以用如下方式处理 DMatrix中的缺失值: >>> dtrain = xgb.DMatrix( data, label=label, missing = -999.0)
  • 当需要给样本设置权重时,可以用如下方式 >>> w = np.random.rand(5,1) >>> dtrain = xgb.DMatrix( data, label=label, missing = -999.0, weight=w)

2.参数设置

XGBoost使用key-value字典的方式存储参数:

params = {

'booster': 'gbtree', 'objective': 'multi:softmax', # 多分类的问题 'num_class': 10, # 类别数,与 multisoftmax 并用

'gamma': 0.1, # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子。

'max_depth': 12, # 构建树的深度,越大越容易过拟合 'lambda': 2, # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。

'subsample': 0.7, # 随机采样训练样本

'colsample_bytree': 0.7, # 生成树时进行的列采样 'min_child_weight': 3, 'silent': 1, # 设置成1则没有运行信息输出,最好是设置为0.

'eta': 0.007, # 如同学习率

'seed': 1000, 'nthread': 4, # cpu 线程数}

3.训练模型

有了参数列表和数据就可以训练模型了

num_round = 10

bst = xgb.train( plst, dtrain, num_round, evallist )

4.模型预测

# X_test类型可以是二维List,也可以是numpy的数组

dtest = DMatrix(X_test) ans = model.predict(dtest)

5.保存模型

  • 在训练完成之后可以将模型保存下来,也可以查看模型内部的结构

bst.save_model('test.model')

  • 导出模型和特征映射(Map)

你可以导出模型到txt文件并浏览模型的含义:

# dump model

bst.dump_model('dump.raw.txt')

# dump model with feature map

bst.dump_model('dump.raw.txt','featmap.txt')

6.加载模型

通过如下方式可以加载模型:

bst = xgb.Booster({'nthread':4}) # init model

bst.load_model("model.bin") # load data

好长好长累了吧? 快给作者和编辑鼓掌!!!

还有么? 有!!!

未完待续。。。

休息一下,坐等更新哇。

PS:

1. 考虑到文章太长,就给大家写成分段“函数”了。

2.后续为大家讲解参数详解以及实战

原文发布于微信公众号 - 机器学习算法全栈工程师(Jeemy110)

原文发表时间:2017-10-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏专知

Tensorflow Eager Execution入门指南

本文介绍了最新版的Tensorflow 1.7的功能及其使用方法,重点介绍其中最有趣的功能之一eager_execution,它许用户在不创建静态图的情况下运行...

49012
来自专栏人工智能

作为TensorFlow的底层语言,你会用C+构建深度神经网络吗?

选自Matrices.io 作者:Florian Courtial 机器之心编译 参与:李泽南、蒋思源 很多人都知道 TensorFlow 的核心是构建在 C+...

2208
来自专栏AI研习社

Github 项目推荐 | 用 Numpy 实现简单的 GAN

本库能够让开发者用 Numpy 一步步实现简单的 GAN。不使用 GPU 的话,生成所有的数字会花费大量的时间,如果你只想用 CPU 来训练的话,建议只训练一个...

812
来自专栏AI研习社

Github 项目推荐 | 用 JavaScript 实现的神经网络 —— brain.js

不过,一般的开发者应该都不会用神经网络来实现异或的功能吧,所以这里有一个更加实际的例子:训练一个神经网络来识别颜色对比 https://brain.js.org...

912
来自专栏ATYUN订阅号

使用多种工具组合进行分布式超参数优化

在这篇文章中,我介绍如何使用工具组合来加速超参数优化任务。这里提供了Ubuntu的说明,但可以合理地应用于任何*nix系统。

764
来自专栏AI研习社

Github 项目推荐 | Windows 10上的 GPU 加速深度学习工具

有很多工具能够帮助开发者在 Linux 和 Mac 上构建深度学习环境(比如 Tensorflow,不幸的是,TensorFlow 无法在 Windows 上轻...

1272
来自专栏付越的专栏

深度学习入门篇--手把手教你用 TensorFlow 训练模型

最近笔者终于跑通 TensorFlow Object Detection API的ssd_mobilenet_v1 模型,这里记录下如何完整跑通数据准备到模型使...

4.2K2
来自专栏落花落雨不落叶

写了个学习正则的小工具

3166
来自专栏人人都是极客

五分钟喝不完一杯咖啡,但五分钟可以带你入门TensorFlow

本文是《人人都能学人工智能-TensorFlow系列》文章的第一篇,这个系列会对TensorFlow的基础使用,SoftMax,交叉熵,Dropout,CNN,...

42112
来自专栏AI研习社

Github 项目推荐 | Basel Face Model 2017 完全参数化人脸

本软件可以从 Basel Face Model 2017 里生成完全参数化的人脸,论文链接: https://arxiv.org/abs/1712.01619 ...

3737

扫码关注云+社区