XGBoost参数设置中文版及XGBoost的Python模块解释

前言

本文来源于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

  1. booster [缺省值=gbtree] 
    决定使用哪个booster,可以是gbtree,gblinear或者dart。 gbtree和dart使用基于树的模型,而gblinear 使用线性函数.
  2. silent [缺省值=0] 
    设置为0打印运行信息;设置为1静默模式,不打印
  3. nthread [缺省值=设置为最大可能的线程数] 
    并行运行xgboost的线程数,输入的参数应该<=系统的CPU核心数,若是没有设置算法会检测将其设置为CPU的全部核心数 
    下面的两个参数不需要设置,使用默认的就好了

  4. num_pbuffer [xgboost自动设置,不需要用户设置] 
    预测结果缓存大小,通常设置为训练实例的个数。该缓存用于保存最后boosting操作的预测结果。

  5. num_feature [xgboost自动设置,不需要用户设置] 
    在boosting中使用特征的维度,设置为特征的最大维度

Parameters for Tree Booster

  1. eta [缺省值=0.3,别名:learning_rate] 
    更新中减少的步长来防止过拟合。在每次boosting之后,可以直接获得新的特征权值,这样可以使得boosting具有更高的健壮性。 
    范围: [0,1]
  2. gamma [缺省值=0,别名: min_split_loss](分裂最小loss) 
    在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。 (设置此参数应该属于预剪枝操作,应博主还未进行实际操作,想着应该是分裂后损失函数值下降小于设置值是则不进行分裂,早停,防止过拟合,希望交流指正或等博主实战后再来确认修改)
    范围: [0,∞]
  3. max_depth [缺省值=6] 
    这个值为树的最大深度。 这个值也是用来避免过拟合的(预剪枝,到达最大数度,早停)。max_depth越大,模型会学到更具体更局部的样本。设置为0代表没有限制 
    范围: [0,∞]
  4. min_child_weight [缺省值=1] 
    决定最小叶子节点样本权重和。XGBoost的这个参数是最小样本权重的和,而GBM参数是最小样本总数。 这个参数用于避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本。 但是如果这个值过高,会导致欠拟合。这个参数需要使用CV来调整。. 
    范围: [0,∞]
  5. max_delta_step [default = 0]
    我们允许每棵树的权重估计值为最大增量步长。 如果该值设置为0,则表示没有约束。 如果它设置为正值,则可以帮助使更新步骤更加保守。 通常这个参数是不需要的,但是当类非常不平衡时,它可能有助于逻辑回归。 将它设置为1-10的值可能有助于控制更新
    范围:[0,∞]
  6. subsample [缺省值=1] 
    这个参数控制对于每棵树,随机采样的比例。 减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。 典型值:0.5-1,0.5代表平均采样,防止过拟合. 
    范围: (0,1]
  7. colsample_bytree [缺省值=1] 
    用来控制每棵随机采样的列数的占比(每一列是一个特征)。 典型值:0.5-1 
    范围: (0,1]
  8. colsample_bylevel [缺省值=1] 
    用来控制树的每一级的每一次分裂,对列数的采样的占比。 我个人一般不太用这个参数,因为subsample参数和colsample_bytree参数可以起到相同的作用。但是如果感兴趣,可以挖掘这个参数更多的用处。 
    范围: (0,1]
  9. lambda [缺省值=1,别名: reg_lambda] 
    权重的L2正则化项。(和Ridge regression类似)。 这个参数是用来控制XGBoost的正则化部分的。
    调节目标函数中正则化项以调整模型复杂程度,提高函数泛化能力(防止过拟合),而且L2范数还可以让优化求解更稳定和快速。.
  10. alpha [缺省值=0,别名: reg_alpha] 
    权重的L1正则化项。(和Lasso regression类似)。 可以应用在很高维度的情况下,使得算法的速度更快。
  11. tree_method,string [default ='auto']
    XGBoost中使用的树构建算法(参见参考文献中的描述)
    分布式和外部存储器版本仅支持近似算法。
    选择:{'auto','exact','approx','hist','gpu_exact','gpu_hist'}
    'auto':使用启发式来选择更快的。
    对于中小型数据集,将使用精确的贪心算法。
    对于非常大的数据集,将选择近似算法。
    由于旧行为总是在单机中使用精确的贪心算法,因此当选择近似算法来通知此选择时,用户将收到消息。
    'exact':精确的贪婪算法。
    'approx':使用草图和直方图的近似贪心算法。
    'hist':快速直方图优化的近似贪心算法。 它使用一些性能改进,如箱缓存。
    'gpu_exact':精确算法的GPU实现。
    'gpu_hist':GPU算法的实现。
  12. sketch_eps,[默认= 0.03]
    这仅用于近似贪心算法。
    这大致转换为O(1 / sketch_eps)箱数。 与直接选择箱数量相比,这具有草图准确性的理论保证。
    通常用户不必调整它。 但考虑设置更低的数字以获得更准确的枚举。
    范围:(0,1)
  13. scale_pos_weight[缺省值=1] 
    在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。通常可以将其设置为负样本的数目与正样本数目的比值。
  14. updater,[默认='grow_colmaker,prune']
    一个逗号分隔的字符串,用于定义要运行的树更新程序的序列,提供了一种模块化的方法来构建和修改树。这是一个高级参数,通常根据其他参数自动设置。但是,它也可以由用户明确设置。以下更新插件存在:
        'grow_colmaker':非分布式树状结构。
        'distcol':分布式树结构,具有基于列的数据分割模式。
        'grow_histmaker':基于全局直方图计数提议的基于行的数据分割的分布式树结构。
        'grow_local_histmaker':基于局部直方图计数。
        'grow_skmaker':使用近似的草绘算法。
        'sync':同步所有分布式节点中的树。
        'refresh':根据当前数据刷新树的统计数据和/或叶值。请注意,不会对数据行进行随机子采样。
        'prune':修剪损失在分布式设置中,隐式更新器序列值将按如下方式进行调整:
        'grow_histmaker,修剪'当dsplit ='行'(或默认);或者当数据有多个稀疏页面时
        'distcol'when dsplit ='col'
  15. refresh_leaf,[default = 1]
    这是'refresh'更新插件的参数。 当这个标志为真时,树叶以及树节点的统计信息被更新。 如果为false,则只更新节点统计信息。
  16. process_type,[default ='default']
    一种促进过程的运行。
    选择:{'default','update'}
    'default':创建新树的正常提升过程。
    update”:从现有模型开始,只更新其树。 在每次boost迭代中,都会从初始模型中获取一棵树,为该树运行指定的updater插件序列,并将修改后的树添加到新模型中。 新模型将具有相同或更少的树数,具体取决于所执行的增强迭代次数。 目前,以下内置更新插件可以有效地用于此流程类型:'refresh','prune'。 使用'update',不能使用创建新树的更新插件。
  17. grow_policy,string [default ='depthwise']
    控制新节点添加到树的方式。
    目前仅当tree_method设置为'hist'时才受支持。
    选择:{'depthwise','lossguide'}
    'depthwise':在离根最近的节点处分割。
    'lossguide':分割损失变化最大的节点。
  18. max_leaves,[默认= 0]
    要添加的最大节点数。 只与“损失指导”增长政策相关。
  19. max_bin,[default = 256]
    这仅在'hist'被指定为tree_method时才被使用。
    用于存储连续特征的离散组的最大数目。
    增加这个数字以更高的计算时间为代价提高了分割的最优性。
  20. 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

  1. lambda [缺省值=0,别称: reg_lambda] 
    L2正则化惩罚系数,增加该值会使得模型更加保守。
  2. alpha [缺省值=0,别称: reg_alpha] 
    L2正则化惩罚系数,增加该值会使得模型更加保守。
  3. 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

  1. 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分发的结果进行建模可能很有用。
  2. base_score [默认= 0.5]
    所有实例的初始预测分数,全局偏差
    对于足够数量的迭代,更改此值不会产生太多影响。
  3. 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参数的指定值处)
  4. 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')
  • 将一个CSV文件加载到DMatrix中:
# 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数组加载,然后执行一次性编码。)
  • 将一个numpy数组加载到DMatrix中:
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可以使用成对的列表或字典来设置参数。 例如:

  • Booster parameters
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)

你可能感兴趣的:(Python,机器学习)