甲乙小朋友的房子

甲乙小朋友很笨,但甲乙小朋友不会放弃

0%

机器学习框架-xgboost参数调节指南(Python版)

本文大多来自于参考文献2.的翻译。

Xgboost参数

XGBoost作者将参数分为3类:

  1. 基本(General)参数:指导整体函数
  2. 提升(Booster)参数:在每一步指导每个提升(树或回归)
  3. 学习任务(Learning Task Parameters)参数:指导优化模型表现

基本参数

booster

  1. 默认值:gbtree
  2. 含义:在每次迭代中的模型类型,有两种选择:
  • gbtree:树模型
  • gblinear:线性模型

silent

  1. 默认值:0
  2. 含义
  • 0=运行时打印running messages
  • 1=不打running messages

nthread

  1. 运行时的最大线程数
  2. 默认值:占当前计算机的最大线程

提升参数

这里仅仅介绍树模型(gbtree)的相关参数。

eta

  1. 学习步长
  2. default=0.3
  3. 一般调整下限为0.01-0.2

min_child_weight

  1. 表示所有孩子节点(all observations required in a child)的最小权重和
  2. 一般都用来控制过拟合。
  3. 但如果调得太高就会导致欠拟合。
  4. default=1

max_depth

  1. default=6
  2. 用来控制过拟合
  3. 一般在3-10之间

gamma

  1. default=0
  2. range: [0,∞]
  3. 模型在默认情况下,对于一个节点的划分只有在其损失函数得到结果大于0的情况下才进行,而gamma给定了所需的最低损失函数的值
  4. gamma值使得算法更conservation,且其值依赖于损失函数,在模型中应该进行调参。

max_delta_step

  1. default=0
  2. 在最大化步长的时候,我们允许每个树的权重去估算它。
  3. 当max_delta_step=0时,意味着没有误差
  4. 当max_delta_step>0时,意味着结果更保守
  5. 一般不需要调参。但当类别及不平衡的逻辑回归时可能会用到。

subsample [default=1]

Same as the subsample of GBM. Denotes the fraction of observations to be randomly samples for each tree. Lower values make the algorithm more conservative and prevents overfitting but too small values might lead to under-fitting. Typical values: 0.5-1

colsample_bytree [default=1]

Similar to max_features in GBM. Denotes the fraction of columns to be randomly samples for each tree.

Typical values: 0.5-1 ### colsample_bylevel [default=1] Denotes the subsample ratio of columns for each split, in each level. I don’t use this often because subsample and colsample_bytree will do the job for you. but you can explore further if you feel so.

lambda [default=1]

L2 regularization term on weights (analogous to Ridge regression) This used to handle the regularization part of XGBoost. Though many data scientists don’t use it often, it should be explored to reduce overfitting.

alpha [default=0]

L1 regularization term on weight (analogous to Lasso regression) Can be used in case of very high dimensionality so that the algorithm runs faster when implemented

scale_pos_weight [default=1]

A value greater than 0 should be used in case of high class imbalance as it helps in faster convergence. Control the balance of positive and negative weights, useful for unbalanced classes. A typical value to consider: sum(negative cases) / sum(positive cases) See Parameters Tuning for more discussion. Also see Higgs Kaggle competition demo for examples: R, py1, py2, py3

控制正负样本权重的平衡。一般对非平衡的很有用。一个很特殊的取值是:负样本个数/正样本个数。

不均衡数据在xgboost中的处理

官方文档:

对于一些case,比如:广告点击日志,数据集极不平衡。这会影响xgboost模型的训练,有两个方法来改进它。

如果你关心的预测的ranking order(AUC): – 通过scale_pos_weight来平衡正负类的权重 – 使用AUC进行评估

如果你关心的是预测的正确率: – 不能再平衡(re-balance)数据集 – 将参数max_delta_step设置到一个有限的数(比如:1)可以获得效果提升.

学习任务参数

objective [default=reg:linear]

  1. default=reg:linear
  2. 定义学习任务及相应的学习目标,可选的目标函数如下:
  • “reg:linear” –线性回归。
  • “reg:logistic” –逻辑回归。
  • “binary:logistic” –二分类的逻辑回归问题,输出为概率。
  • “binary:logitraw” –二分类的逻辑回归问题,输出的结果为wTx。
  • “count:poisson” –计数问题的poisson回归,输出结果为poisson分布。在poisson回归中,max_delta_step的缺省值为0.7。(used to safeguard optimization)
  • “multi:softmax” –让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)
  • “multi:softprob” –和softmax一样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。没行数据表示样本所属于每个类别的概率。
  • “rank:pairwise” –set XGBoost to do ranking task by minimizing the pairwise loss

eval_metric

  1. 默认值根据objective参数调整
  2. 用来验证数据的参数
  3. 几个典型值:
  • rmse – root mean square error
  • mae – mean absolute error
  • logloss – negative log-likelihood
  • error – Binary classification error rate (0.5 threshold)
  • merror – Multiclass classification error rate
  • mlogloss – Multiclass logloss
  • auc: Area under the curve

seed [default=0]

The random number seed. Can be used for generating reproducible results and also for parameter tuning.

例:CTR问题的正样本过少

参考文献[xgboost导读和实战]

《xgboost导读和实战》中提到,CTR问题的正样本很稀疏,根据理论推导,会导致叶子节点权重变大,进而导致每一步的估计step过大。

这时可以调节以下参数:

min_child_weight

默认为1.是每个叶子里h的和至少是多少。对正负样本不均衡时的0-1分类而言,假设h在0.01附近,min_child_weight为1意味着叶子节点中最少需要包含100 个样本。这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。

eta shrinkage 参数,用于更新叶子节点权重时,乘以该系数,避免步长过大。参数值越大,越可能无法收敛。把学习率eta设置的小一些,小学习率可以使得后面的学习更加仔细。

scale_pos_weight 如果优化的是仅仅展示排序,就是AUC的话,可以采用平衡正负样本权重的 办法调大正样本权重。设置 scale_pos_weight就可以把正样本权重乘这个系数。如果还需要优化回归的性能,还需要在此基础上做下 recalibration。

max_delta_step 如果设立了该值,对叶子节点的权重值做了约束在 [max_delta_step,max_delta_step]。以防在某些 loss 下权重值过大,默认是 0(其实代表 inf)。可以试试把这个参数设置到 1-10 之间的一个值。这样会防止做太大的更新步子, 使得更新更加平缓。

交叉验证

xgboost自带的交叉验证据说很好用。

下面是参考文献3给出的一个使用案例:

cvresult = xgb.cv(xgb_param, 
                    xgtrain, num_boost_round=alg.get_params()['n_estimators'],
                    nfold=cv_folds,
                    metrics='auc', early_stopping_rounds=early_stopping_rounds, show_progress=False)

其中: - xgb_params:参数 - xgtrain:训练集 - num_boost_round:树个数(迭代次数) - nfold:kfold的k - metrics:在CV中的评价度量指标 - early_stopping_rounds:Activates early stopping. CV error needs to decrease at least every round(s) to continue. Last entry in evaluation history is the one from best iteration.

参考文献

  1. 《xgboost导读和实战》
  2. Xgboost深入浅出
  3. Complete Guide to Parameter Tuning in XGBoost (with codes in Python)
  4. xgboost参数官方文档
  5. XGBoost参数调优完全指南(附Python代码)
  6. 如何处理偏斜类(imbalanced classes)
  7. XGBoost Parameters