赞
踩
使用Xgboost模型需使用单独的Xgboost库,该库提供了两种Python接口风格。一种是XGBoost自带的原生Python API接口,另一种是sklearn风格的API接口,两者的实现方案基本一致,仅有细微的API使用的不同(此外,部分原生的参数并未在sklearn风格的API接口中实现,因此原生参数对模型的控制更加精细),在执行效率上原生接口往往更胜一筹,但sklearn风格更容易与其它sklearn中的算法模型进行比照。
原生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方法。
为了便于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()
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
并无提升,则模型停止迭代。
Xgboost库的模型参数众多(尤其是原生API的更甚),其基础的调参过程类似于GBDT模型,即一般着重调节如下参数。
(1)根据问题类型和场景,选择合适的booster和objective。
(2)联合调节n_estimators和learning_rate。
(3)调节基学习器的相关控制参数。
(4)调节其它超参数。
(5)适当缩小learning_rate和增大n_estimators,提高总模型的泛化能力。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。