使用Xgboost模型需使用单独的Xgboost库,该库提供了两种Python接口风格。一种是XGBoost自带的原生Python API接口,另一种是sklearn风格的API接口,两者的实现方案基本一致,仅有细微的API使用的不同(此外,部分原生的参数并未在sklearn风格的API接口中实现,因此原生参数对模型的控制更加精细),在执行效率上原生接口往往更胜一筹,但sklearn风格更容易与其它sklearn中的算法模型进行比照。

1. 两类API接口
1.1 原生Python API接口

原生Python API接口的建模逻辑如下图所示:
在这里插入图片描述
(1)将需要训练和测试的数据用DMatrix进行封装
DMatrix是xgboost内置的数据类型,其可接收pandas.DataFrame、numpy.array,spicy.sparse等数据类型进行转换,也可直接接收指定txt所在路径。

import xgboost as xgb
data_train = xgb.DMatrix(X_train, y_train)
data_test = xgb.DMatrix(X_test, y_test)

导入时还可同时设定样本权重(参数weight)、缺失值填充值(参数missing)、特征名称(参数feature_names)和特征数据格式(参数feature_types)等参数。

注意:若训练数据带有features_names(如pandas.DataFrame),则模型会记录这些属性,因此测试数据也必须具有同样的features_names,否则会报错。

(2)定义xgb的参数字典params
其相当于xgboost算法中的基学习器参数。完整的params设置包括:

params = {eta, gamma, max_depth, min_child_weight, max_delta_step, subsample, colsample_bytree,
colsample_bylevel, colsample_bynode, lambda, alpha, tree_method, sketch_eps, scale_pos_weight, updater,
refresh_leaf, process_type, grow_policy, max_leaves, max_bin, predictor, num_parallel_tree}

这些参数的意义将在后面详细介绍。

(3)对模型进行训练xgb.train()
其作用相当于sklearn中fit方法,train方法配置如下,其相当于xgboost算法中的框架参数。

xgb.train (params, dtrain, num_boost_round=10, evals=(), obj=None, feval=None, maximize=False,
early_stopping_rounds=None, evals_result=None, verbose_eval=True, xgb_model=None, callbacks=None,
learning_rates=None)

(4)利用训练好的模型进行预测xgb.predict()
其作用相当于sklearn中predict方法。

1.2 原生Python API接口

为了便于sklearn的使用者更方便的使用xgboost算法,该库提供了一套更符合sklearn使用习惯的API接口。其建模逻辑与sklearn中的其它机器学习模型一致。
在这里插入图片描述
(1)实例化分类器实例对象est=xgb.XGBClassifier(params)或者回归器实例对象est=xgb.XGBRegressor(params),其中的模型参数params既包括基学习器的参数,也包括框架参数。

# 以XGBRegressor为例
est = xgboost.XGBRegressor (max_depth=3, learning_rate=0.1, n_estimators=100, silent=True,
objective='reg:linear', booster='gbtree', n_jobs=1, nthread=None, gamma=0, min_child_weight=1, max_delta_step=0,
subsample=1, colsample_bytree=1, colsample_bylevel=1, reg_alpha=0, reg_lambda=1, scale_pos_weight=1,
base_score=0.5, random_state=0, seed=None, missing=None, importance_type='gain', **kwargs

(2)模型训练est.fit()

est.fit(self, X, y, sample_weight=None, eval_set=None, eval_metric=None, early_stopping_rounds=None, 
verbose=True, xgb_model=None,sample_weight_eval_set=None)

(3)模型的使用est.predict()

2. 模型主要参数

xgboost中主要包含三种类型的数据:框架参数基学习器参数以及其它配置参数

sklearn API参数 原生API参数 参数类型 参数含义 说明
n_estimators num_round 框架参数 子学习器个数 boosting框架下的子学习器数量。在原生API中,该参数在train方法中定义。
learning_rate eta 框架参数 步长 用于限制子学习器的过拟合,提高模型的泛化能力,与n_estimators配合使用
silent silent 框架参数 运行信息输出控制 0表示输出运行信息,1表示采取静默模式。默认值为0.
subsample subsample 框架参数 样本子采样数 每个子学习器训练时采样的行采样比例(值区间为0~1),采样方式为无放回采样。
max_depth max_depth 基学习器参数 树的最大深度 对基学习器函数空间的正则化,一种预修剪手段。
objective objective 基学习器参数 损失函数 自定义的损失函数,通过申明合适的损失函数来处理分类、回归和排序问题。常见的方法包括线性回归‘reg:linear’、逻辑回归'reg:logistic'、二分类逻辑回归'binary:logistic',多分类'multi:softmax',平方误差`reg:squarederror`等
booster booster 基学习器参数 基学习器类型 xgboost中采用的基学习器,如梯度提升树'gbtree',梯度提升线性模型'gblinear'等
gamma gamma 基学习器参数 分裂阈值 即最小损失分裂,用来控制分裂遵循的结构分数提升下限阈值。
min_child_weight min_child_weight 基学习器参数 叶子节点最小权重 叶子节点允许的最小权重值(即节点中所有样本的二阶导数值之和),可视为是对叶子节点的正则化,是一种后剪枝的手段。
max_delta_step max_delta_step 基学习器参数 每棵子学习器的最大权重值 用于限制每棵子学习器的权重,提高模型的泛化能力。
colsample_bytree colsample_bytree 基学习器参数 以树为单位进行列采样 每棵树进行一次列采样
colsample_bylevel colsample_bylevel 基学习器参数 以层为单位进行列采样 以每棵树中的每一层为单位进行列采样
colsample_bynode colsample_bynode 基学习器参数 以节点为单位进行列采样 以每棵树中的每一节点为单位进行列采样。注意:colsample_bytree、colsample_bylevel和colsample_bynode分别从子树、层、节点三个层级进行列采样,这些系数是可以累计作用的。
reg_alpha alpha 基学习器参数 L1正则化系数 对集成模型进行L1正则化(以子节点的个数为约束)的系数,默认值为0。
reg_lambda lambda 基学习器参数 L2正则化系数 对集成模型进行L2正则化(以子节点权重w的平方和为约束)的系数,默认值为0。
nthread n_jobs 其它配置参数 最大并发线程数 最大并发线程数
scale_pos_weight scale_pos_weight 其它配置参数 类别样本权重 当关注预测问题的排序或者AUC指标时,通过设置该参数提高预测结果。如果需要预测的是概率预测值,则无须设置该值,而应当设置max_delta_step参数。
base_score base_score 其它配置参数 初始预测值 相当于为模型添加一个初始的bias。
random_state seed 其它配置参数 随机种子 控制模型的随机性。
missing missing 其它配置参数 缺失值处理 为缺失值进行标注。默认为None,即标注为np.nan。
importance_type importance_type 其它配置参数 特征权重计算策略 其值可为'gain'、'weight', 'cover', 'total_gain' 或者 'total_cover',可通过调用booster的get_score方法获取对应的特征权重。其中'weight'表示特征被分裂的次数;'total_gain'和 'gain'分别表示各特征分裂导致的结构分数增益总值以及在各树上的平均值;而 'total_cover'和 'cover'分别表示各特征分裂涉及的样本总覆盖率及各树上的平均值。

除了上述模型,在xgboost的fit方法中,还涉及到几个重要参数:
(1)sample_weight:表示样本权重
(2)eval_set:在训练的同时进行验证的数据集
(3)eval_metric:验证集的评价指标
(4)early_stopping_rounds: 根据模型在验证集表现的早停轮数阈值。具体而言,若模型在连续early_stopping_rounds次迭代过程中,其在eval_set上的eval_metric并无提升,则模型停止迭代。

3. 模型的调参

Xgboost库的模型参数众多(尤其是原生API的更甚),其基础的调参过程类似于GBDT模型,即一般着重调节如下参数。
(1)根据问题类型和场景,选择合适的booster和objective。
(2)联合调节n_estimators和learning_rate。
(3)调节基学习器的相关控制参数。
(4)调节其它超参数。
(5)适当缩小learning_rate和增大n_estimators,提高总模型的泛化能力。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐