和随机森林模型类似,scikit-learn中的GBDT模型也是基于决策树模型的集成算法,区别在于前者基于并行的bagging框架,而后者基于串行的boosting框架。
将boosting框架作用于CART树上,分别有适用于分类问题的GBDTClassifier和适用于回归问题的GBDTRegressor。两者在参数设定、调参等方面均极为类似。
1. 模型的主要参数
在GBDT中,存在两大类型的参数,分别为boosting框架参数和单棵决策树参数
1.1 boosting框架参数
boosting框架参数主要涉及各子决策树的迭代策略:
模型参数 | Parameter含义 | GBDTClassifier | GBDTRegressor |
n_estimators | 子树数量 | boosting框架下弱子学习器(子决策树)的数量,其值若偏小模型易欠拟合,若偏大计算量上升且容易过拟合。默认值为100。 | |
learning_rate | 步长 | 即每个弱学习器的权重缩减系数,用于防止对负梯度方向的过拟合,提高模型的泛化能力。默认值为0.1。 | |
loss | 损失函数 | 可微的损失函数,sklearn中不支持自定义。对于分类问题,可设置为'deviance'或'exponential',前者为默认值,表示对数损失函数(类似于logitstic回归),后为表示指数损失函数(此时模型退化为Adaboost)。对于回归问题,可设置为'ls', 'lad', 'huber', 'quantile',分别表示最小平方损失、最小绝对值损失、huber损失和分位数损失,默认值为'ls'。 | |
alpha | 分位数损失参数 | 分位数损失的参数,默认0.9。 | |
criterion | 分裂标准 | 可选择平方损失和绝对值损失函数。具体可设参数为'friedman_mse', 'mse',和'mae',默认取'friedman_mse'。 | |
subsample | 样本子采样比例 | 每棵子树在训练时的行采样比值(采用无放回的采样方式),默认为1.0。若取值小于1.0,即为随机GBDT模型。 | |
init | 先验评估器 | 即根据先验知识,进行初始化的分类器或分类器(需含fit和predict方法)。 | |
validation_fraction | 用于早停的验证数据比重 | 仅在设置n_iter_no_change时有用,通过设置一定的验证数据,对模型早停标准进行检测。默认值为0.1。 | |
n_iter_no_change | 早停轮数 | 若模型连续n_iter_no_change次更新,模型的损失函数增益均在tol范围内,则停止更新。默认值为None。 | |
tol | 早停损失增益阈值 | 若模型连续n_iter_no_change次更新,模型的损失函数增益均在tol范围内,则停止更新。默认值为1e-4 |
在上述参数的理解和设置中需要特别强调几点:
(1) 步长。步长的意义在于限制每棵子树的拟合能力,类似于梯度下降法中的学习率。该参数的设置与n_estimators的大小关系很大,因此需要联合调参。
(2) loss和criterion。loss参数决定了每棵子决策树在训练时拟合的负梯度方向,各典型损失函数见本博客;而criterion参数则决定了每棵子树在内部分裂时的评估标准,类似于单棵决策树的不纯度增益。即使对于GBDTClassifer,因为其在内部分裂时的训练目标均为连续的损失函数(而非简单的分类标签),所以GBDTClassifer和GBDTRegressor采用的内部分裂criterion是一致的。
(3) early stopping机制。和梯度下降法一样,GBDT设置了early stopping机制。相关参数包括validation_fraction(划分用于验证的数据)、n_iter_no_change(迭代轮数)和tol(阈值)。
1.2 单棵决策树参数
单棵决策树参数与先前介绍的决策树模型非常类似。
模型参数 | Parameter含义 | DecisionTreeClassifier | DecisionTreeRegressor |
max_depth | 树的深度 | 每棵树生长的最大深度,用于预剪枝,限制模型对应的函数空间。默认为3。 | |
min_samples_split | 节点分裂后子节点允许的最小样本数 | 用于节点分裂后子节点的校验和撤回,属于后剪枝的范畴。可设为整数或全体样本量的百分比。 | |
min_samples_leaf | 叶子节点最小样本数 | 树生长过程中,各叶子节点允许的最小样本数量,用于预剪枝。相当于对叶子节点的正则化。默认值为1。 | |
min_weight_fraction_leaf | 叶子节点最小权重比例 | 从样本权重的角度限制各叶子节点的样本规模,其效果同min_samples_leaf,默认值为0。 | |
max_features | 每次分裂时选择的特征数 | 默认为None,即选取全量特征。可设置为auto或sqrt,此为ExtraTree的默认值,即选择个全量特征的平方根进行分裂选择。此外可选参数还包括float((全量特征的比例)和log2(全量特征的对数值) | |
random_state | 随机种子 | 用于限定模型中的随机性。GBDT模型的随机性主要体现在:(1)max_features决定的特征选择的随机性;(2)subsample决定的行采样的随机性;(3)每次分裂时特征选择的次序的随机性,进而可能导致最优分裂特征的随机(当存在若干组最优分裂策略时) | |
max_leaf_nodes | 最大叶子节点数 | 允许模型拥有的最大叶子节点数目上限,用于限制模型规模,属于一种预剪枝策略。默认None,即无限生长。 | |
min_impurity_decrease | 最小纯度增益 | 若节点分裂后,纯度的提升值小于该阈值,则不进行本次分裂,用于限制模型规模。默认0。 | |
min_impurity_split | 最小分裂纯度 | 当节点的纯度小于该阈值时,停止分裂,作为叶子节点。是一种预剪枝策略。 | |
presort | 特征预排序 | 是否在训练前对每个特征的大小值进行预排序,在小规模数量级上可能会提高训练速度。 |
2. 模型的主要方法
GBDT是基于boosting框架的串行建模方法,其能够记录每步更新的情况。
模型方法 | Parameter含义 | 备注 |
fit | 模型训练 | 可通过sample_weight参数来设置权重。 |
predict | 预测结果 | 返回综合各子决策树结果后的分类值或者回归值,其值为每棵子树对应结果值的加权和。 |
decision_function | 分类问题决策函数 | 仅用于分类问题,数值上等于每棵子决策树对应叶子节点数值(负梯度方向拟合值)对应的加权和(利用步长加权),从而可以推导出分类问题的预测结果。 |
predict_prob | 概率预测 | 根据decision_function得到的概率值。 |
predict_log_proba | 对数概率预测 | 根据decision_function得到的对数概率值。 |
staged_predict | 分段预测值 | 每棵子树的分段预测值,可用于监测学习过程。 |
apply | 预测节点统计 | 返回各子决策树预测结果所在叶子节点的编号(在sklearn中该编号序列中也包括非叶子节点的编号)。 |
3. 模型的主要属性
模型属性 | Parameter含义 | 备注 |
n_estimators_ | 估计器列表 | 返回由n_estimators个子决策树构成的列表 |
feature_importances_ | 特征重要性 | 基于单棵决策数的gini_importance,得到各特征的加权和 |
oob_improvement_ | 样本分类结果 | 对于袋外数据,损失函数在每棵子树上的提升值序列 |
train_score_ | 特征权重 | 对于袋内数据,损失函数在每棵子树上的提升值序列 |
init_ | 含义 | 初始时刻的基础模型 |
4. 模型的可视化
不同于单棵决策树可以进行有效的可视化,GBDT模型由于子学习器众多,且为串行运算过程,因此无法进行有效的可视化。即使可以对其中的每棵决策树进行单独的可视化,但考虑到随机性的影响,意义并不大。
5. 模型的调参
(1)根据问题场景,选择合适的损失loss和分裂标准criterion。并视情选择早停参数;
(2)联合调优n_estimators和learning_rate参数;
(3)按照决策树模型的调参顺序进行调整,详见决策树模型;
(4)调整随机采样参数,主要包括列采样max_features和行采样subsample;
(5)适当同比例缩小learning_rate和增大n_estimators的参数值,以进一步提升最终模型的泛化能力。