Xgboost的官方文档在这里
我们今天直接从代码部分开始学习
见下图黑色圈内的部分
首先来看XGBoost参数(黑圈里的第二行)
在运行XGBoost之前,一定要设定好三类参数:
一般参数:即我们使用什么基学习器模型(一般树?线性模型?)来构建boosting算法(这里没有boosting算法的同学请自己简要补一下集成学习的课。。)
booster参数:这取决于上面一般参数的选择
学习任务参数:决定模型的学习方案
还有一个指令行参数,说是与console version的xgboost有关 似乎是稍微次要一些的参数
首先来看一般参数
- booster:默认为gbtree(gradient boosting tree 梯度提升树) 我们还可以换成gblinear或者dart(decision and regression tree)。其中,gbtree和dart使用树模型而gblinear使用线性模型(这是显而易见的,顾名思义)
- silent:默认为0。好像官方极不推荐把它调成非0,强烈建议用verbosity
- verbosity:默认为1.似乎是出现异常、非期望行为时的反馈信息严重度。0为不反馈silent,1是警告,2是info,3是debug
- nthread:多线程的线程数,默认为可能的最大值
- disable_default_eval_metric:默认为0,若设为>0则禁止default metric(似乎是禁用默认评价函数)
- num_pbuffer、num_feature:xgboost 自动设置 不管了
接下来看树模型的booster参数
参数太多了 图就不截了
这些参数是
-
List item
-
eta [default=0.3, alias: learning_rate]
eta默认0.3,取值范围是 [0,1],是更新收缩的描述,使得每一次更新权重时收缩它以防止过拟合 -
gamma [default=0, alias: min_split_loss]取值范围[0,∞]
树节点进行一次分叉所需的最小的损失降低
gamma越大,似乎是算法具有更强的泛化能力。 -
max_depth [default=6]树的最大深度 默认是6,增加此值会使模型更复杂、更容易过拟合。仅当tree_method设为hist时允许设为0,此时0的意思是没有深度限制 当然这也会使用更多的内存
-
min_child_weight [default=1] 默认为1 取值为[0,∞] 越大、具有更强的泛化能力。
这里参考(更多内容参照下面这个帖子)
https://blog.csdn.net/m0_37477175/article/details/79991198
決定最小葉子節點樣本權重和。如果在一次分裂中,葉子節點上所有樣本的權重和小于min_child_weight則停止分裂,能夠有效的防止過擬合,防止學到特殊樣本。
-
max_delta_step [default=0]最大delta步 默认为0,0意味着没有限制,若设为一个正数,它将让我们的模型具有更强的泛化能力。通常不需要,但是当逻辑斯特回归中分类非常不均衡时使用这个参数设置为1-10
-
subsample [default=1] 下采样率,若设为0.5意味着算法会随机从训练集的一半进行采样先验来使得树生长,防止过拟合。下采样在每次boosting迭代时进行 范围(0,1]
-
colsample_bytree, colsample_bylevel, colsample_bynode [default=1] 这是一族下采样参数 每一个都是(0, 1]默认为1
-
这里待补充 给个原图先
-
lambda [default=1, alias: reg_lambda]
L2 正则化项权重 越大则泛化能力越强
- alpha [default=0, alias: reg_alpha]
L1 正则化项权重 越大则泛化能力越强
-
tree_method string [default= auto]使用的树的类型
可选的种类为: auto, exact, approx, hist, gpu_exact, gpu_hist
auto: 用启发式算法来找最快的方法 对中小数据集使用精确贪心方法、对大数据集使用近似算法(使用时会弹出相应信息)对
exact: Exact greedy algorithm.精确贪心算法
approx: 用 quantile sketch and gradient histogram.的近似贪心
hist: Fast histogram optimized approximate greedy algorithm. It uses some performance improvements such as bins caching.(好像是一种矩形图优化的近似贪心算法)
gpu_exact: GPU版exact
gpu_hist: GPU 版 hist . -
sketch_eps [default=0.03]仅在approx方法中用到,range: (0, 1)
通常不要自己设置 -
scale_pos_weight [default=1] 控制正负权重的平衡 对非均衡分类有用 一种可以考虑的值为 反例数/正例数
-
updater [default= grow_colmaker,prune]通常自动设置 取决于其它参数
- refresh_leaf
[default=1]刷新叶 若为1 树的叶和结点状态更新 当为0 仅后者更新
- process_type [default= default]可选为default 和 update
default: 创建新树的普通boosting过程
update: 从一个存在的模型开始,仅更新树. 若为update, 不可引入更新插件
-
grow_policy [default= depthwise]控制一路新结点并加到树上仅支持tree_method = hist
Controls a way new nodes are added to the tree.
可选: depthwise, lossguide
depthwise: 分裂离root最近的结点
lossguide: 分裂最高loss change的结点 -
max_leaves [default=0]可加的最大结点数 仅在grow_policy=lossguide设置
-
max_bin, [default=256]仅在 tree_method=hist时设置 最大的分离bin来盛放连续特征 增加会优化分叉、消耗更多时间
-
predictor, [default=
cpu_predictor
]可选gpu_predictor: 仅在 tree_method is gpu_exact or gpu_hist是可用 -
num_parallel_tree, [default=1] - 每次迭代时的并行树的数目,这个参数是为了支持随机森林算法的。Number of parallel trees constructed
Additional parameters for Dart Booster
决策回归树中额外参数 因为没用这个 没有太看 附图
线性模型中的参数 先上图
这里很多都是和上面类似的,有一个top_k值得关注 默认是0 这里是选择的前k个特征(使用greedy或thrifty)为0则使用所有特征
GPU支持及算法
按照官方文档说明,需要首先安装好Xgboost
pip3 install xgboost
这里有两点note,一个是在说这个xgboost的whl支持GPU算法(gpu_exact, gpu_hist)
需要用英伟达显卡
多卡仅Linux系统支持
whl仅提供给64位LINUX和windows系统
接下来回到原来的GPU SUPPORT界面,看第一部分内容
1.CUDA Accelerated Tree Construction Algorithms
在参数中,tree_method表示使用的算法类别(即上面那个括号里的exact和hist)
其中,gpu_exact是标准XGBOOST算法,对树分叉执行精准搜索
比gpu_hist慢、占用更多内存
而,gpu_hist是xgboost直方图算法?(这里我是直翻,可能不太对)
记住它比gpu_exact使用更少的内存且有更快的速度就行了,但是如果你的GPU是比帕斯卡架构更老的GPU(10系之前的,如980TI),那就会运行得很慢
两个算法各自支持的参数如下:
可以使用gpu的方法的同时使用cpu_predictor以节省显存(不过以现在的GPU性能 好像不会这么干)
下面是GPU支持的目标函数
下面是GPU支持的描述函数
CPU VS GPU的性能对比
接下来研究python上实现xgboost
https://github.com/dmlc/xgboost/tree/master/demo/guide-python是一个例程
https://xgboost.readthedocs.io/en/latest/python/python_api.html是python的API说明
xgboost可以加载下面这些数据类型
LibSVM text format file
Comma-separated values (CSV) file
NumPy 2D array
SciPy 2D sparse array
Pandas data frame, and
XGBoost binary buffer file.
注:
- 1.不支持离散类别型特征,请用onehot处理后再输入
- 2.关于pandas数据集有表头的情况,见下面的csv读取格式
设置参数
很容易 用list和dict即可
训练
先建立模型(使用上面的参数)
训练后可以存储模型 也可以加载训练好的模型
可以将模型和特征映射存进文本文件