参考原文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:随机数种子,进行设置使得每次实验结果保持一致,便于进行比较,从而调整其他参数。
网友评论