xgboost的优点
1、正则化
GBM(Gradient Boosting Machine)的实现没有像XGBoost这样的正则化步骤,因此很多时候过拟合处理比较麻烦,而XGBoost以“正则化提升(regularized boosting)”技术而闻名。
2、并行处理
XGBoost支持并行处理,相比GBM有了速度上的巨大提升。
注:Boosting还是串行的,并行的表现在于数据预处理后保存在block中,避免每次调用都进行一次预处理
3、兼容性强
可以处理底层的numpy和scipy数据,特别对于部分大数据集可以处理稀疏矩阵直接进行训练。
4、内置交叉验证
XGBoost允许在每一轮Boosting迭代中使用交叉验证。因此,可以方便地获得最优Boosting迭代次数。GBM的网格搜索有个最大弊端,只能在用户给出的范围内进行寻值。
5、灵活性强
(1)允许用户定义自定义优化目标和评价标准,它对模型的使用开辟了一个全新的维度,用户的处理不会受到任何限制。
(2)可以自动处理缺失值,避免了太过繁琐的预处理,用户需要提供一个和其它样本不同的值,然后把它作为一个参数传进去,以此来作为缺失值的取值。并且XGBoost在不同节点遇到缺失值时采用不同的处理方法,而且会学习未来遇到缺失值时的处理方法。
6、支持自定义损失函数
只要自定义损失函数符合二阶可导
参数调试
通用参数
宏观控制,类似超参数
booster
每次迭代用的模型,树模型和线性模型两种,基本上都是使用树模型。
(‘gbtree’ or ‘dart’ and ‘gblinear’)
verbosity
训练可视化控制。
0 (silent), 1 (warning), 2 (info), 3 (debug)
nthread
控制使用多少线程,不设置则使用系统极限线程数。
disable_default_eval_metric
是否禁用默认评估指标,默认为0,大于0表示禁用。
num_pbuffer, num_feature
这两个参数用户不需要输入,模型自动输入。
Booster 参数
eta
1、默认0.3,类似学习速率,
2、典型值为0.01-0.2,范围[0, 1]
gamma
1、默认0,范围[0,∞]
2、在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。
这个参数的值越大,算法越保守。属于需要调整的重点参数。、
3、这个参数的值越大,算法越保守。属于需要调整的重点参数。
max_depth
1、默认6,典型值为3-10,130.范围[0,∞]
2、树的最大深度。这个值也是用来避免过拟合的。max_depth越大,模型会学到更具体更局部的样本。需要使用CV来进行调优。
min_child_weight
1、默认1,范围[0,∞]
2、决定最小叶子节点样本权重和。
3、也是用于避免过拟合,设置较大的值,避免模型学习局部特殊样本。但是太大也会欠拟合。
max_delta_step
1、默认0,范围[0,∞]
2、这参数限制每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。如果它被赋予了某个正值,那么它会让这个算法更加保守。
3、但是,这个参数一般不需要设置。但是当各类别的样本十分不平衡的时候,需要设置。
subsample
1、默认1,典型值为0.5-1,范围(0,1]
2、这个参数控制对于每棵树,随机采样的比例。
3、减小这个参数的值,算法会更加保守,避免过拟合。这个值设置得过小,它可能会导致欠拟合。
olsample_bytree, colsample_bylevel, colsample_bynode
1、子采样的一系列参数
lambda
1、默认1
2、权重的L2正则化项,增加使得模型保守。
alpha
1、默认1
2、权重的L1正则化项。
3、应用在很高维度的情况下,可以使得算法的速度更快。
scale_pos_weight
1、默认1
2、在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。
目标参数
objective
1、默认reg:squarederror
2、常用值:
binary:logistic二分类的逻辑回归,返回预测的概率。
binary:logitraw输出二分类得分。
multi:softmax 使用softmax的多分类器,返回预测的类别。在这种情况下,你还需要多设一个参数:num_class(类别总数目)。
multi:softprob 返回的是每个数据记录属于各个类别的概率。
3、这个参数指定学习对象和学习任务。
eval_metric
1、默认值取决于objective参数的取值
2、对于验证数据的度量方法。
3、对于回归问题,默认值是rmse,对于分类问题,默认值是error。
seed
1、随机数种子,默认时间戳,为了复现训练结果,一般设定种子为固定数值。
大致步骤
第一步:设置一些初始值。
第二步:保持learning rate和其他booster相关的参数不变,调节和estimators的参数。、
第三步:保证estimator和其他的booster参数不变,调节learning rate
第四步:保持estimator和learning rate不变,调节booste相关的参数。可以从影响最大的max_depth 和min_child_weight开始。逐步调节所有可能有影响的booster参数
第五步: 缩小learning rate,得到最佳的learning rate值
第六步:得到一组效果还不错的参数组合
注:根据需求可以自定义损失函数:
bst=xgb.train(param,xg_train,n_round,watchlist,feval=func,maximize=False)
func
是个自定义函数,需要二阶可导