美文网首页机器学习
XGBoost 那些事儿-- part1:算法简介及参数简介

XGBoost 那些事儿-- part1:算法简介及参数简介

作者: 泡泡_e661 | 来源:发表于2019-01-19 04:39 被阅读0次

参考原文Complete Guide to Parameter Tuning in XGBoost by Aarshay Jain

XGBoost 已经成为许多数据科学家的终极武器。XGBoost 在Kaggle等同类数据竞赛平台都取得了很好的成绩。

XGBoost 是 extreme gradient boosting的缩写。Boosting思想提出是基于下面的问题:有没有可能通过大量的弱学习模型和简单的学习模型,来生成一个有较强学习能力的模型呢?答案是肯定的。

Boosting 将一些弱学习模型组合起来,从而达到提高预测准确率的目标。它通过改变训练样本的权重(增加分错样本的权重,减小分对样本的的权重),学习多个分类器,并将这些分类器线性组合,提高分类器性能。

下面通过可视化的方法,解释为什么boosting可以提高预测准确率。用深度为1的树模型作为基础模型,来处理一个简单的分类问题。(图片来源:https://www.datacamp.com/community/tutorials/xgboost-in-python)

Box1, Box2 和Box3 都是我们说的弱学习器。深度为1的树模型,意思是每次只找到一个分类边界,如上图的D1, D2, D3。Box1 首先创建D1边界,将原数据分成左边两个+,和剩下的数据两部分。通过图像我们可以知道Box1没有将D1右半部分的+进行正确分类。因此,在Box2分类器中,增大分错的三个+的权重,Box2找到了D2分类边界。同理Box2分类器将3个 —,错误分类,所以在Box3分类器进行分类的时候,将分错的三个—权重增加,找到D3分类边界。最后我们将这3个弱分类器进行线性组合,得到Box4 分类器,可以看到Box4分类器将+和—准确的进行分类,得到准确率较高的分类结果。

下面回到XGBoost。XGBoost 是一种改进的GBDT(Gradient Boosted Decision Trees)。本文考虑的XGBoost 是基于树模型的组合,其文档提到也可以进行线性模型组合。

首先说说XGBoost 算法的优点:

1. XGBoost 算法本身包含了正则化,可以有效地避免训练过程中overfitting的问题。

2. XGBoost 可进行平行计算,加快了训练的速度。

3. XGBoost 具有较高的灵活性,允许用户自定义优化目标及评估模型的准则函数。

4. XGBoost 可以有效处理数据中的缺失值。用户在数据预处理的过程中可以忽略缺失值的处理。

5. XGBoost 内置交叉验证。在python中是xgboost.cv()。可通过validation data方便的评估模型的好坏,从而进行参数的调整。

XGBoost算法上手很容易,但是如何调整参数以得到更好的分类结果或者预测结果,是一件比较困难的事情。因为算法中有很多可调参数。

下面介绍参数的分类和其具体作用,在之后《XGBoost 那些事儿-- part2: 举例介绍参数调整》的文章中将提供参数调整的思路。当然这个思路不适应于所有的XGBoost应用,但是当你没有想法的时候,可以通过这个思路入手。

XGBoost官方文档将参数分为3个种类。分别是:General Parameters(通用参数), Booster Parameters (Booster参数)和 Learning Task Parameters(学习任务参数).

1. General Parameters 是用来总体奠定XGBoost 算法基调的。

    booster: gbtree基于树模型(默认值)

                   gblinear基于线性模型。

    slient:决定是否在训练的过程中有信息打印到屏幕上。0(默认值)是将信息打印出来,1不打印。

    nthread:与平行运算有关的参数。选择有多少个核参与训练过程的运算。

2. Booster Parameters主要用于决定树的结构。

    eta: 学习速率,可以使模型具有更强的鲁棒性,通常选择的范围0.01~0.2,默认值0.3。

    min_child_weight:定义树的最小叶子节点样本权重和,该参数也可用来控制overfitting的问题。但是设置的值太大会导致underfitting的问题,默认值1。

    max_depth: 定义树的深度,可用于控制overfitting,该参数的值设置越大,模型越复杂,会造成overfitting。通常设定范围3~10,默认值6。

    max_leaf_nodes: 一棵树叶子节点的最大数量。可以和max_depth参数相互替代,因为一旦树的深度确定了,叶子节点数也是固定的。我一般选择设置max_depth参数。

    gamma:在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。

    max_delta_step: 限制每棵树权重改变的最大步长。参数默认值是0,如果这个参数的值为0,那就意味着没有约束。通常,这个参数不需要设置。

    subsample:控制每棵树随机采样的比例。较小的值使模型倾向于简单化,从而避免了overfitting。通常选择范围:0.5~1。

    colsample_bytree:控制每棵树随机采样的列数的比例。通常选择范围:0.5~1。

    colsample_bylevel:控制树在每一个level下的每一次分裂,对列数采样的占比。与subsample和colsample_bytree具有相同作用,通常不进行设置,默认值1。

    lambda:起到Ridge regression(L2 正则化)作用。

    alpha: 起到Lasso regression (L1正则化) 作用。应用在维度较高的情况下,起到降维的作用,从而加快算法的训练速度。

    scale_pos_weight:应用于类别样本不平衡的数据。将参数设置为一个正数,可以使算法更快收敛。

3. Learning Task Parameters 主要用来定义每个计算步骤评估度量的优化目标。

    objective:用来定义需要最小化的损失函数。默认值reg:lineary,用于线性回归问题。

                      reg:logistic 用于逻辑回归问题。

                      binary:logistic 用于binary classification问题。

                      multi:softmax 用于多类分类问题。

以上是比较常用的设定值。在官方文档中还有许多不同的选择,对于特定问题,可以参考文档进行正确的选择。

    eval_metric: 默认值取决于选择的objective。用于验证数据集的度量。其值主要有rmse,mae,logloss(对数似然函数值),error,merror,mlogloss,auc。其中rmse是对应回归问题的默认值,error是对应分类问题的默认值。

    seed:随机数种子,进行设置使得每次实验结果保持一致,便于进行比较,从而调整其他参数。

请继续关注XGBoost 那些事儿--part2:举例介绍参数调整(目前还没完成编辑,😁)

喜欢本文的朋友请点个赞吧👍,或者可以关注,之后会陆续更新有关机器学习的相关内容,谢谢!!!

相关文章

网友评论

    本文标题:XGBoost 那些事儿-- part1:算法简介及参数简介

    本文链接:https://www.haomeiwen.com/subject/pifadqtx.html