参考文献:
1.使用的基本结构:
import xgboost as xgb
# 读取数据
dtrain = xgb.DMatrix('demo/data/agaricus.txt.train')
dtest = xgb.DMatrix('demo/data/agaricus.txt.test')
# 通过 map 指定参数
param = {'max_depth':2, 'eta':1, 'silent':1, 'objective':'binary:logistic' }
num_round = 2
bst = xgb.train(param, dtrain, num_round)
# 预测
preds = bst.predict(dtest)
2.关于调参
--------------------------------------------------&&宏观指导思路&&------------------------------------------------------
【1】理解 Bias-Variance(偏差-方差)权衡
如果你了解一些机器学习或者统计课程,你会发现这可能是最重要的概念之一。 当我们允许模型变得更复杂(例如深度更深)时,模型具有更好的拟合训练数据的能力,会产生一个较少的偏差模型。 但是,这样复杂的模型需要更多的数据来拟合。
xgboost 中的大部分参数都是关于偏差方差的权衡的。最好的模型应该仔细地将模型复杂性与其预测能力进行权衡。 参数文档 会告诉你每个参数是否会使得模型更加 conservative (保守)与否。这可以帮助您在复杂模型和简单模型之间灵活转换。
【2】控制过拟合
当你观察到训练精度高,但是测试精度低时,你可能遇到了过拟合的问题。通常有两种方法可以控制 xgboost 中的过拟合。
第一个方法是直接控制模型的复杂度
这包括 max_depth, min_child_weight 和 gamma
第二种方法是增加随机性,使训练对噪声强健
这包括 subsample, colsample_bytree
你也可以减小步长 eta, 但是当你这么做的时候需要记得增加 num_round 。
【3】处理不平衡的数据集
对于广告点击日志等常见情况,数据集是极不平衡的。 这可能会影响 xgboost 模型的训练,有两种方法可以改善它。
如果你只关心预测的排名顺序(AUC)
通过 scale_pos_weight 来平衡 positive 和 negative 权重。
使用 AUC 进行评估
如果你关心预测正确的概率
在这种情况下,您无法重新平衡数据集
在这种情况下,将参数 max_delta_step 设置为有限数字(比如说1)将有助于收敛
----------------------------------------------------&&具体参数调整&&----------------------------------------------------
参数结构:
XGBoost的参数可以分为三种类型:通用参数、booster参数以及学习目标参数。
General parameters:参数控制在提升(boosting)过程中使用哪种booster,常用的booster有树模型(tree)和线性模型(linear model)。
Booster parameters:这取决于使用哪种booster。
Learning Task parameters:控制学习的场景,例如在回归问题中会使用不同的参数控制排序。
除了以上参数还可能有其它参数,在命令行中使用
1.常规参数
【1】booster [default=gbtree]
有两种模型可以选择gbtree和gblinear。gbtree使用基于树的模型进行提升计算,gblinear使用线性模型进行提升计算。缺省值为gbtree
【2】silent [default=0]
取0时表示打印出运行时信息,取1时表示以缄默方式运行,不打印运行时的信息。缺省值为0
建议取0,过程中的输出数据有助于理解模型以及调参。
【3】nthread [default to maximum number of threads available if not set]
XGBoost运行时的线程数。缺省值是当前系统可以获得的最大线程数
如果你希望以最大速度运行,建议不设置这个参数,模型将自动获得最大线程
【4】num_pbuffer [set automatically by xgboost, no need to be set by user]
size of prediction buffer, normally set to number of training instances. The buffers are used to save the prediction results of last boosting step.
【5】num_feature [set automatically by xgboost, no need to be set by user]
boosting过程中用到的特征维数,设置为特征个数。XGBoost会自动设置,不需要手工设置
总结:常规参数部分这5个基本上都不需要调整参数,都已经设置好了。。
2.用于Tree提升的参数
【1】eta [default=0.3]
为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3,取值范围为:[0,1],通常最后设置eta为0.01~0.2。
【2】gamma [default=0]
minimum loss reduction required to make a further partition on a leaf node of the tree. the larger, the more conservative the algorithm will be.
取值范围: [0,∞]
模型在默认情况下,对于一个节点的划分只有在其loss function 得到结果大于0的情况下才进行,而gamma 给定了所需的最低loss function的值。gamma值使得算法更conservation,且其值依赖于loss function ,在模型中应该进行调参。
【3】max_depth [default=6]
树的最大深度。缺省值为6,取值范围为:[1,∞],通常取值:3-10。
树的深度越大,则对数据的拟合程度越高(过拟合程度也越高)。即该参数也是控制过拟合。建议通过交叉验证(xgb.cv ) 进行调参。
【3】min_child_weight [default=1]
孩子节点中最小的样本权重和。取值范围为: [0,∞]。
如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束。在现行回归模型中,这个参数是指建立每个模型所需要的最小样本数。
该参数越大算法越conservative。即调大这个参数能够控制过拟合。
【4】max_delta_step [default=0]
Maximum delta step we allow each tree’s weight estimation to be. If the value is set to 0, it means there is no constraint. If it is set to a positive value, it can help making the update step more conservative. Usually this parameter is not needed, but it might help in logistic regression when class is extremely imbalanced. Set it to value of 1-10 might help control the update
取值范围为:[0,∞]
如果取值为0,那么意味着无限制。如果取为正数,则其使得xgboost更新过程更加保守。
通常不需要设置这个值,但在使用logistics 回归时,若类别极度不平衡,则调整该参数可能有效果
【5】subsample [default=1]
用于训练模型的子样本占整个样本集合的比例。如果设置为0.5则意味着XGBoost将随机的从整个样本集合中抽取出50%的子样本建立树模型,这能够防止过拟合。
取值范围为:(0,1]
【6】colsample_bytree [default=1]
在建立树时对特征随机采样的比例。缺省值为1
取值范围:(0,1]
【7】colsample_bylevel[default=1]
决定每次节点划分时子样例的比例
通常不使用,因为subsample和colsample_bytree已经可以起到相同的作用了
【8】scale_pos_weight[default=0]
大于0的取值可以处理类别不平衡的情况。帮助模型更快收敛
总结:eta可以设置;gamma一般不用动,因为损失函数一般是大于0的;最大深度max_depth可以交叉验证确定;min_child_weight可用于控制过拟合,越大越好;max_delta_step通常不设置;subsample控制选用样本比例;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
用于线性提升的参数:
lambda [default=0]
L2 正则的惩罚系数
用于处理XGBoost的正则化部分。通常不使用,但可以用来降低过拟合
alpha [default=0]
L1 正则的惩罚系数
当数据维度极高时可以使用,使得算法运行更快。
lambda_bias
在偏置上的L2正则。缺省值为0(在L1上没有偏置项的正则,因为L1时偏置不重要)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3.学习目标参数
【1】objective [ default=reg:linear ]
定义学习任务及相应的学习目标,可选的目标函数如下:
“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【2】base_score [ default=0.5 ]
the initial prediction score of all instances, global bias【3】eval_metric [ default according to objective ]
校验数据所需要的评价指标,不同的目标函数将会有缺省的评价指标(rmse for regression, and error for classification, mean average precision for ranking)
用户可以添加多种评价指标,对于Python用户要以list传递参数对给程序,而不是map参数list参数不会覆盖’eval_metric’
可选的如下:
“rmse”: 均方根误差
“logloss”: 负对数
“error”: 二分类问题错误率. It is calculated as #(wrong cases)/#(all cases). For the predictions, the evaluation will regard the instances with prediction value larger than 0.5 as positive instances, and the others as negative instances.
“merror”: 多分类问题错误率. It is calculated as #(wrong cases)/#(all cases).
“mlogloss”: 多分类负对数
“auc”: auc指标用于评价.
“ndcg”:归一化折现累积增益
“map”:平均正确率
“ndcg@n”,”map@n”: n can be assigned as an integer to cut off the top positions in the lists for evaluation.
“ndcg-“,”map-“,”ndcg@n-“,”map@n-“: In XGBoost, NDCG and MAP will evaluate the score of a list without any positive samples as 1. By adding “-” in the evaluation metric XGBoost will evaluate these score as 0 to be consistent under some conditions.
training repeatively
【4】seed [ default=0 ]
随机数的种子。缺省值为0。可以用于产生可重复的结果(每次取一样的seed即可得到相同的随机划分)