当前位置: 首页>>技术教程>>正文


XGB调参,实战经验总结!

XGB调参,实战经验总结!

XGBoost(或eXtreme Gradient  Boosting)很强大,它在太多的数据科学竞赛中被证明是有用的。

调参是一个需要经验的活,如果蛮干的话事倍功半:譬如要处理大型数据集,要对5个不同的参数进行了朴素的网格搜索,并且每个参数都有5个可能的值,那么您将有5的5次方= 3,125次迭代。如果一次迭代要花10分钟才能运行,那么在获取到靠谱参数之前,您将有21天以上的等待时间。

注:在这里假设您首先正确完成了特征工程。特别是对于类别特征,因为XGBoost不擅长处理类别特征。

1. Train-test训练集和测试集拆分,评估指标和提前停止[early-stoping]

在进行参数优化之前,首先要花一些时间来设计模型的诊断框架。

XGBoost Python api提供了一种通过增加树的个数来评估增加的性能的方法。它使用两个参数:“eval_set”(通常是训练集和测试集)以及关联的“eval_metric”来衡量这些评估集上的误差。

训练集合测试集误差,绘制结果出来一般如下图所示:

在上图所示的分类误差图上:我们的模型持续学习直到350次迭代,然后误差非常缓慢地减小。也就是说,可以考虑砍掉350之后的树,节省以后的参数调整时间。

如果您不使用scikit-learn API,而是使用纯XGBoost Python API,那么提前停止参数,可帮助您自动减少树的数量。

2.具体如何调参?

当还没有运行任何模型时从哪里开始?

  1. 为关键输入填写合理的值:
    learning_rate:0.01
    n_estimators:如果数据量很大,则为100,如果为中等规模,则为1000
    max_depth:3
    subsample:0.8
    colsample_bytree:1
    gamma:1
  2. 运行model.fit(eval_set,eval_metric)并诊断您的首次运行,特别是n_estimators
  3. 优化max_depth参数。它表示每棵树的深度,这也是每棵树中使用的不同特征的最大数量。我建议从小的max_depth开始(例如3),然后将其递增1,并在没有性能提高的情况下停止。这将有助于简化模型并避免过度拟合
  4. 现在尝试学习率和避免过拟合的功能:
    learning_rate:通常在0.1到0.01之间。如果您专注于性能并且有很多时间在前面,那么在增加树数量的同时逐步降低学习率。
    subsample: 这是树构建树所占的行数[样本量]的百分比。我建议不要丢掉太多行[样本],因为性能会下降很多。通常取0.8到1。
    colsample_bytree:每棵树使用的列数[特征数]。如果您有很多列(尤其是您进行了one-hot编码),则值为0.3到0.8;如果只有几列,则值为0.8到1。
    gamma:通常被误解的参数,它充当正则化参数。 可以取0、1或5。

把上面这些主要参数调好,模型效果通常就很不错了!

3.其他说明

为了让模型效果及性能[运行速度]更好,除了上面比较常规的调参之外,根据特征重要性做特征选择也很重要!

xgboost提供了特征重要性统计函数:plot_importance(),其用法如下:

 



# plot feature importance using built-in function
from numpy import loadtxt
from xgboost import XGBClassifier
from xgboost import plot_importance
from matplotlib import pyplot
# load data
dataset = loadtxt('data.csv', delimiter=",")
# split data into X and y
X = dataset[:,0:8]
y = dataset[:,8]
# fit model no training data
model = XGBClassifier()
model.fit(X, y)
# plot feature importance
plot_importance(model)
pyplot.show()

运行得到的特征重要性图像如下:

注:根据其在输入数组中的索引,plot_importance自动将特征被命名为f0-f7。可以自行对应到具体的特征名。

参考资料

本文由《纯净天空》出品。文章地址: https://vimsky.com/article/4207.html,未经允许,请勿转载。