xgboost参数_XGBoost参数详解 二

简介:

在上节中介绍了XGBoost相关算法的原理,在本节主要介绍xgboost参数含义与实例演示,方便以后查看。使用XGBoost改进模型比较复杂,希望我早点修成正果。

目录

  1. XGBoost优势
  2. 了解XGBoost参数
  3. 调整参数(带示例)

一、 XGBoost优势

我一直很钦佩这种算法在预测模型中注入的增强功能。当我更多地探索其高精度背后的性能和科学时,我发现了许多优点:

  • 正则:
    • 标准GBM实现没有像XGBoost那样的正则化,因此它也有助于减少过度拟合。
    • 实际上,XGBoost也被称为“ 正则化增强 ”技术。
  • 并行处理:
    • XGBoost实现了并行处理,与GBM相比速度更快
    • 但请继续,我们知道提升是顺序进程,那么如何进行并行化呢?我们知道每棵树只能在前一棵树之后构建,那么是什么阻止我们使用所有核心制作树?我希望你能得到我来自的地方。请查看此链接以进一步探索。
    • XGBoost还支持Hadoop上的实现。
  • 高灵活性
    • XGBoost允许用户定义自定义优化目标和评估标准
    • 这为模型增加了一个全新的维度,我们可以做的事情没有限制。
  • 处理缺失值
    • XGBoost有一个内置的例程来处理缺失值。
    • 用户需要提供与其他观察值不同的值,并将其作为参数传递。XGBoost会尝试不同的事情,因为它在每个节点上遇到缺失值,并了解将来丢失值的路径。
  • 树修剪:
    • 当GBM在分割中遇到负损失时,它将停止分割节点。因此,它更像是一种贪婪的算法
    • 另一方面,XGBoost分割到指定的max_depth,然后开始向后修剪树并删除没有正增益的分裂。
    • 另一个优点是,有时负损失的分割表示-2后可能会出现正损失+10的分裂。GBM会在遇到-2时停止。但是XGBoost会更深入,它会看到分裂的+8和两者的综合效果。
  • 内置交叉验证
    • XGBoost允许用户在每次增强过程的迭代中运行交叉验证,因此很容易在一次运行中获得精确的最佳增强迭代次数。
    • 这与GBM不同,我们必须运行网格搜索,并且只能测试有限的值。
  • 继续使用现有模型
    • 用户可以从上一次运行的最后一次迭代开始训练XGBoost模型。这在某些特定应用中具有显着优势。
    • sklearn的GBM实现也具有此功能,因此它们甚至在这一点上。

XGBoost作者将整体参数分为3类:

  1. General parameters: 控制整体功能
  2. Booster Parameters: 控制单个学习器的属性
  3. Learning Task Parameters: 控制调优的步骤

二、了解XGBoost参数

General Parameters:

  • Booster[default= gbtree]
    • 选择要在每次迭代时运行的模型类型。它有2个选项:
      • gbtree:基于树的模型
      • gblinear:线性模型
  • Slient[default = 0]:
    • 设置为1,即不会打印正在运行的消息。
    • 设置为0,打印信息。
  1. nthread [默认为未设置的最大线程数]
  • 这用于并行处理,应输入系统中的核心数,在几个核上并发
  • 如果您希望在所有核心上运行,则不应输入值,采用默认值,并且算法将自动检测

Booster Parameters

虽然有两种类型的助推器,但我 在这里只考虑 树助推器,因为它总是优于线性助力器,因此后者很少使用。

  • eta [默认值= 0.3]
    • 类似于GBM中的学习率
    • 通过缩小每一步的权重,使模型更加鲁棒
    • 典型的最终使用值:0.01-0.2
  • min_child_weight [default = 1]
    • 定义所需观察的最小权重总和。
    • 这与GBM中的min_child_leaf相似,但并不完全相同。这指的是观察的最小“权重总和”,而GBM具有最小“观察数”。
    • 用于控制过度配合。较高的值会阻止模型学习关系,这种关系可能对为树选择的特定样本高度特定。
    • 太高的值会导致欠拟合,因此应使用CV进行调整。
  • max_depth [default = 6]
    • 树的最大深度,与GBM相同。
    • 用于控制过度拟合,因为更高的深度将允许模型学习非常特定于特定样本的关系。
    • 应该使用CV进行调整。
    • 典型值:3-10
  • max_leaf_nodes
    • 树中终端节点或叶子的最大数量。
    • 可以定义代替max_depth。由于创建了二叉树,因此深度'n'将产生最多2 ^ n个叶子。
    • 如果已定义,则GBM将忽略max_depth。
  • gamma [default = 0]
    • 如果分裂能够使loss函数减小的值大于gamma,则这个节点才分裂。gamma设置了这个减小的最低阈值。如果gamma设置为0,表示只要使得loss函数减少,就分裂
    • 使算法保守。值可能会根据损耗函数而有所不同,因此应进行调整。
  • max_delta_step [default = 0]
    • 在最大增量步长中,我们允许每棵树的权重估计。如果该值设置为0,则表示没有约束。如果将其设置为正值,则可以帮助使更新步骤更加保守。
    • 通常不需要此参数,但是当类非常不平衡时,它可能有助于逻辑回归。
  • Subsample[default = 1]
    • 与GBM的子样本相同。表示观察的比例是每棵树的随机样本。
    • 较低的值使算法更加保守并防止过度拟合,但过小的值可能导致不合适。
    • 典型值:0.5-1
  • colsample_bytree [default = 1]
    • 与GBM中的max_features类似。表示每个树的随机样本列的比例。
    • 典型值:0.5-1
  • colsample_bylevel [default = 1]
    • 表示每个级别中每个拆分的列的子采样率。
    • 我不经常使用它,因为subsample和colsample_bytree会为你完成这项工作。但如果你有这种感觉,你可以进一步探索。
  • lambda [default = 1]
    • 关于权重的L2正则项(类似于岭回归)
  • 这用于处理XGBoost的正则化部分。虽然许多数据科学家不经常使用它,但应该探索减少过度拟合。
  • alpha [默认= 0]
    • L1正则化项的权重(类似于Lasso回归)
    • 可以在非常高维度的情况下使用,以便算法在实现时运行得更快
  • scale_pos_weight [default = 1]
    • 在高级别不平衡的情况下,应使用大于0的值,因为它有助于更​​快的收敛。

Learning Task Parameters

这些参数用于定义要在每个步骤计算的度量的优化目标。

  1. Objective [default = reg:linear]
  • 这定义了要最小化的损失函数。最常用的值是:
    • binary:logistic -logistic回归用于二进制分类,返回预测概率(不是类)
    • multi:使用softmax目标的softmax -multiclass分类,返回预测类(不是概率)
      • 您还需要设置一个额外的 num_class (类数)参数,用于定义唯一类的数量
    • multi:softprob -same as softmax,但返回属于每个类的每个数据点的预测概率。
  • eval_metric [默认根据目标]
    • 用于验证数据的度量标准。
    • 回归的默认值为rmse,分类的误差为error。
    • 典型值为:
      • rmse - 均方根误差
      • mae - 平均绝对误差
      • logloss - 负对数似然
      • error - 二进制分类错误率(0.5阈值)
      • merror - 多类分类错误率
      • mlogloss - 多类logloss
      • auc: 曲线下面积
  1. seed[default= 0]
  • 随机数种子。
  • 可用于生成可重复的结果,也可用于参数调整。

如果您到目前为止一直在使用Scikit-Learn,这些参数名称可能看起来并不熟悉。一个好消息是python中的xgboost模块有一个名为XGBClassifier的sklearn包装器。它使用sklearn样式命名约定。将更改的参数名称是:

  1. eta - > learning_rate
  2. lambda - > reg_lambda
  3. alpha - > reg_alpha

您一定想知道我们已经定义了除GBM中“n_estimators”参数之外的所有内容。那么它作为XGBClassifier中的参数存在。但是,在标准xgboost实现中调用fit函数时,必须将其作为“num_boosting_rounds”传递。

我建议您浏览xgboost指南的以下部分,以便更好地理解参数和代码:

  1. XGBoost参数(官方指南)
  2. XGBoost演示代码(xgboost GitHub存储库)
  3. Python API参考(官方指南)


这里只是记录一下调参的步骤。
问题1:如果数据量不大的话可否用parm_grid罗列所有可能的参数,使用GridSearchCV来验证。将所有可能的组合都尝试一下?
我的思考:时间通常无法忍受,即使数据量不大,但是参数的排列组合也是很多中的。这就好比暴力遍历所有可能的参数组合空间。首先每个参数的取值范围是多少,每一步参数变化的粒度有多大?这都没法确定。当然如果我们指定了每个参数的取值范围而且粒度也定了,假设计算资源无限,并且样本和测试同分布,这个理论上是可行的。
这里面主要是说的一般调booster参数的思路
step1:设置一些初始值。
step2:保持learning rate和其他booster相关的参数不变,调节和estimators学习器的参数。
step3:保证estimator和其他的booster参数不变,调节learning rate
step4:保持estimator和learning rate不变,调节booste相关的参数。可以从影响最大的max_depth 和min_child_weight开始。逐步调节所有可能有影响的booster参数
step5: 缩小learning rate,得到最佳的learning rate值
step6:得到一组效果还不错的参数组合

我们将从Data Hackathon 3.x AV黑客马拉松中获取数据集,与GBM文章中的相同。问题的详细信息可以在竞赛页面上找到。您可以从此处下载数据集。我执行了以下步骤:

  1. 城市变量因类别太多而下降
  2. DOB转换为Age | DOB掉线了
  3. EMI_Loan_Submitted_Missing创建,如果EMI_Loan_Submitted丢失则为1,否则为0 | 原始变量EMI_Loan_Submitted掉线
  4. 由于类别太多,EmployerName被删除
  5. Existing_EMI估算为0(中位数),因为只有111个值丢失
  6. Interest_Rate_Missing创建,如果Interest_Rate丢失则为1,否则为0 | 原始变量Interest_Rate下降
  7. Lead_Creation_Date被删除,因为对结果几乎没有直观的影响
  8. Loan_Amount_Applied,Loan_Tenure_Applied用中值估算
  9. 已创建Loan_Amount_Submitted_Missing,如果Loan_Amount_Submitted缺失,则为1,否则为0 原始变量Loan_Amount_Submitted丢弃
  10. 已创建Loan_Tenure_Submitted_Missing,如果Loan_Tenure_Submitted缺失,则为1,否则为0 原始变量Loan_Tenure_Submitted丢弃
  11. LoggedIn,Salary_Account下降了
  12. 如果Processing_Fee丢失,则创建Processing_Fee_Missing为1,否则为0 | 原始变量Processing_Fee掉线
  13. 来源 - 前2名保持不变,所有其他人合并为不同类别
  14. 执行数字和单热编码

对于那些拥有竞争原始数据的人,您可以从存储库中的data_preparation iPython笔记本中查看这些步骤。

让我们首先导入所需的库并加载数据:

参数调整的一般方法

我们将在这里使用类似于GBM的方法。要执行的各个步骤是:

  1. 选择相对较高的学习率。通常学习率为0.1,但介于0.05到0.3之间,应该适用于不同的问题。确定此学习率最佳树木数量。XGBoost有一个非常有用的函数叫做“cv”,它在每次增强迭代时执行交叉验证,从而返回所需的最佳树数。
  2. 调整树特定参数 (max_depth,min_child_weight,gamma,subsample,colsample_bytree)以确定学习速率和树木数量。请注意,我们可以选择不同的参数来定义树,我将在这里举一个例子。
  3. 调整 xgboost的正则化参数(lambda,alpha),这有助于降低模型复杂性并提高性能。
  4. 降低学习率并确定最佳参数。

让我们看一个更详细的一步一步的方法。

步骤1:修复学习速率和估计器数量,以调整基于树的参数

为了决定提升参数,我们需要设置其他参数的一些初始值。让我们采取以下价值观:

  1. max_depth = 5 :这应该在3-10之间。我从5开始,但你也可以选择不同的数字。4-6可以是很好的起点。
  2. min_child_weight = 1 :选择较小的值是因为它是高度不平衡的类问题,并且叶节点可以具有较小的大小组。
  3. gamma = 0 :也可以选择较小的值,如0.1-0.2来启动。无论如何,这将在以后进行调整。
  4. subsample,colsample_bytree = 0.8:这是一个常用的使用起始值。典型值介于0.5-0.9之间。
  5. scale_pos_weight = 1:由于高级别的不平衡。

请注意,以上所有内容仅为初步估算值,稍后会进行调整。让我们在这里采用0.1的默认学习率,并使用xgboost的cv函数检查树的最佳数量。上面定义的函数将为我们完成。

aarshayj/Analytics_Vidhya​github.com
db25e2b53c270b5b42f02b99f6039a49.png

step1:设置一些初始值,如最重要的learning_rate和estimator,由于后续grid search时间较长,所以learning_rate要较大,一般可以取0.1;

step2:保持learning rate和其他booster相关的参数不变,用cv的方法调节estimators的参数;

step3:保持estimator和learning rate不变,调节booste相关的参数。可以从影响最大的max_depth 和min_child_weight开始。然后是gamma,subsample , colsample_bytree和Regularization Parameters等,逐步调节所有可能有影响的booster参数,调节时,可以先粗粒度,确定粗粒度范围后,再细粒度调节,在调节过程中,每得到一组最佳参数后,可以尝试不断用cv的方法调节estimator参数;

step4: 最后缩小learning rate,此时estimator的数量会增加,训练时间也会较长,得到最佳的learning rate和estimator的值;

step5:得到一组较好的参数;

XGBoost

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值