史上最详细的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 条评论
登录 后参与评论

相关文章

来自专栏机器学习实践二三事

使用Faster-Rcnn进行目标检测(实践篇)

原理 上一篇文章,已经说过了,大家可以参考一下,Faster-Rcnn进行目标检测(原理篇) 实验 我使用的代码是python版本的Faster Rcnn,官方...

5436
来自专栏BestSDK

MXNet Scala发布图像分类API|附使用教程

这次发布的 Scala,里面的推理应用程序致力于优化开发者体验。Scala 是一个通用目的程序语言,支持功能性编程和较强的静态类型系统,它被用于平台的高度分布式...

1047
来自专栏专知

【下载】PyTorch实现的神经网络翻译框架——机器翻译工具包 nmtpytorch

【导读】机器翻译是自然语言处理的重要组成部分,其目的是使用计算机自动将文本翻译成其他语言的形式。近年来,端到端的神经机器翻译发展迅速,已经成为机器翻译系统的新主...

3219
来自专栏人工智能

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

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

2088
来自专栏梦里茶室

TensorFlow 深度学习笔记 逻辑回归 实践篇

Practical Aspects of Learning Install Ipython NoteBook 可以参考这个教程 可以直接安装anaconda,里...

1757
来自专栏有趣的Python和你

Numpy库(一)什么是numpynumpy存与取csv文件numpy随机数

1174
来自专栏AI研习社

运用 MXNet Scala API 接口进行图像分类(附代码)

随着 MXNet 1.2.0 版本的发布,新的 MXNet Scala API 接口也发布了。这次发布的 Scala,里面的推理应用程序致力于优化开发者体验。S...

761
来自专栏AI科技大本营的专栏

不会用Photoshop抠图?Mask R-CNN助你一键“除”人

翻译 | 林椿眄 编辑 | 费棋 【AI科技大本营导读】:看过英剧《黑镜》吗?圣诞特别版《白色圣诞节》中有这样一个场景:其中一个未来科技有自由屏蔽人像的功能,可...

3727
来自专栏企鹅号快讯

如何在Python中快速进行语料库搜索:近似最近邻算法

选自Medium 作者:Kevin Yang 机器之心编译 参与:路雪 最近,我一直在研究在 GloVe 词嵌入中做加减法。例如,我们可以把「king」的词嵌入...

1755
来自专栏专知

Tensorflow Eager Execution入门指南

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

47212

扫描关注云+社区