【R机器学习笔记】XGBoost——XGBboost包

转载“素质云博客“,自己做了些修改,以及自己的一些见解

一、 XGBoost来历

xgboost的全称是eXtreme Gradient Boosting。正如其名,它是Gradient Boosting Machine的一个c++实现,作者为正在华盛顿大学研究机器学习的大牛陈天奇。他在研究中深感自己受制于现有库的计算速度和精度,因此在一年前开始着手搭建xgboost项目,并在去年夏天逐渐成型。xgboost最大的特点在于,它能够自动利用CPU的多线程进行并行,同时在算法上加以改进提高了精度。它的处女秀是Kaggle的希格斯子信号识别竞赛,因为出众的效率与较高的预测准确度在比赛论坛中引起了参赛选手的广泛关注,在1700多支队伍的激烈竞争中占有一席之地。随着它在Kaggle社区知名度的提高,最近也有队伍借助xgboost在比赛中夺得第一。

为了方便大家使用,陈天奇将xgboost封装成了Python库。我有幸和他合作,制作了xgboost工具的R语言接口,并将其提交到了CRAN上。也有用户将其封装成了julia库。python和R接口的功能一直在不断更新,大家可以通过下文了解大致的功能,然后选择自己最熟悉的语言进行学习。[统计之都]


二、 优势、性价比

大致其有三个优点:高效、准确度、模型的交互性。

1、 高效

xgboost借助OpenMP,能自动利用单机CPU的多核进行并行计算
Mac上的Clang对OpenMP的支持较差,所以默认情况下只能单核运行
xgboost自定义了一个数据矩阵类DMatrix,会在训练开始时进行一遍预处理,从而提高之后每次迭代的效率
它类似于梯度上升框架,但是更加高效。它兼具线性模型求解器和树学习算法。因此,它快速的秘诀在于算法在单机上也可以并行计算的能力。这使得xgboost至少比现有的梯度上升实现有至少10倍的提升。它提供多种目标函数,包括回归,分类和排序。

2、 准确性

准确度提升的主要原因在于,xgboost的模型和传统的GBDT相比加入了对于模型复杂度的控制以及后期的剪枝处理,使得学习出来的模型更加不容易过拟合。
由于它在预测性能上的强大但是相对缓慢的实现,”xgboost” 成为很多比赛的理想选择。它还有做交叉验证和发现关键变量的额外功能。在优化模型时,这个算法还有非常多的参数需要调整。

3、 模型的交互性

能够求出目标函数的梯度和Hessian矩阵,用户就可以自定义训练模型时的目标函数
允许用户在交叉验证时自定义误差衡量方法,例如回归中使用RMSE还是RMSLE,分类中使用AUC,分类错误率或是F1-score。甚至是在希格斯子比赛中的“奇葩”衡量标准AMS
交叉验证时可以返回模型在每一折作为预测集时的预测结果,方便构建ensemble模型。
允许用户先迭代1000次,查看此时模型的预测效果,然后继续迭代1000次,最后模型等价于一次性迭代2000次
可以知道每棵树将样本分类到哪片叶子上,facebook介绍过如何利用这个信息提高模型的表现
可以计算变量重要性并画出树状图
可以选择使用线性模型替代树模型,从而得到带L1+L2惩罚的线性回归或者logistic回归
来源:xgboost: 速度快效果好的boosting模型


实际案例

1、 如何实现?

看到在Python和R上都有自己的package。
R中直接install.packages即可。也可以从github上调用:

devtools::install_github('dmlc/xgboost',subdir='R-package')  

但是,注意!! XGBoost仅适用于数值型向量。是的!你需要使用中区分数据类型。如果是名义,比如“一年级”、“二年级”之类的,需要变成哑变量,然后进行后续的处理。
XGBoost有自己独有的数据结构,将数据数值化,可以进行稀疏处理。极大地加快了运算。这种独特的数据结构得着重介绍一下。

2、 one-hot encode 独热编码——独有的数据结构

这个词源于数字电路语言,这意味着一个数组的二进制信号,只有合法的值是0和1。

在R中,一个独热编码非常简单。这一步(如下所示)会在每一个可能值的变量使用标志建立一个稀疏矩阵。稀疏矩阵是一个矩阵的零的值。稀疏矩阵是一个大多数值为零的矩阵。相反,一个稠密矩阵是大多数值非零的矩阵。

sparse_matrix <- Matrix::sparse.model.matrix(response ~ .-1, data = campaign)  

现在让我们分解这个代码如下:

sparse.model.matrix这条命令的圆括号里面包含了所有其他输入参数。
参数“反应”说这句话应该忽略“响应”变量。
“-1”意味着该命令会删除矩阵的第一列。
最后你需要指定数据集名称。
其中这个-1很有意思,response代表因变量,那么为什么还要“-1”,删去第一列?

答:这个根据题意自己调整,此时的-1可能是需要分拆的变量,比如此时第一列变量名称是“治疗”,其中是二分类,“治疗”与“安慰剂治疗”。此时的-1代表把这个变量二分类变成两个变量,一个变量为“是否治疗”,另外一个是“是否安慰剂治疗”,那么就由一个名义变量转化成了0-1数值型变量了。

我认为这里是由R的formula决定的,如果不带-1,那么第一列会变成参照变量,就变成intercept,就不会在得到的稀疏矩阵中显示了,而并不是删去第一列。

想要转化目标变量,你可以使用下面的代码:

output_vector = df[,response] == "Responder" 

代码解释:

设 output_vector 初值为0。
在 output_vector 中,将响应变量的值为 “Responder” 的数值设为1;
返回 output_vector。

三、 XGBoost用法

xgb.train(params = list(), data, nrounds, watchlist = list(), obj = NULL,
  feval = NULL, verbose = 1, print_every_n = 1L,
  early_stopping_rounds = NULL, maximize = NULL, save_period = NULL,
  save_name = "xgboost.model", xgb_model = NULL, callbacks = list(), ...)

xgboost(data = NULL, label = NULL, missing = NA, weight = NULL,
  params = list(), nrounds, verbose = 1, print_every_n = 1L,
  early_stopping_rounds = NULL, maximize = NULL, save_period = 0,
  save_name = "xgboost.model", xgb_model = NULL, callbacks = list(), ...)

xgb.train接口比xgboost接口更灵活,多了watchlist用来查看输出

四、 参数

XGBoost的参数超级多,详情可以看:官方解释网站
参考:[译]快速上手:在R中使用XGBoost算法
它有三种类型的参数:通用参数、辅助参数和任务参数。

通用参数为我们提供在上升过程中选择哪种上升模型。常用的是树或线性模型。
辅助参数取决于你选择的上升模型。
任务参数,决定学习场景,例如,回归任务在排序任务中可能使用不同的参数。
让我们详细了解这些参数。我需要你注意,这是实现xgboost算法最关键的部分:

一般参数

silent : 默认值是0。您需要指定0连续打印消息,静默模式1。
booster : 默认值是gbtree。你需要指定要使用的上升模型:gbtree(树)或gblinear(线性函数)。
num_pbuffer : 这是由xgboost自动设置,不需要由用户设定。阅读xgboost文档的更多细节。
num_feature : 这是由xgboost自动设置,不需要由用户设定。


辅助参数

树提升的参数

eta:默认值设置为0.3。您需要指定用于更新步长收缩来防止过度拟合。每个提升步骤后,我们可以直接获得新特性的权重。实际上 eta 收缩特征权重的提高过程更为保守。范围是0到1。低η值意味着模型过度拟合更健壮。
gamma:默认值设置为0。您需要指定最小损失减少应进一步划分树的叶节点。更大,更保守的算法。范围是0到∞。γ越大算法越保守。
max_depth:默认值设置为6。您需要指定一个树的最大深度。参数范围是1到∞。
min_child_weight:默认值设置为1。您需要在子树中指定最小的实例权重的和,然后这个构建过程将放弃进一步的分割。在线性回归模式中,在每个节点最少所需实例数量将简单的同时部署。更大,更保守的算法。参数范围是0到∞。
max_delta_step:默认值设置为0。max_delta_step 允许我们估计每棵树的权重。如果该值设置为0,这意味着没有约束。如果它被设置为一个正值,它可以帮助更新步骤更为保守。通常不需要此参数,但是在逻辑回归中当分类是极为不均衡时需要用到。将其设置为1 - 10的价值可能有助于控制更新。参数范围是0到∞。
subsample: 默认值设置为1。您需要指定训练实例的子样品比。设置为0.5意味着XGBoost随机收集一半的数据实例来生成树来防止过度拟合。参数范围是0到1。
colsample_bytree : 默认值设置为1。在构建每棵树时,您需要指定列的子样品比。范围是0到1。
colsample_bylevel:默认为1
max_leaf_nodes:叶结点最大数量,默认为2^6


线性提升参数

lambda and alpha : L2正则化项,默认为1、L1正则化项,默认为1。这些都是正则化项权重。λ默认值假设是1和α= 0。
lambda_bias : L2正则化项在偏差上的默认值为0。
scale_pos_weight:加快收敛速度,默认为1


任务参数

base_score : 默认值设置为0.5。您需要指定初始预测分数作为全局偏差。
objective : 默认值设置为reg:linear。您需要指定你想要的类型的学习者,包括线性回归、逻辑回归、泊松回归等。
各个模型的名字
* “reg:linear” linear regression (Default).
* “reg:logistic” logistic regression.
* “binary:logistic” logistic regression for binary classification. Output probability.
* “binary:logitraw” logistic regression for binary classification, output score before logistic transformation.
* “num_class” set the number of classes. To use only with multiclass objectives.
* “multi:softmax” set xgboost to do multiclass classification using the softmax objective. Class is represented by a number and should be from 0 to num_class - 1.
* “multi:softprob” same as softmax, but prediction outputs a vector of ndata * nclass elements, which can be further reshaped to ndata, nclass matrix. The result contains predicted probabilities of each data point belonging to each class.
* “rank:pairwise” set xgboost to do ranking task by minimizing the pairwise loss.

eval_metric : 您需要指定验证数据的评估指标,一个默认的指标分配根据客观(rmse回归,错误分类,意味着平均精度等级
seed : 随机数种子,确保重现数据相同的输出。

PS: xgb.cv函数

用法

xgb.cv(params = list(), data, nrounds, nfold, label = NULL, missing = NA,
  prediction = FALSE, showsd = TRUE, metrics = list(), obj = NULL,
  feval = NULL, stratified = TRUE, folds = NULL, verbose = TRUE,
  print_every_n = 1L, early_stopping_rounds = NULL, maximize = NULL,
  callbacks = list(), ...)

基本用法同xgb.train,但可以自动交叉验证。可以设置prediction =TRUE,用于输出结果,或者在callbacks中设置 callbacks=list(cb.cv.predict(save_models = TRUE)),就可以利用交叉验证的模型了。

  • 7
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值