xgboost 优势和常规步骤

https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/

 

优势

1、正则化

2、并行计算

3、可以处理空值(怎么处理?)

5、不是贪心算法。会先分到最大深度max_depth然后再进行剪枝。可以得到增益最有解。

6、有一个内置的交叉验证

7、可以在原模型上接着训练(fine_tuning? 迁移学习?)

 

短语参数命名规则。现在在xgboost的module中,有一个sklearn的封装。在这个module中命名规则和sklearn的命名规则一致。

  1. eta –> learning_rate
  2. lambda –> reg_lambda
  3. alpha –> reg_alpha

 

参数

1、基本配置参数

booster: 基本使用gbtree,使用树模型,这个效果一般

silent 通常设为0,方便我们查看每轮的loss

nthread: 多线程,如果不设置,算法会自动查看核心数进行并行计算。

 

2、Booster参数

eta(learning rate):  学习率 0.01-0.2

min_chile_weight: 子节点的最低sum of weights。 高的时候预防过拟合,太低了容易欠拟合。

max_depth:树的最大深度,太高容易过拟合。通常3-10

gamma: loss阈值,loss降低超过这个阈值,就继续切分

max_delta_step:In maximum delta step we allow each tree’s weight estimation to be.,通常不用

subsample: 通常0.5-1 构建每棵树时,只取一部分样本进行构建,避免过拟合

colsample_bytree:[0.5-1] 特征抽样,

colsample_bylevel : 通常不用

lambda: L2 regularization term on weights (通常不用?)

alpha: L1 regularization term

scale_pos_weight

 

3、训练参数

objective 二分类使用'binary:logistic'  多分类使用 'multi:softmax' 直接返回标签, 也可以使用 'multi:softprob' 或者在训练后使用predict_prob输出类别的概率

eval_metric: 用来评估validation data:rmse ,mae,logloss,error ,merror ,mlogloss,auc

4、XGBoost允许在每一轮boosting迭代中使用交叉验证。因此,可以方便地获得最优boosting迭代次数。而如果使用sklearn的kfold和cross_val_score,这个是每次模型训练只用一个固定的数据,而不是每轮boosting都交叉验证。

 5、关于特征工程

XGBOOST是树的boosting模型,由于树的非线性特点,我们不需要对特征进行归一化(正态分布),缩放(到01区间),

或者取log(这个存疑,我个人觉得取log可能有用?),但是我们应该关心创造特征。

比如过去5天内均值,去年同期的数值,环比增长,同比增长。还比如说在租房的场景中,房租/卧室数,这些跟业务非常相关的特征,其实是需要不断的探索才能找到。XGBOOST里并不能帮我们获取这样的特征。

同深度学习对比,深度学习本质上也是依靠如LSTM,CNN等特殊的结构,去获取到适合这个业务的特征。

然后类别特征在XGBOOST里面并不是特别好用,如果相关性不大可以去掉。如果类别数并不是很多,比如只有个位数的类别,则可以加上。如果类别数很多,可以考虑使用CATBOOSTING或者LIGHTGBM

xgboost无法处理类别特征,事实上,相比起强加类别特征,我们更需要思考类别特征背后的意义。比如数据有城市这一类别特征,但是城市背后的意义是什么,一线城市和二线城市区别在哪里?

我们可以进行量化,将城市量化成为有具体数字的特征,如GDP,面积,人口,人口/平方公里、GDP/人,GDP/平方公里,构造尽可能多的特征用来代表类别特征。这样我们不会陷入标签陷阱,如果一个城市很接近于1线城市,但是却被分到了2线城市,

直接使用标签会带来很多问题。

还有比如星期特征,我们直觉上知道在个人消费领域,星期五六日是高峰,那么我们通过统计得到星期1、2、3、4、5、6、7他们的平均营业额,然后缩放到01区间,用来替代周几这个特征。

而每个月的几号同样会有一些特征。

也就是说,假如把类别特征当成一个分类器的分类结果,我们不直接使用这个结果,而是转而使用为了判别这个结果而使用到的特征。这个才是xgboost拿手的

6、如何查看feature importance?

1.xgb(原生).plot_importance(model)

2.model.get_booster().get_score(importance_type="weight")

'weight', 'gain', 'cover', 'total_gain', 'total_cover'

 但是这个feature_importance使用不同计算方法出来的结果可能完全不一样https://towardsdatascience.com/be-careful-when-interpreting-your-features-importance-in-xgboost-6e16132588e7

一定使用合适的计算方法,否则可能会完全误导特征工程的方向

6、数据量小的时候,early_stop_rounds一定要慎用!因为可能会让模型训练的不够。最理想的情况,应该是每10个n_estimators就计算一次k折的val_loss,然后取平均,loss最小的我们用来作为n_estimators

原文地址:https://www.cnblogs.com/yjybupt/p/12937286.html