GBDT(GBM)调参方法

GBM参数

总的来说GBM的参数可以被归为三类:

  1. 树参数:调节模型中每个决定树的性质
  2. Boosting参数:调节模型中boosting的操作
  3. 其他模型参数:调节模型总体的各项运作

 GBDT类库弱学习器参数,即定义一个决定树所需要的参数:

由于GBDT使用了CART回归决策树,因此它的参数基本来源于决策树类,也就是说,和DecisionTreeClassifier和DecisionTreeRegressor的参数基本类似。

min_ samples_split 

内部节点再划分所需最小样本数,这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

  • 定义了树中一个节点所需要用来分裂的最少样本数。
  • 可以避免过度拟合(over-fitting)。如果用于分类的样本数太小,模型可能只适用于用来训练的样本的分类,而用较多的样本数则可以避免这个问题。
  • 但是如果设定的值过大,就可能出现欠拟合现象(under-fitting)。因此我们可以用CV值(离散系数)考量调节效果。

min_ samples_leaf 

叶子节点最少样本数,这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

  • 定义了树中终点节点所需要的最少的样本数。
  • 同样,它也可以用来防止过度拟合。
  • 在不均等分类问题中(imbalanced class problems),一般这个参数需要被设定为较小的值,因为大部分少数类别(minority class)含有的样本都比较小。

min_ weight_ fraction_leaf 

叶子节点最小的样本权重和,这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

  • 和上面min_ samples_ leaf很像,不同的是这里需要的是一个比例而不是绝对数值:终点节点所需的样本数占总样本数的比值。
  • #2和#3只需要定义一个就行了

max_ depth 

决策树最大深度,默认可以不输入,如果不输入的话,默认值是3。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

  • 定义了树的最大深度。
  • 它也可以控制过度拟合,因为分类树越深就越可能过度拟合。
  • 当然也应该用CV值检验。

max_ leaf_ nodes 

最大叶子节点数,通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

  • 定义了决定树里最多能有多少个终点节点。
  • 这个属性有可能在上面max_ depth里就被定义了。比如深度为n的二叉树就有最多2^n个终点节点。
  • 如果我们定义了max_ leaf_ nodes,GBM就会忽略前面的max_depth。

max_ features 

划分时考虑的最大特征数,可以使用很多种类型的值,默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑log2Nlog2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑N−−√N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。

  • 决定了用于分类的特征数,是人为随机定义的。
  • 根据经验一般选择总特征数的平方根就可以工作得很好了,但还是应该用不同的值尝试,最多可以尝试总特征数的30%-40%.
  • 过多的分类特征可能也会导致过度拟合。

min_impurity_split

节点划分最小不纯度,这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。

GBDT类库boosting框架参数

learning_ rate 

即每个弱学习器的权重缩减系数ν,也称作步长,在原理篇的正则化章节我们也讲到了,加上了正则化项,我们的强学习器的迭代公式为fk(x)=fk−1(x)+νhk(x)。ν的取值范围为0<ν≤1。对于同样的训练集拟合效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。一般来说,可以从一个小一点的νν开始调参,默认是1。       

 这个参数决定着每一个决定树对于最终结果的影响。GBM设定了初始的权重值之后,每一次树分类都会更新这个值,而learning_ rate控制着每次更新的幅度。

        一般来说这个值不应该设的比较大,因为较小的learning rate使得模型对不同的树更加稳健,就能更好地综合它们的结果。

n_ estimators 

也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是100。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。

  • 定义了需要使用到的决定树的数量(步骤2)
  • 虽然GBM即使在有较多决定树时仍然能保持稳健,但还是可能发生过度拟合。所以也需要针对learning rate用CV值检验。

subsample

子采样取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间,默认是1.0,即不使用子采样。

  • 训练每个决定树所用到的子样本占总样本的比例,而对于子样本的选择是随机的。
  • 用稍小于1的值能够使模型更稳健,因为这样减少了方差。
  • 一把来说用~0.8就行了,更好的结果可以用调参获得。

好了,现在我们已经介绍了树参数和boosting参数,此外还有第三类参数,它们能影响到模型的总体功能:

loss

即我们GBDT算法中的损失函数。分类模型和回归模型的损失函数是不一样的。

  对于分类模型,有对数似然损失函数"deviance"和指数损失函数"exponential"两者输入选择。默认是对数似然损失函数"deviance"。一般来说,推荐使用默认的"deviance"。它对二元分离和多元分类各自都有比较好的优化。而指数损失函数等于把我们带到了Adaboost算法。

  对于回归模型,有均方差"ls", 绝对损失"lad", Huber损失"huber"和分位数损失“quantile”。默认是均方差"ls"。一般来说,如果数据的噪音点不多,用默认的均方差"ls"比较好。如果是噪音点较多,则推荐用抗噪音的损失函数"huber"。而如果我们需要对训练集进行分段预测的时候,则采用“quantile”。

  • 指的是每一次节点分裂所要最小化的损失函数(loss function)
  • 对于分类和回归模型可以有不同的值。一般来说不用更改,用默认值就可以了,除非你对它及它对模型的影响很清楚。

init 

即我们的初始化的时候的弱学习器,如果不输入,则用训练集样本来做样本集的初始化分类回归预测。否则用init参数提供的学习器做初始化分类回归预测。一般用在我们对数据有先验知识,或者之前做过一些拟合的时候,如果没有的话就不用管这个参数了。

  • 它影响了输出参数的起始化过程
  • 如果我们有一个模型,它的输出结果会用来作为GBM模型的起始估计,这个时候就可以用init 

alpha

这个参数只有GradientBoostingRegressor有,当我们使用Huber损失"huber"和分位数损失“quantile”时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个分位数的值。

random_ state 

  • 作为每次产生随机数的随机种子
  • 使用随机种子对于调参过程是很重要的,因为如果我们每次都用不同的随机种子,即使参数值没变每次出来的结果也会不同,这样不利于比较不同模型的结果。
  • 任一个随即样本都有可能导致过度拟合,可以用不同的随机样本建模来减少过度拟合的可能,但这样计算上也会昂贵很多,因而我们很少这样用

verbose 

  • 决定建模完成后对输出的打印方式: 
    • 0:不输出任何结果(默认)
    • 1:打印特定区域的树的输出结果
    • >1:打印所有结果

warm_ start 

  • 这个参数的效果很有趣,有效地使用它可以省很多事
  • 使用它我们就可以用一个建好的模型来训练额外的决定树,能节省大量的时间,对于高阶应用我们应该多多探索这个选项。 

presort 

  • 决定是否对数据进行预排序,可以使得树分裂地更快。
  • 默认情况下是自动选择的,当然你可以对其更改

参数调节的一般方法

learning rate没有什么特别的调节方法,因为只要我们训练的树足够多learning rate总是小值来得好。

虽然随着决定树的增多GBM并不会明显得过度拟合,高learing rate还是会导致这个问题,但如果我们一味地减小learning rate、增多树,计算就会非常昂贵而且需要运行很长时间。了解了这些问题,我们决定采取以下方法调参:

  1. 选择一个相对来说稍微高一点的learning rate。一般默认的值是0.1,不过针对不同的问题,0.05到0.2之间都可以
  2. 决定当前learning rate下最优的决定树数量。它的值应该在40-70之间。记得选择一个你的电脑还能快速运行的值,因为之后这些树会用来做很多测试和调参。
  3. 接着调节树参数来调整learning rate和树的数量。我们可以选择不同的参数来定义一个决定树,后面会有这方面的例子
  4. 降低learning rate,同时会增加相应的决定树数量使得模型更加稳健

固定 learning rate和需要估测的决定树数量

为了决定boosting参数,我们得先设定一些参数的初始值,可以像下面这样:

  1. min_ samples_ split=500: 这个值应该在总样本数的0.5-1%之间,由于我们研究的是不均等分类问题,我们可以取这个区间里一个比较小的数,500。
  2. min_ samples_ leaf=50: 可以凭感觉选一个合适的数,只要不会造成过度拟合。同样因为不均等分类的原因,这里我们选择一个比较小的值
  3. max_ depth=8: 根据观察数和自变量数,这个值应该在5-8之间。这里我们的数据有87000行,49列,所以我们先选深度为8。
  4. max_ features=’sqrt’: 经验上一般都选择平方根。
  5. subsample=0.8: 开始的时候一般就用0.8

注意我们目前定的都是初始值,最终这些参数的值应该是多少还要靠调参决定。现在我们可以根据learning rate的默认值0.1来找到所需要的最佳的决定树数量,可以利用网格搜索(grid search)实现,以10个数递增,从20测到80。

调节树参数

树参数可以按照这些步骤调节:

  1. 调节max_depth和 num_samples_split
  2. 调节min_samples_leaf
  3. 调节max_features

需要注意一下调参顺序,对结果影响最大的参数应该优先调节,就像max_depthnum_samples_split

可以使用网格搜索(grid search),根据电脑情况适当调整需要测试的值。

调节子样本比例来降低learning rate

有一个技巧就是用“warm_start”选项。这样每次用不同个数的树都不用重新开始

GBDT scikit -learn相关参数

 

参考

Gradient Boosting Machine(GBM)调参方法详解

梯度提升树(GBDT)原理小结

scikit-learn 梯度提升树(GBDT)调参小结

https://github.com/ljpzzz/machinelearning/blob/master/ensemble-learning/gbdt_classifier.ipynb

Gradient Boosting(GBM) 调参指南

 

Lasso回归是一种通过加入L1正则化来进行特征选择的线性模型。alpha是Lasso模型中用来控制正则化项的超参数,调参时需要选择合适的alpha值。 调参方法一般包括以下几个步骤: 1. 确定alpha的粗略范围:首先,可以通过网格搜索方法在一个粗略的alpha值范围内进行调参,比如取0.0001, 0.001, 0.01, 0.1, 1, 10等不同的alpha值。 2. 交叉验证选择最佳alpha:在确定了粗略范围后,可以使用交叉验证来选择最佳的alpha值。将数据集分为训练集和验证集,在训练集上训练Lasso模型,然后在验证集上评估模型的性能。对于不同的alpha值,重复进行上述步骤,得到不同alpha取值下模型的性能指标,如均方误差(MSE)或R平方(R^2)。最终选择能在验证集上表现最好的alpha值。 3. 利用学习曲线选择alpha:学习曲线是一个展示模型在不同训练样本数下性能的曲线。可以通过绘制Lasso模型在不同alpha值下的学习曲线,观察在不同训练样本数下模型的表现。选择alpha时,应考虑模型的性能和复杂度。较小的alpha值对应较稀疏的解,较大的alpha值对应更多的非零系数。 4. 使用交叉验证和网格搜索调优:在选择了一个较小的alpha值后,可以通过使用交叉验证和网格搜索的方法来精细调节alpha的值。交叉验证帮助评估模型在不同alpha值上的性能,网格搜索则用于寻找最佳alpha。 调参Lasso模型中的alpha值需要根据实际数据集的特点来确定。一个过小或过大的alpha值都可能导致模型效果不佳,因此需要进行合理的调参来获得最佳的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值