简介:
在上节中介绍了XGBoost相关算法的原理,在本节主要介绍xgboost参数含义与实例演示,方便以后查看。使用XGBoost改进模型比较复杂,希望我早点修成正果。
目录
- XGBoost优势
- 了解XGBoost参数
- 调整参数(带示例)
一、 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类:
- General parameters: 控制整体功能
- Booster Parameters: 控制单个学习器的属性
- Learning Task Parameters: 控制调优的步骤
二、了解XGBoost参数
General Parameters:。
- Booster[default= gbtree]
- 选择要在每次迭代时运行的模型类型。它有2个选项:
- gbtree:基于树的模型
- gblinear:线性模型
- 选择要在每次迭代时运行的模型类型。它有2个选项:
- Slient[default = 0]:
- 设置为1,即不会打印正在运行的消息。
- 设置为0,打印信息。
- 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
这些参数用于定义要在每个步骤计算的度量的优化目标。
- 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: 曲线下面积
- seed[default= 0]
- 随机数种子。
- 可用于生成可重复的结果,也可用于参数调整。
如果您到目前为止一直在使用Scikit-Learn,这些参数名称可能看起来并不熟悉。一个好消息是python中的xgboost模块有一个名为XGBClassifier的sklearn包装器。它使用sklearn样式命名约定。将更改的参数名称是:
- eta - > learning_rate
- lambda - > reg_lambda
- alpha - > reg_alpha
您一定想知道我们已经定义了除GBM中“n_estimators”参数之外的所有内容。那么它作为XGBClassifier中的参数存在。但是,在标准xgboost实现中调用fit函数时,必须将其作为“num_boosting_rounds”传递。
我建议您浏览xgboost指南的以下部分,以便更好地理解参数和代码:
- XGBoost参数(官方指南)
- XGBoost演示代码(xgboost GitHub存储库)
- 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文章中的相同。问题的详细信息可以在竞赛页面上找到。您可以从此处下载数据集。我执行了以下步骤:
- 城市变量因类别太多而下降
- DOB转换为Age | DOB掉线了
- EMI_Loan_Submitted_Missing创建,如果EMI_Loan_Submitted丢失则为1,否则为0 | 原始变量EMI_Loan_Submitted掉线
- 由于类别太多,EmployerName被删除
- Existing_EMI估算为0(中位数),因为只有111个值丢失
- Interest_Rate_Missing创建,如果Interest_Rate丢失则为1,否则为0 | 原始变量Interest_Rate下降
- Lead_Creation_Date被删除,因为对结果几乎没有直观的影响
- Loan_Amount_Applied,Loan_Tenure_Applied用中值估算
- 已创建Loan_Amount_Submitted_Missing,如果Loan_Amount_Submitted缺失,则为1,否则为0 原始变量Loan_Amount_Submitted丢弃
- 已创建Loan_Tenure_Submitted_Missing,如果Loan_Tenure_Submitted缺失,则为1,否则为0 原始变量Loan_Tenure_Submitted丢弃
- LoggedIn,Salary_Account下降了
- 如果Processing_Fee丢失,则创建Processing_Fee_Missing为1,否则为0 | 原始变量Processing_Fee掉线
- 来源 - 前2名保持不变,所有其他人合并为不同类别
- 执行数字和单热编码
对于那些拥有竞争原始数据的人,您可以从存储库中的data_preparation iPython笔记本中查看这些步骤。
让我们首先导入所需的库并加载数据:
参数调整的一般方法
我们将在这里使用类似于GBM的方法。要执行的各个步骤是:
- 选择相对较高的学习率。通常学习率为0.1,但介于0.05到0.3之间,应该适用于不同的问题。确定此学习率的最佳树木数量。XGBoost有一个非常有用的函数叫做“cv”,它在每次增强迭代时执行交叉验证,从而返回所需的最佳树数。
- 调整树特定参数 (max_depth,min_child_weight,gamma,subsample,colsample_bytree)以确定学习速率和树木数量。请注意,我们可以选择不同的参数来定义树,我将在这里举一个例子。
- 调整 xgboost的正则化参数(lambda,alpha),这有助于降低模型复杂性并提高性能。
- 降低学习率并确定最佳参数。
让我们看一个更详细的一步一步的方法。
步骤1:修复学习速率和估计器数量,以调整基于树的参数
为了决定提升参数,我们需要设置其他参数的一些初始值。让我们采取以下价值观:
- max_depth = 5 :这应该在3-10之间。我从5开始,但你也可以选择不同的数字。4-6可以是很好的起点。
- min_child_weight = 1 :选择较小的值是因为它是高度不平衡的类问题,并且叶节点可以具有较小的大小组。
- gamma = 0 :也可以选择较小的值,如0.1-0.2来启动。无论如何,这将在以后进行调整。
- subsample,colsample_bytree = 0.8:这是一个常用的使用起始值。典型值介于0.5-0.9之间。
- scale_pos_weight = 1:由于高级别的不平衡。
请注意,以上所有内容仅为初步估算值,稍后会进行调整。让我们在这里采用0.1的默认学习率,并使用xgboost的cv函数检查树的最佳数量。上面定义的函数将为我们完成。
aarshayj/Analytics_Vidhyagithub.comstep1:设置一些初始值,如最重要的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