您的位置:首页 > 其它

xgboost使用小结

2017-05-11 23:03 232 查看

简介

xgboost的全称是eXtreme Gradient Boosting。正如其名,它是Gradient
Boosting Machine的一个c++实现,作者为正在华盛顿大学研究机器学习的大牛陈天奇。他在研究中深感自己受制于现有库的计算速度和精度,因此在一年前开始着手搭建xgboost项目,并在去年夏天逐渐成型。xgboost最大的特点在于,它能够自动利用CPU的多线程进行并行,同时在算法上加以改进提高了精度。它的处女秀是Kaggle的希格斯子信号识别竞赛,因为出众的效率与较高的预测准确度在比赛论坛中引起了参赛选手的广泛关注,在1700多支队伍的激烈竞争中占有一席之地。随着它在Kaggle社区知名度的提高,最近也有队伍借助xgboost在比赛中夺得第一
为了方便大家使用,陈天奇将xgboost封装成了Python库。我有幸和他合作,制作了xgboost工具的R语言接口,并将其提交到了CRAN上。也有用户将其封装成了julia库。python和R接口的功能一直在不断更新,大家可以通过下文了解大致的功能,然后选择自己最熟悉的语言进行学习。


模型参数配置文件

1 # General Parameters, see comment for each definition
2 # choose the booster, can be gbtree or gblinear
3 booster = gbtree
4 # choose logistic regression loss function for binary classification
5 objective = binary:logistic
6
7 # Tree Booster Parameters
8 # step size shrinkage
9 eta = 1.0
10 # minimum loss reduction required to make a further partition
11 gamma = 1.0
12 # minimum sum of instance weight(hessian) needed in a child
13 min_child_weight = 100
14 # maximum depth of a tree
15 max_depth = 6
16
17 # Task Parameters
18 # the number of round to do boosting
19 num_round = 50
20 # 0 means do not save any model except the final round model
21 save_period = 0
22 # The path of training data
23 data = "a.train"
24 # The path of validation data, used to monitor training process, here [test] sets name of the validation set
25 eval[test] = "a.test"
26 # evaluate on training data as well each round
27 #eval_train = 1
28 # The path of test data
29 eval_metric = "auc"
30 eval_metric = "error"
31 test:data = "a.test"


执行方式 ./xgboost xgboost.conf


在R语言中进行图表化展现

通过R语言可以查看特征的重要度,这样我们就可以大体上看出特征的重要度,从而为特征的选择和优化提供指导。R语言的安装和使用方式如下:

安装和引用xgboost包

install.packages("xgboost")

require(xgboost)

bst2 <- xgb.load("~/Desion/0100.model")
importance_matrix <- xgb.importance(model = bst2)
print(importance_matrix)



会看到以上特征重要度的排名,也可以以图表的形式展现

xgb.plot.importance(importance_matrix)




通过install.packages("DiagrammeR") 安装DiagrammeR库可以将model中的树展现出来,方便观察特征的使用情况




辅助参数

具体参数树状图:

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。您需要指定你想要的类型的学习者,包括线性回归、逻辑回归、泊松回归等。

eval_metric : 您需要指定验证数据的评估指标,一个默认的指标分配根据客观(rmse回归,错误分类,意味着平均精度等级

seed : 随机数种子,确保重现数据相同的输出。

调参方式

首先调整max_depth ,通常max_depth 这个参数与其他参数关系不大,初始值设置为10,找到一个最好的误差值,然后就可以调整参数与这个误差值进行对比。比如调整到8,如果此时最好的误差变高了,那么下次就调整到12;如果调整到12,误差值比10 的低,那么下次可以尝试调整到15.
在找到了最优的max_depth之后,可以开始调整subsample,初始值设置为1,然后调整到0.8 如果误差值变高,下次就调整到0.9,如果还是变高,就保持为1.0
接着开始调整min_child_weight , 方法与上面同理
再接着调整colsample_bytree
经过上面的调整,已经得到了一组参数,这时调整eta 到0.05,然后让程序运行来得到一个最佳的num_round,(在 误差值开始上升趋势的时候为最佳 )
在调参的过程中可以将xgboost输出的信息以图表的形式展现出来,可以很直观的看到模型拟合程度错误率变化趋势等等,将train和test的err信息整理到一个文件中,以test_err\ttrain的格式,通过python的pyplot进行图形化,看起来更直观。
#! /usr/bin/python

import matplotlib.pyplot as plt
import sys
train_err = []
test_err = []
for line in open(sys.argv[1], 'r'):
line = line.strip()
items = line.split("\t")
test_err.append(float(items[0]))
train_err.append(float(items[1]))

ax = [x for x in xrange(len(train_err))]
plt.plot(ax, test_err, 'r')
plt.plot(ax, train_err, 'g')

plt.show()
数据格式如下:
0.342597        0.340178
0.340340        0.337891
0.340156        0.337464
0.339495        0.336616
0.339188        0.336312
0.338707        0.335860
0.338136        0.335134
0.337681        0.334631
0.337353        0.334198
0.337149        0.333973
0.337064        0.333806
0.336705        0.333291
0.336473        0.333053
0.336355        0.332813
0.336151        0.332557
0.336054        0.332360
0.335879        0.332120
0.335607        0.331786
0.335391        0.331523
0.335269        0.331344
0.335051        0.331014



可以很直观的看到模型过拟合了,尽管train数据错误率下降的很快,但是在test数据上错误率最后不降反升,这种情况就需要通过上面的调参调参方法进行调参,降低树的深度,sample等来调整过拟合
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息