sklearn 梯度提升树调参
在 梯度提升树(GBDT) 中,对 \(GBDT\) 原理做了总结。本文对 \(sklearn\) 中 \(GBDT\) 的调参做一个总结。
1. sklearn 中 GBDT 的概述
在 \(sklearn\) 中,GradientBoostingClassifier 用于分类,GradientBoostingRegressor 用于回归。两者参数类型基本相同,当然损失函数 \(loss\) 的选择项是不同的。
\(GBDT\) 的参数我们分为两类:
-
\(Boosting\) 框架参数
-
弱学习 \(CART\) 回归树的参数
2. Boosting 框架参数
\(GradientBoostingClassifier、GradientBoostingRegressor\) 参数基本相同,下面一起陈述,不同点单独指出。
参数:
n_estimators
:弱学习器数量,默认 \(100\)。太小容易欠拟合,太大容易过拟合。常常将 \(n\_estimators\) 与 \(learning\_rate\) 一起考虑。learning_rate
:弱学习器的权重缩减系数 \(\nu\),即步长,默认 \(1\)。在 梯度提升树(GBDT) 中提出 \(GBDT\) 正则化,加法模型为 \(f_m(x) = f_{(m-1)}(x) + \nu \alpha_m G_m(x),\ \ \ \ 0<\nu \leqslant 1\),较小的 \(\nu\) 意味需要更多的弱学习器的迭代次数。 通常用步长、最大迭代次数一起决定算法的拟合效果。所以 \(n\_estimators、learning\_rate\) 一起考虑。subsample
:\(GBDT\) 正则化提到的子采样,取值为 \((0,1]\)。注意这里的子采样是不放回抽样,与随机森林不一样。如果取值为 \(1\),则全部样本都使用,等于没使用子采样;如果取值小于 \(1\),则只有一部分样本做 \(GBDT\) 决策树拟合。小于 \(1\) 的设置可以减少方差,即防止过拟合。但会增加样本拟合的偏差,因此取值不能太低。推荐 \([0.5,0.8]\) 之间。init
:初始化时的弱学习器,即 \(f_0(x)\)。如果不输入,用训练集样本来做样本集的初始化分类回归预测。否则用 \(init\) 参数提供的学习器做初始化分类回归预测。loss
:\(GBDT\) 损失函数。- 分类模型:对数似然损失函数(\(deviance\))、指数损失函数(\(exponential\))两个选择,默认对数似然损失函数,它对二元分类和多元分类有较好的优化,在 梯度提升树(GBDT) 中有详细介绍。指数损失函数等于将我们带到 \(AdaBoost\) 算法。
- 回归模型:均方差(\(squared\_error\))、绝对损失函数(\(absolute\_error\))、\(Huber\) 损失、分位数损失(\(quantile\)),默认均方差损失函数。一般来说,数据噪音不多,用默认的比较好;噪音过多,推荐抗噪音的损失函数 \(Huber\);如果需要对训练集进行分段预测,使用 \(quantile\)。
alpha
:\(GradientBoostingRegressor\) 专用,当使用 \(Huber\) 损失函数和分位数损失函数时,用来指定分位数的值。默认 \(0.9\),如果噪音较多,适当降低分位数的值。
3. 弱学习 CART 回归树的参数
由于 \(GBDT\) 弱学习器使用 \(CART\) 回归树,所以需要调节 \(CART\) 回归树的参数。
参数:
max_feature
:最大特征数,默认 \(None\),意味划分时考虑所有的特征数。如果是 \(log2\) 意味划分时最多考虑 \(log_2N\) 个特征;如果是 \(sqrt\) 或 \(auto\) 意味划分时最多考虑 \(\sqrt n\) 个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即(百分比\(\times N\))取整后的特征数。其中 \(N\) 为样本总特征数。一般来说,样本特征数不多,比如 \(<50\),默认的 \(None\) 就可以,如果特征数非常多,考虑上面描述的其他取值方法。max_depth
:决策树最大深度,默认不输入。如果输入,默认 \(3\)。一般来说,数据少或特征少的时候可以忽略该参数;如果数据多,特征也多的情况下,推荐限制最大深度。常用取值 \([10-100]\) 之间。min_samples_split
:结点划分所需最小样本数,默认 \(3\)。这个值限制结点继续划分的条件,如果某结点样本数小于 \(min\_samples\_split\),则不会继续选择特征来进行划分。当数据量少或特征少时,忽略该参数,当数据量多或特征多时推荐设置。min_samples_leaf
:叶子结点最小样本数,默认 \(1\)。如果某叶子结点样本数小于 \(min\_samples\_leaf\),则会被剪枝。如果设置为数字,那么将指定对应数量的样本;如果设置为浮点数,则指定为总样本量的百分比。当数据量多或特征多时推荐设置。min_weight_fraction_leaf
:叶子结点最小样本权重和,默认 \(0\),表示不考虑权重。这个值限制了叶子结点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。max_leaf_nodes
:最大叶子结点数,默认 \(None\),表示不限制叶子结点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。min_impurity_split
:结点划分最小不纯度,默认 \(1e-7\)。如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。