一、常调参数
1、max_depth[默认6]
树分裂最大深度,常用3 ~ 10之间
树越深越容易过拟合(越深模型会学到越具体越局部的样本)
树越深也会消耗更多内存且会使得训练时间变长(由于xgb会一直分裂到max_depth指定的值,再回过头来剪枝)
2、eta[默认0.3]
学习率,常用0.01 ~ 0.5之间
太大准确率不高、难以收敛(梯度值可能在最优解附近晃荡,不收敛)
太小运行速度慢
经验:learning_rate * num_round >= 1 and learning_rate * num_round <= 10
3、lambda[默认1]
权重的L1正则化项
4、alpha[默认0]
权重的L2正则化项
5、min_child_weight[默认1]
最小叶子节点样本权重和(叶子节点中的样本二阶导求和)
值较大时,可减少过拟合
值过高,会导致欠拟合
6、subsample[默认1]
每棵树随机采样的比例,常用0.5 ~ 1之间
减少此参数值,算法会更加保守写,以避免一定程度过拟合,但值太小容易欠拟合
7、colsample_bytree[默认1]
控制每棵随机采样的列数的比例(每一列一个特征),常用0.5 ~ 1之间
8、gamma[默认0]
节点分裂所需的最先损失下降
值越大,算法越保守
9、scale_pos_weight[默认1]
设置正样本权重值,以均衡正负样本权重
A typical value to consider: sum(negative instances) / sum(positive instances)
示例见https://github.com/dmlc/xgboost/blob/master/demo/kaggle-higgs/higgs-numpy.py
10、tree_method [默认auto]
树构造算法,可选auto, exact, approx, hist, gpu_hist,通常用于调整训练速度
auto:启发式选择最快的算法,表现为小数据选exact greedy,大数据选approx,建议大数据尝试使用hist或者gpu_hist,以获得更高的性能,gpu_hist支持外部内存
exact:精确贪婪算法,枚举所有候选项
approx:近似贪婪算法,using quantile sketch and gradient histogram(分位数简化图和梯度直方图)
hist:快速直方图优化approx
gpu_hist:hist算法的GPU实现
11、num_boost_round—迭代次数
12、early_stopping_rounds
迭代过程中,在n轮内是否有进步,没有就停止训练
触发这个参数(也就是确实提前停止了)的时候返回的变量会带有3个属性:best_score, best_iteration, best_ntree_limit ,这里best_ntree_limit 就是最好的模型的树的个数
但是在文档和源码中,有这么一句话 The method returns the model from the last iteration (not the best one). 就是说如果触发了这个参数的话,那么结果返回的并不是最好的模型,而是最后一轮的模型,那这不坑爹呢?!
但是后续再深入测试的时候发现,用各种指标去验证(比如rmse)的时候,结果却和最好的模型是一样的,并不是和最后一轮的模型一样,再深入的研究之后在源码中发现了这么一段代码,XGBoost在调用predict的时候tree_limit参数如果没指定默认用的就是best_ntree_limit,也就是在预测时候,用的还是最好的模型
二、调参方向/目的
1、过拟合
直接调整控制模型复杂度参数
max_depth –> 调低
min_child_weight –> 调高
gamma –> 调高
增加随机性,使得训练对噪声具有鲁棒性
subsample –> 调低
colsample_bytree –> 调低
eta and num_round –> 调低eta,调高num_round
2、优化性能
tree_method, 设置为 hist 或者 gpu_hist来加快计算速度
3、正负样本不均衡
如果想优化整体效果(AUC)
设置正样本权重系数scale_pos_weight
使用AUC作为评估标准
如果想提升准确率率(预测正确的概率)
设置max_delta_step为1-10之间,有助于收敛