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

相关文章

来自专栏人工智能LeadAI

从学习 Paddle 开始学习深度学习

优点 灵活性:PaddlePaddle支持广泛的神经网络结构和优化算法,很容易配置复杂的模型,如基于注意力(Attention)机制或复杂的内存(Memory)...

3453
来自专栏北京马哥教育

搭建python机器学习环境以及一个机器学习例子

作者 | hzyido 来源 | 简书 糖豆贴心提醒,本文阅读时间6分钟,文末有秘密! 这篇文章介绍了Python机器学习环境的搭建,我用的机器学习开...

55512
来自专栏AI研习社

让 TensorFlow 估算器的推断提速百倍,我是怎么做到的?

TensorFlow 估算器提供了一套中阶 API 用于编写、训练与使用机器学习模型,尤其是深度学习模型。在这篇博文中,我们描述了如何通过使用异步执行来避免每次...

1002
来自专栏机器学习算法原理与实践

tensorflow机器学习模型的跨平台上线

    在用PMML实现机器学习模型的跨平台上线中,我们讨论了使用PMML文件来实现跨平台模型上线的方法,这个方法当然也适用于tensorflow生成的模型,但...

1542
来自专栏AI研习社

Github 推荐项目 | GloVe 的快速实现 —— Mittens

该软件包包含 GloVe 和 Mittens 的快速 TensorFlow 和 NumPy 实现。

1793
来自专栏杨熹的专栏

如何应用 BERT :Bidirectional Encoder Representations from Transformers

上一篇文章介绍了 Google 最新的BERT (Bidirectional Encoder Representations from Transformers...

1492
来自专栏AI研习社

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

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

881
来自专栏Script Boy (CN-SIMO)

魔法少女【动态规划问题】——NYOJ1204

1062
来自专栏用户2442861的专栏

Caffe学习:Blobs, Layers, and Nets

-注意:网络结构是设备无关的,Blob和Layer=隐藏了模型定义的具体实现细节。定义网络结构后,可以通过Caffe::mode()或者Caffe::set_m...

580
来自专栏青青天空树

取随机数

  常用于去随机数的函数为rand()(在stdlib.h头文件中,不同的编译器可能有不同),但是实际在使用这个函数时却发现每次程序运行产生的数都是一样的,这是...

1222

扫码关注云+社区