XGBoost 核心数据结构和API
1. DMatrix
DMatrix 为XGBoost中数据存储的核心结构。训练数据和测试数据均需封装成 DMatrix 结构。
1.1 DMatrix 构造函数
DMatrix的构造函数包含8个参数:
- data (string/numpy array/scipy.sparse/pd.DataFrame/DataTable)
DMatrix的数据源,当该值为字符串时,它表示数据源的文件路径
- label (list or numpy 1-D array, 可选)
训练数据的标签
- missing (float, 可选)
缺省值表示字符,如果没填, 默认值为:np.nan
- weight (list or numpy 1-D array , 可选)
每个样本的权重
- silent (boolean, 可选)
构造数据结构时是否显示日志
- feature_names (list, 可选)
各个特征的名称
- feature_types (list, 可选)
各个特征的数据类型
- nthread (integer, 可选)
加载数据开启的线程数,如果为-1,代表启用系统允许的最大进程数
2. Booster
Booster为XGBoost中的模型类,提供了一些基础的函数,如模型加载、保存、评估和预测等方法。
2.1 Booster 核心方法
下面我们列举下Booster提供的核心方法:
1. load_model(fname)
从文件或内存中加载模型,参数含义如下:
- fname (string or a memory buffer) – 模型文件名称或内存缓存对象
2. save_model(fname)
将模型保存到文件中,参数的含义如下:
- fname (string) – 输出文件的名称
3. eval(data, name, iteration)
用给定的数据评估模型好坏,参数的含义如下:
-
data (DMatrix) – 用于评估模型的数据
-
name (str, 可选) – 用于评估模型的数据集名称
-
iteration (int, 可选) –迭代次数
该函数返回的结果如下:
- result (string) 评估结果
4. predict(data, output_margin=False, ntree_limit=0, pred_leaf=False……)
预测给定数据的结果,参数的含义如下:
- data (DMatrix)
待预测的数据
- output_margin (bool)
是否输出原始未经转化的值
- ntree_limit (int)
用于预测的树的数量,默认为0,代表使用所有树进行预测
- pred_leaf (bool)
当启用该选项时,会输出一个(nsample, ntrees)矩阵,指明每条数据分别落到每棵树的哪个叶子节点上。
比如样本1落在的第一颗树的3号节点,第二棵树的5号节点,第三棵树的2号节点,则该样本对应的记录为[3,5,2]
- pred_contribs (bool)
如果启用该选项,则会输出一个(nsample, nfeats + 1)矩阵,指明每个样本的每个特征对预测结果的贡献值
注意最后一列为偏置大小。一个样本的所有特征贡献值加上偏置,就等于该样本的预测原始结果。
- approx_contribs (bool)
是否启用特征贡献大小的预估功能
- pred_interactions (bool)
当该选项设置为True时,会输出一个(nsample, nfeats + 1, nfeats + 1)矩阵,用于指明两两特征间相互影响的SHAP值
- validate_features (bool)
当该值为True时,会首先验证待预测的数据特征名称是否与模型中的特征名称相同,默认情况下,系统认为他们是相同的,不进行验证
该函数返回的结果如下:
- prediction (numpy array) 预测结果
3. train函数
train函数是XGBoost最核心的函数,通过该函数训练预测模型。
3.1 train 函数参数
调用train函数时,可以传入以下参数:
- params (dict)
配置参数,如目标函数,是否开启日志、每棵树的最大深度、学习率等,更多参数参加3.2,该参数为字典类型
- dtrain (DMatrix)
用于训练的数据
- num_boost_round (int)
训练的轮数,即生成的树的数量
- evals (list of pairs (DMatrix, string))
训练时用于评估模型的数据集合,用户可以通过验证集来评估模型好坏,常见的格式为[(trainData,“train”), (evalData,“eval”)]
- obj (function)
自定义的目标函数
- feval (function)
自定义的评价函数
- maximize (bool)
是否最大化评价指标
- early_stopping_rounds (int)
激活早停止,当验证的错误率early_stopping_rounds轮未下降,则停止训练。
启动早停止evals至少有一个评估数据集,如果有多个数据集,则用最后一个数据集进行评估。
如果发生了早停止,则模型会提供三个额外的字段:bst.best_score, bst.best_iteration 和 bst.best_ntree_limit
- evals_result (dict)
模型评估结果,字段形式。比如evals传入 [(dtest,‘eval’), (dtrain,‘train’)]而且参数中包含(‘eval_metric’: ‘logloss’), 则评估结果返回:
{‘train’: {‘logloss’: [‘0.48253’, ‘0.35953’]}, ‘eval’: {‘logloss’: [‘0.480385’, ‘0.357756’]}}
- verbose_eval (bool or int)
是否打印评估日志
- learning_rates (list or function (deprecated - use callback API instead))
学习率列表或者用于返回学习率的回调函数
- xgb_model (file name of stored xgb model or ‘Booster’ instance)
预加载模型,在训练前加载之前训练的模型
- callbacks (list of callback functions)
回调函数列表,每轮迭代结束后,都会调用该函数,比如重新设置学习率(参加回调函数实例)
3.2 配置参数
通过该参数来配置模型,如是否开启日志、树的最大深度、是否开启随机采样等
3.2.1 通用参数
- booster [default= gbtree ]
基础模型类型,默认为gbtree,可选参数包括: gbtree、gblinear、dart,其中gbtree、dart为树模型、gblinear为线性函数模型
- silent [default=0]
0 开启打印运行日志, 1 进入安静模式,不打印运行日志
- nthread [默认为最大可用线程数]
XGBoost并行运行的线程数,如果未设置,则最大化的启用可用先从
- disable_default_eval_metric [default=0]
是否禁用默认的衡量指标,当该值大于0时表示禁用默认衡量指标
- num_pbuffer [由XGBoost自动设置, 无需手动设置]
预测结果缓存大小,通常为训练样本的个数,该缓存用于存储最后一轮的预测结果。
- num_feature [由XGBoost自动设置, 无需手动设置]
XGBoost使用的特征维度,默认被设置成最大的特征维度
3.2.2 树形模型的参数
- eta [默认值:0.3, 别名: 学习率]
更新时使用的下降步长,用于防止过拟合。每轮迭代后,都会得到新的特征权重,通过eta来控制权重的减少量,从而增加模型的鲁棒性。
- gamma [默认值:0, 别名: 分割的最小损失值]
节点分裂需要下降的最小损失,低于该损失值时停止分裂。gamma值越大,算法越保守。
- max_depth [默认值:6]
树的最大深度。该值越大树的模型越复杂,越容易发生过拟合。如果该值为0,则意味着不限制树的深度。
当grow_policy设置为depthwise时,该值必须设置。
- min_child_weight [默认值:1]
节点中样本的最小权重和,当节点中所有样本的权重和小于该值时,则停止分裂。在线性回归任务中,这个值就等于节点中最小的样本数量。
该值越大,模型越保守,该值越小,模型越容易发生过拟合。
- max_delta_step [默认值:0]
每轮允许叶子输出值的最大增量。如果设置为0,则不限制,如果设置为正数,可以让模型更保守。
通常我们无需设置该参数,但如果样本极不均衡,在逻辑回归中,会使用该参数,通常设置为1-10。
- subsample [默认值:1]
采样率,每轮训练使用的样本数量等于样本总数乘以采样率。
比如采样率设置为0.5,意味着每轮训练只使用一半样本用作训练,这么做可以有效的防止过拟合。
- colsample_bytree [默认值:1]
每轮训练使用的特征占比。如果该值设置为0.5,意味着每轮训练只使用一半的特征用作训练。
- ccolsample_bylevel [默认值:1]
每层训练使用的特征占比。如果该值设置为0.5,意味着每次分裂只选用一半的特征。
- lambda [默认值:1, 别名: L2正则项系数]
L2正则化的权重系数,调大该值可以让模型更加保守
- alpha [默认值:0, 别名: L1正则项系数]
L1正则化的权重系数,调大该值可以让模型更加保守
- tree_method string [默认值:auto]
XGBoost中树的构造算法。分布式和外部存储版本只支持:tree_method=approx
可选项包括: auto, exact, approx, hist, gpu_exact, gpu_hist
- auto: 用启发式算法,选择最快速的构建算法
针对小型到中型的数据集,将会使用精确的贪心算法: exact
针对大型数据集,将会使用近似算法:approx
之前单机运行时,总是使用 exact 算法,因此当使用 approx 算法时,会打印一条日志消息
exact: 精确贪心算法
approx: 近似贪心算法,使用分位数和梯度图
hist: 快速直方图优化的近似贪心算法,它用于一些性能改进的领域,如bins caching等
gpu_exact: GPU版本的精确贪心算法
gpu_hist: GPU版本的快速直方图方法
- scale_pos_weight [默认值:1]
用于控制正例和负例均衡的权重,该参数用于不均衡的数据,它的值通常设置为:负例总数/正例总数
3.2.3 线性模型的参数
- lambda [默认值:1, 别名: L2正则项系数]
L2正则化的权重系数,调大该值可以让模型更加保守
- alpha [默认值:0, 别名: L1正则项系数]
L1正则化的权重系数,调大该值可以让模型更加保守
- updater [默认值:shotgun]
线性模型的拟合算法
shotgun: 基于shotgun算法的坐标下降法
coord_descent: 普通的坐标下降法
- feature_selector [默认值:cyclic]
特征选择和排序算法
cyclic: 循环变量特征
shuffle: 类型与循环变量特征,但是在每次更新时都会随机打乱特征的顺序
random: 随机(带替换)的坐标选择器
greedy: 选择最大梯度的坐标
thrifty: 近似greedy的坐标选择器
- top_k [默认值:0]
greedy算法和thrifty算法选择的最优特征数量,0表示不限制。
3.2.4 学习相关参数
- objective [默认值:reg:linear]
训练的模型类型和目标函数
reg:linear: 线性回归
reg:logistic: 逻辑回归
binary:logistic: 二分类问题, 输出概率值
binary:logitraw: 二分类问题, 输出得分值,需要通过sigmoid函数转化成概率值
binary:hinge: 二分类问题,使用铰链损失函数,输出0或1,而不是概率值
count:poisson: 用于计数问题的泊松分布,输出泊松分布的均值。
survival:cox: Cox regression for right censored survival time data (negative values are considered right censored). Note that
multi:softmax: 多分类目标函数, 使用此目标函数,需要设置样本类别数据: num_class
multi:softprob: 同softmax, 但是输出的结果为 ndata * nclass 维的向量,表示样本属于每个类别的概率
- base_score [默认值:0.5]
初始时各个样本的得分,也就是全局的偏置
- eval_metric [依据目标函数选择评估指标]
验证数据集上的评估指标,默认评估指标依据目标函数选取
用户也可以添加多个评估指标,多个评估指标需以list的形式传入
可选值的评估指标如下:
rmse: 根均方误差
mae: 平均绝对值误差
logloss: 负的似然函数
error: 二分类问题的分类错误率
merror: 多分类问题的分类错误率
mlogloss: 多分类问题的负似然函数
auc: IOC曲线下面积
aucpr: PR曲线下面积
- seed [默认值:0]
随机数种子