前言
本文来源于XGBoost官方文档
XGBoost参数官方文档:XGBoost Parameters (official guide)。
XGBoost的Python模块介绍官方文档:
Python Package Introduction
在运行XGboost之前, 我们必须设置三种类型的参数: 通用参数(general parameters),Booster 参数(booster parameters)和学习目标参数(task parameters)
通用参数决定了哪种Booster被我们选择用于Boosting, 通常是线性和树型模型,也就是用于宏观函数控制
Booster参数取决于选择的Booster类型,用于控制每一步的booster
学习任务参数决定学习策略。例如,回归任务可以使用不同的参数和排序任务
命令行参数取决于xgboost的CLI版本
XGBoost参数设置
General Parameters
- booster [缺省值=gbtree]
决定使用哪个booster,可以是gbtree,gblinear或者dart。 gbtree和dart使用基于树的模型,而gblinear 使用线性函数.
- silent [缺省值=0]
设置为0打印运行信息;设置为1静默模式,不打印
nthread [缺省值=设置为最大可能的线程数]
并行运行xgboost的线程数,输入的参数应该<=系统的CPU核心数,若是没有设置算法会检测将其设置为CPU的全部核心数
下面的两个参数不需要设置,使用默认的就好了
num_pbuffer [xgboost自动设置,不需要用户设置]
预测结果缓存大小,通常设置为训练实例的个数。该缓存用于保存最后boosting操作的预测结果。
- num_feature [xgboost自动设置,不需要用户设置]
在boosting中使用特征的维度,设置为特征的最大维度
Parameters for Tree Booster
- eta [缺省值=0.3,别名:learning_rate]
更新中减少的步长来防止过拟合。在每次boosting之后,可以直接获得新的特征权值,这样可以使得boosting具有更高的健壮性。
范围: [0,1]
- gamma [缺省值=0,别名: min_split_loss](分裂最小loss)
在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。 (设置此参数应该属于预剪枝操作,应博主还未进行实际操作,想着应该是分裂后损失函数值下降小于设置值是则不进行分裂,早停,防止过拟合,希望交流指正或等博主实战后再来确认修改)
范围: [0,∞]
- max_depth [缺省值=6]
这个值为树的最大深度。 这个值也是用来避免过拟合的(预剪枝,到达最大数度,早停)。max_depth越大,模型会学到更具体更局部的样本。设置为0代表没有限制
范围: [0,∞]
- min_child_weight [缺省值=1]
决定最小叶子节点样本权重和。XGBoost的这个参数是最小样本权重的和,而GBM参数是最小样本总数。 这个参数用于避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本。 但是如果这个值过高,会导致欠拟合。这个参数需要使用CV来调整。.
范围: [0,∞]
- max_delta_step [default = 0]
我们允许每棵树的权重估计值为最大增量步长。 如果该值设置为0,则表示没有约束。 如果它设置为正值,则可以帮助使更新步骤更加保守。 通常这个参数是不需要的,但是当类非常不平衡时,它可能有助于逻辑回归。 将它设置为1-10的值可能有助于控制更新
范围:[0,∞]
- subsample [缺省值=1]
这个参数控制对于每棵树,随机采样的比例。 减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。 典型值:0.5-1,0.5代表平均采样,防止过拟合.
范围: (0,1]
- colsample_bytree [缺省值=1]
用来控制每棵随机采样的列数的占比(每一列是一个特征)。 典型值:0.5-1
范围: (0,1]
- colsample_bylevel [缺省值=1]
用来控制树的每一级的每一次分裂,对列数的采样的占比。 我个人一般不太用这个参数,因为subsample参数和colsample_bytree参数可以起到相同的作用。但是如果感兴趣,可以挖掘这个参数更多的用处。
范围: (0,1]
- lambda [缺省值=1,别名: reg_lambda]
权重的L2正则化项。(和Ridge regression类似)。 这个参数是用来控制XGBoost的正则化部分的。
调节目标函数中正则化项以调整模型复杂程度,提高函数泛化能力(防止过拟合),而且L2范数还可以让优化求解更稳定和快速。.
- alpha [缺省值=0,别名: reg_alpha]
权重的L1正则化项。(和Lasso regression类似)。 可以应用在很高维度的情况下,使得算法的速度更快。
- tree_method,string [default ='auto']
XGBoost中使用的树构建算法(参见参考文献中的描述)
分布式和外部存储器版本仅支持近似算法。
选择:{'auto','exact','approx','hist','gpu_exact','gpu_hist'}
'auto':使用启发式来选择更快的。
对于中小型数据集,将使用精确的贪心算法。
对于非常大的数据集,将选择近似算法。
由于旧行为总是在单机中使用精确的贪心算法,因此当选择近似算法来通知此选择时,用户将收到消息。
'exact':精确的贪婪算法。
'approx':使用草图和直方图的近似贪心算法。
'hist':快速直方图优化的近似贪心算法。 它使用一些性能改进,如箱缓存。
'gpu_exact':精确算法的GPU实现。
'gpu_hist':GPU算法的实现。
- sketch_eps,[默认= 0.03]
这仅用于近似贪心算法。
这大致转换为O(1 / sketch_eps)箱数。 与直接选择箱数量相比,这具有草图准确性的理论保证。
通常用户不必调整它。 但考虑设置更低的数字以获得更准确的枚举。
范围:(0,1)
- scale_pos_weight[缺省值=1]
在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。通常可以将其设置为负样本的数目与正样本数目的比值。
- updater,[默认='grow_colmaker,prune']
一个逗号分隔的字符串,用于定义要运行的树更新程序的序列,提供了一种模块化的方法来构建和修改树。这是一个高级参数,通常根据其他参数自动设置。但是,它也可以由用户明确设置。以下更新插件存在:
'grow_colmaker':非分布式树状结构。
'distcol':分布式树结构,具有基于列的数据分割模式。
'grow_histmaker':基于全局直方图计数提议的基于行的数据分割的分布式树结构。
'grow_local_histmaker':基于局部直方图计数。
'grow_skmaker':使用近似的草绘算法。
'sync':同步所有分布式节点中的树。
'refresh':根据当前数据刷新树的统计数据和/或叶值。请注意,不会对数据行进行随机子采样。
'prune':修剪损失在分布式设置中,隐式更新器序列值将按如下方式进行调整:
'grow_histmaker,修剪'当dsplit ='行'(或默认);或者当数据有多个稀疏页面时
'distcol'when dsplit ='col'
- refresh_leaf,[default = 1]
这是'refresh'更新插件的参数。 当这个标志为真时,树叶以及树节点的统计信息被更新。 如果为false,则只更新节点统计信息。
- process_type,[default ='default']
一种促进过程的运行。
选择:{'default','update'}
'default':创建新树的正常提升过程。
“update”:从现有模型开始,只更新其树。 在每次boost迭代中,都会从初始模型中获取一棵树,为该树运行指定的updater插件序列,并将修改后的树添加到新模型中。 新模型将具有相同或更少的树数,具体取决于所执行的增强迭代次数。 目前,以下内置更新插件可以有效地用于此流程类型:'refresh','prune'。 使用'update',不能使用创建新树的更新插件。
- grow_policy,string [default ='depthwise']
控制新节点添加到树的方式。
目前仅当tree_method设置为'hist'时才受支持。
选择:{'depthwise','lossguide'}
'depthwise':在离根最近的节点处分割。
'lossguide':分割损失变化最大的节点。
- max_leaves,[默认= 0]
要添加的最大节点数。 只与“损失指导”增长政策相关。
- max_bin,[default = 256]
这仅在'hist'被指定为tree_method时才被使用。
用于存储连续特征的离散组的最大数目。
增加这个数字以更高的计算时间为代价提高了分割的最优性。
- predictor,[default ='cpu_predictor']
要使用的预测算法的类型。 提供相同的结果,但允许使用GPU或CPU。
'cpu_predictor':多核CPU预测算法。
'gpu_predictor':使用GPU进行预测。 “gpu_exact”和“gpu_hist”树方法的默认值
Additional parameters for Dart Booster
1.sample_type [default =“uniform”]
采样算法的类型。
“uniform”:统一选择掉落的树木。
“weighted”:根据权重选择掉落的树木。
2.normalize_type [default =“tree”]
类型的归一化算法。
“tree”:新树的树木重量相同。
新树的权重为1 /(k + learning_rate)
丢弃的树按k /(k + learning_rate)的因子缩放
“forest”:新树有相同重量的掉落树木(森林)。
新树的重量是1 /(1 + learning_rate)
丢弃的树被缩放1 /(1+ learning_rate)
3.rate_drop [默认= 0.0]
dropout rate(在dropout以前树的一小部分下降)。
范围:[0.0,1.0]
4.one_drop [default = 0]
启用此标志时,至少有一棵树在丢失期间总是被丢弃(允许来自原始DART纸张的二项式加1或epsilon丢弃)。
5.skip_drop [默认= 0.0]
在增强迭代过程中跳过丢失过程的概率。
如果跳过了一个退出,则会按照与gbtree相同的方式添加新树。
请注意,非零skip_drop的优先级高于rate_drop或one_drop。
范围:[0.0,1.0]
Parameters for Linear Booster
- lambda [缺省值=0,别称: reg_lambda]
L2正则化惩罚系数,增加该值会使得模型更加保守。
- alpha [缺省值=0,别称: reg_alpha]
L2正则化惩罚系数,增加该值会使得模型更加保守。
- updater [default ='shotgun']
线性模型算法
'shotgun':基于shotgun算法的平行坐标下降算法。 使用'hogwild'并行性,因此每次运行都会产生一个不确定的解决方案。
'coord_descent':普通坐标下降算法。 多线程,但仍然产生确定性的解决方案
Parameters for Tweedie Regression
1.tweedie_variance_power [默认= 1.5]
控制Tweedie分布方差的参数
var(y)〜E(y)^ tweedie_variance_power
范围:(1,2)
设置为接近2以转向伽玛分布
设置为接近1以转向泊松分布
Learning Task Parameters
- objective[default = reg:linear]
“reg:线性”线性回归
“reg:logistic”-logistic回归
“binary:logistic” - 二元分类的逻辑回归,输出概率
“binary:logitraw” - 二元分类的逻辑回归,逻辑变换前的输出分数
“gpu:reg:linear”,“gpu:reg:logistic”,“gpu:binary:logistic”,gpu:binary:logitraw“:在GPU上评估的相应目标函数的“gpu:reg:linear”,“gpu:reg:logistic”,“gpu:binary:logistic”,gpu:binary:logitraw“请注意,像GPU直方图算法一样,只能在整个培训会话使用相同数据集时使用它们
count:poisson:计数数据的“count:poisson” - 泊松回归,泊松分布的输出均值
在泊松回归中,max_delta_step默认设置为0.7(用于保护优化)
“survival:cox” - 右删失生存时间数据的-Cox回归(负值被认为是右删失)。请注意,风险比例量表(即在比例风险函数h(t)= h0(t)* HR)中的预测值为HR = exp(marginal_prediction)。
“multi:softmax” - 设置XGBoost使用softmax目标进行多类分类,还需要设置num_class(类数)
“multi:softprob” - 与softmax同名,但输出ndata * nclass的向量,可以将其更改为ndata,nclass矩阵。结果包含属于每个类别的每个数据点的预测概率。
“rank:pairwise” - 通过最小化成对损失来设置XGBoost来完成排名任务
“reg:gamma”-gamma regression with log-link。输出是伽马分布的平均值。例如,对保险索赔的严重程度建模,或对可能采用伽玛分布的任何结果进行建模可能很有用
“reg:tweedie”-Tweedie regression with log-link。例如,对保险中的全部损失建模或任何可能由Tweedie分发的结果进行建模可能很有用。
- base_score [默认= 0.5]
所有实例的初始预测分数,全局偏差
对于足够数量的迭代,更改此值不会产生太多影响。
- eval_metric [根据目标的默认值]
验证数据的评估指标,默认指标将根据目标(回归的rmse,分类错误,排名的平均平均精度)
用户可以为python用户添加多个评估指标,请记住将参数中的指标作为参数对而不是地图进行传递,以便后者的“eval_metric”不会覆盖以前的指标
下面列出了选择:
“rmse”:均方根误差
“mae”:意思是绝对错误
“logloss”:负对数似然
“error”:二进制分类错误率。它计算为#(错误的情况)/#(所有情况)。对于预测,评估将把预测值大于0.5的实例视为正实例,将其他实例视为负实例。
“error @ t”:通过't'提供数值可以指定一个不同于0.5的二进制分类阈值。
“merror”:多类分类错误率。它计算为#(错误的情况)/#(所有情况)。
“mlogloss”:多类记录
“auc”:排名评估曲线下的区域。
“ndcg”:标准化折扣累计收益
“map”:平均精度
“ndcg @ n”,“map @ n”:可以将n指定为一个整数以切断评估列表中的顶部位置。
“ndcg - ”,“map - ”,“ndcg @ n - ”,“map @ n-”:在XGBoost中,NDCG和MAP将评估没有任何正样本的列表的评分为1.通过添加“ - ”评估指标XGBoost会在某些条件下将这些评分评估为0以保持一致。反复训练
“poisson-nloglik”:泊松回归的负对数似然
“gamma-nloglik”:γ回归的负对数似然
“cox-nloglik”:Cox比例风险回归的负部分对数似然值
“gamma-deviance”:伽玛回归的剩余偏差
“tweedie-nloglik”:Tweedie回归的负对数似然(在tweedie_variance_power参数的指定值处)
- seed [缺省值=0]
随机数的种子 设置它可以复现随机数据的结果,也可以用于调整参数
Command Line Parameters
一下的参数只用于命令行版本的XGBoost版本中。
1. use_buffer [缺省值=1]
是否为文本输入创建二进制缓存。这样做将加快加载速度。
2. num_round
boosting的迭代次数。
3. data
训练数据的路径
4. test:data
用作预测的测试数据路径
5. save_period [缺省值=0]
保存参数模型的周期
6. task [缺省值=train] 可选项: train, pred, eval, dump
train: 使用data训练
pred: 使用test:data做预测
eval: 进行评估统计,由eval[name]=filename指定
dump: 将学习的模型导出到文本格式
7. model_in [缺省值=NULL]
输入模型的路径,被用于test, eval, dump。在training中,XGBoost将会从输入模型的基础上继续进行训练。
8. model_out [缺省值=NULL]
训练完成之后模型的保存路径。如果没有指定将会使用诸如0003.model,这里的 0003是boosting的迭代数
9. model_dir [缺省值=models]
训练期间的训练模型输出文件夹
10. fmap
特征图谱,被用于dump模式
11. name_dump [缺省值=dump.txt]
模型dump文件的名称
12. name_pred [缺省值=pred.txt]
预测文件的名称,被用于pred模式
13. pred_margin [缺省值=0]
predict margin 而不是转换概率
Python Package Introduction
本文给出了xgboost python包的基本演练。
其他有用链接列表
- Python walkthrough code collections
- Python API Reference
Install XGBoost
要安装XGBoost,请执行以下操作:
- 在项目的根目录中运行make
- 在python-package目录中运行
python setup.py install
为了验证您的安装,请尝试在Python中导入xgboost。
import xgboost as xgb
Data Interface
XGBoost python模块能够从以下位置加载数据:
- libsvm txt格式文件
- 逗号分隔值(CSV)文件
- Numpy 2维数组
- Scipy 2维稀疏数组,和
- xgboost二进制缓冲区文件。
数据存储在DMatrix对象中。
- 将一个libsvm文本文件或一个XGBoost二进制文件加载到DMatrix中:
dtrain = xgb.DMatrix('train.svm.txt')
dtest = xgb.DMatrix('test.svm.buffer')
# label_column specifies the index of the column containing the true label
dtrain = xgb.DMatrix('train.csv?format=csv&label_column=0')
dtest = xgb.DMatrix('test.csv?format=csv&label_column=0')
(请注意,XGBoost不支持分类功能;如果您的数据包含分类功能,请先将其作为一个numpy数组加载,然后执行一次性编码。)
data = np.random.rand(5, 10) # 5 entities, each contains 10 features
label = np.random.randint(2, size=5) # binary target
dtrain = xgb.DMatrix(data, label=label)
- 将一个scpiy.sparse数组加载到DMatrix中:
csr = scipy.sparse.csr_matrix((dat, (row, col)))
dtrain = xgb.DMatrix(csr)
- 将DMatrix保存为XGBoost二进制文件将使加载速度更快:
dtrain = xgb.DMatrix('train.svm.txt')
dtrain.save_binary('train.buffer')
- 缺失的值可以用DMatrix构造函数中的默认值替换:
dtrain = xgb.DMatrix(data, label=label, missing=-999.0)
w = np.random.rand(5, 1)
dtrain = xgb.DMatrix(data, label=label, missing=-999.0, weight=w)
Setting Parameters
XGBoost可以使用成对的列表或字典来设置参数。 例如:
param = {'max_depth': 2, 'eta': 1, 'silent': 1, 'objective': 'binary:logistic'}
param['nthread'] = 4
param['eval_metric'] = 'auc'
param['eval_metric'] = ['auc', 'ams@0']
# alternatively:
# plst = param.items()
# plst += [('eval_metric', 'ams@0')]
evallist = [(dtest, 'eval'), (dtrain, 'train')]
Training
num_round = 10
bst = xgb.train(plst, dtrain, num_round, evallist)
bst.save_model('0001.model')
# dump model
bst.dump_model('dump.raw.txt')
# dump model with feature map
bst.dump_model('dump.raw.txt', 'featmap.txt')
bst = xgb.Booster({'nthread': 4}) # init model
bst.load_model('model.bin') # load data
Early Stopping
如果您有验证集,则可以使用早停以找到最佳数量的助推回合。 早停需要至少一套在evals中。 如果有多个,它将使用最后一个。
train(...,evals = evals,early_stopping_rounds = 10)
该模型将训练,直到验证分数停止改进。 验证错误需要至少每个early_stopping_rounds减少以继续培训。
如果发生早停,模型将有三个附加字段:bst.best_score,bst.best_iteration和bst.best_ntree_limit。 请注意,train()将从上次迭代中返回一个模型,而不是最好的一个。
这适用于两个指标以最小化(RMSE,对数损失等)和最大化(MAP,NDCG,AUC)。 请注意,如果您指定多个评估指标,则参数['eval_metric']中的最后一个用于早停。
Prediction
# 7 entities, each contains 10 features
data = np.random.rand(7, 10)
dtest = xgb.DMatrix(data)
ypred = bst.predict(dtest)
- 如果在训练期间启用提前停止,则可以通过最佳迭代获得预测
bst.best_ntree_limit
:
ypred = bst.predict(dtest, ntree_limit=bst.best_ntree_limit)
Plotting
您可以使用绘图模块绘制重要性和输出树。
- 要绘制重要性,请使用plot_importance。 该功能需要安装matplotlib。
xgb.plot_importance(bst)
- 要通过matplotlib绘制输出树,请使用plot_tree,指定目标树的序号。 这个函数需要graphviz和matplotlib。
xgb.plot_tree(bst, num_trees=2)
- 在使用IPython时,可以使用to_graphviz函数,该函数将目标树转换为graphviz实例。 graphviz实例会自动在IPython中呈现。
xgb.to_graphviz(bst, num_trees=2)