专栏首页AI部落联盟干货|XGBoost进阶—调参+实战

干货|XGBoost进阶—调参+实战

1.通用参数

宏观功能可以理解为整体的功能。

1.1 booster

参数默认值是gbtree,就是每次迭代的模型选择,一共有两种:

gbtree:基于决策树的模型

gbliner:线性模型(模型效果不如gbtree,所以用的比较少)

1.2 silent

参数默认值是0,控制的是模型每次的输出信息。参数有两种选择:

1,silent模式开启,模型不会输出任何信息。

0,silent模式关闭(一般我们选择slient=0,因为这样能更好的帮助我们理解模型)

1.3 nthread

看到这个参数的第一反应就猜到是和多线程相关的,果不其然,该参数是用来控制应当输入系统的核数。如果不输入这个参数的话,算法自动检测会默认使用CPU的全部核。

2.booster参数

这里的booster参数是基于1.1的booster的选择来看的,其中gbtree的效果要远好于gblinear。

2.1 eta

参数默认值是0.3,我的理解是该值的作用是减少每一步的权重(类似于之前介绍过的Shinkage方法),以便于之后的学习有更多的学习空间,典型的取值范围是[0.01-0.2]

2.2 min_child_weight

参数默认值是1,决定的是最小叶子节点的样本权重和,当该值较大的时候,能有效的避免学习到样本的局部特征,能够有效的避免过拟合。但是如果值设置的太大,则会导致欠拟合。该参数需要根据cv(coefficient of variation)值来调整。

2.3 max-depth

参数默认值是6,该值控制的是决策树的最大深度,用来避免过拟合。试想一颗决策树的深度越大,那么这颗决策树划分样本的粒度也就更加细,也就更能学习到样本的局部特征。该参数同2.2一样,需要根据cv(coefficient of variation)值来调整。典型的取值范围是[3-10]。

2.4 max-leaf-nodes

直观解释就是:树上最大的节点或叶子数。该参数的作用和2.3类似,因此可以替代参数2.3,因为它们都用于避免决策树的过拟合。试想一颗深度为n的二叉树,其叶子节点数最多为n^2。

2.5 gamma

参数默认值是0,我们都知道,XGBoost在分裂节点时都会看分裂后损失函数的增益,只有增益大于一个阈值,才会对节点进行分裂。该参数指定的就是那个阈值,该参数越大,则表示决策树越难进行分裂,也就意味着算法越保守。该参数和损失函数息息相关。

2.6 max_delta_step

参数默认值是0,该参数限制的是每棵树权重改变的最大步长。如果该参数设置为0,则表示没有约束,如果其被赋予了某个正值,则会让算法更加保守。原文说该参数一般用不到,但是在样本不平衡的情况下,对逻辑回归很有帮助(有待测试)。

2.7 subsample

参数默认值是1,之前的文章中提到过随机采样,该参数控制的就是对于每棵树,随机采样的比例。减少这个参数的值,同样会使算法更加保守,避免过拟合,但是如果设置的过于小,可能会导致欠拟合。典型的取值范围[0.5-1.0]。

2.8 colsample_bytree

参数默认值是1,用来控制每棵树随机采样的列数的占比(每一列是一个特征)。典型的取值范围[0.5-1.0]。

2.9 colsample_bytree

参数默认值是1,用来控制树的每一级的每一次分裂,对列数的采样的占比。和2.7的作用相同。

2.10 lambda

参数默认值是1,权重的L2正则化项(类似于Ridge Regression)该参数是用来控制XGBoost中的正则化部分的,一般很少用,但是在减少过拟合方面,该参数应该还是能起到很大作用的。

2.11 alpha

参数默认值是1,权重的L1正则化项(类似于Lasso Regression),原文说该参数能应用到很高维度的情况,可以让算法的速度更快(有待测试)。

2.12 scale_pos_weight

参数默认值是1,该参数用于样本十分不平衡时,把该参数设置为一个正值,可以使算法很快收敛。

3.学习目标参数

这些参数用来控制理想的优化目标和每一步结果的度量方法。

3.1 objective

参数默认值是reg:linear,该参数就是用来定义需要被最小化的损失函数的,最常用的值有如下几个:

  • binary:logistic 二分类的逻辑回归,输出的是分类的概率,不是具体的类别。
  • multi:softmax 返回的是具体的类别,不是概率。在使用该参数的情况下,还需要设置另外一个参数:num_class,具体划分的类别数目。
  • multi:softprob multi:softmax一样,只不过返回的是样本属于各个类别的概率,而不再是具体的类别。

3.2 eval_metric

参数默认值会随着3.1参数的取值变化而变化,如果是回归问题,默认值是rmse,如果是分类问题,默认值是mae。

典型取值如下:

  • rmse(均方根误差)
  • mae(平均绝对误差)
  • logloss(负对数似然函数值)
  • error(二分类误差,阈值0.5)
  • merror(多分类错误率)
  • mlogloss(多分类logloss损失函数)
  • auc(曲线下面积)

3.3 seed

参数默认值是0,随机数的种子,设置它可以复现随机数的结果,也可以用于调整参数。


参数说了这么多,但还没说完,以后会根据实战的内容不断更新。接下来就是实战部分:

import xgboost as xgbfrom sklearn.metrics import accuracy_scorefrom xgboost import XGBClassifier
path = './data/'#准备数据 数据下载在xgboost的github上 /demo/data/dtrain = xgb.DMatrix(path+'agaricus.txt.train')dtest = xgb.DMatrix(path+'agaricus.txt.test')#准备参数param = {'max_depth':2,'eta':1,'silent':0,'objective':'binary:logistic'}#参数说明'''max_depth:树的最大深度 缺省值为6 取值范围[1,+无穷]eta:防止过拟合在更新的时候使用的收缩步长 缺省值为0.3 取值[0,1] 其实就是学习率silent:0表示运行时打印运行信息,1表示不打印运行信息 缺省值为0objective:定义学习任务和学习目标 binary:logistic表示二分类逻辑回归 输出为概率'''#设置Boosting的迭代轮数 也就是最后会用到多少颗树num_round = 3#训练bst = xgb.train(param,dtrain,num_round)
def evaluate(data,model):    pre = model.predict(data)    pre_res = [round(res) for res in pre]    y = data.get_label()    acc = accuracy_score(y,pre_res)    return acc
acc_train = evaluate(dtrain,bst)acc_test = evaluate(dtest,bst)print(acc_train)print(acc_test)

为了方便理解,以及篇幅限制,在这里就不放所有代码了,完整代码包括一般模式,xgboost和sklearn结合 fit predict方式,模型可视化,学习曲线,K折交叉验证,GridSearch CV等等,持续更新中。。。

本文分享自微信公众号 - AI部落联盟(AI_Tribe),作者:Jason Cai

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-08

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 论文阅读|How Does Batch Normalizetion Help Optimization

    Batch Normalization在2015年被谷歌提出,因为能够加速训练及减少学习率的敏感度而被广泛使用。

    AI部落联盟
  • 一文了解端到端的任务型对话(一)

    任务型对话模型包括两种方法:Pipeline和End2End,前面介绍了问题定义和建模(任务型对话系统公式建模&&实例说明)、Pipeline方...

    AI部落联盟
  • 微软和清华开源ConvLab: 多领域端到端对话系统平台

    本文大部分来自ConvLab: Multi-Domain End-to-End Dialog System Platform,2019年4月1...

    AI部落联盟
  • Python 函数中的参数类型

    Python 中函数的参数类型比较丰富,比如我们经常见到 *args 和 **kwargs 作为参数。初学者遇到这个多少都有点懵逼,今天我们来把 Python ...

    码农小胖哥
  • Python 学习之 def 函数

    当我们定义了一个 function(),并不意味着我们要调用它,所以我们需要运行这个 function(),一个简单的办法就是在 input 框中输入 func...

    Python技术与生活认知的分享
  • 干货 | 拒绝日夜调参:超参数搜索算法一览

    感谢阅读「美图数据技术团队」的第 25 篇原创文章,关注我们持续获取美图最新数据技术动态。

    美图数据技术团队
  • Java 可变参数

    Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。注意:可变参数必须位于最后一项。当可变参数个数多余一...

    MonroeCode
  • Python函数参数之全面讲解

    Python函数参数 Python函数参数 本文主要介绍Python的函数参数,各种形式的参数。建议动手试试,可以加深理解。 函数参数 定义函数的时候,我们把参...

    1846122963
  • 如何使用高大上的方法调参数

    本文主要介绍作者与 Elad Hazan, Adam Klivans 合作的最新论文: Hyperparameter Optimization: A Spec...

    AI研习社
  • Python 函数

    一份执着✘

扫码关注云+社区

领取腾讯云代金券