GBDT(Gradient Boosting Decision Tree)梯度提升决策树是提升树(Boosting Tree)的一种改进算法。前面讲的集成模型Boosting-Adaboost 算法是利用前一轮迭代弱学习器的误差率来更新训练集的权重,直至误差可接受时对所有弱分类器进行线性组合,是通过直接拟合真实值来构建模型的。Boosting Tree非首轮迭代是在每个基分类器上拟合上一个分类器的残差,寻找误差下降最快的分割点,每次都加入新的基分类器,来提升模型的精度。
举个例子假设一座山海拔1万米,我们首先用5000米去拟合,发现损失(差距)有5000米,第二轮我们用3000去拟合上一轮的损失,发现差距还有2000,第三轮我们用1500去拟合上一轮剩下的差距,差距只剩下500,如果迭代次数已完成或在误差接受范围内,则结束拟合,每一轮迭代,拟合的高度误差都会减小。最后将每次拟合的高度加起来是算法的拟合结果,前三轮的拟合结果是:5000+3000+1500=9500米。对于提升树来讲,损失函数是平方损失,只需要简单地拟合当前模型的残差。但是对于其他损失函数(如多维度的交叉熵损失函数),不容易直接获得模型的残差,每一步的拟合优化就比较困难。在此背景下,Freidman提出了GBDT,用损失函数的负梯度来拟合损失的近似值。进而拟合一个CART回归树。GBDT 算法提供了可选择的损失函数来处理分类、回归问题,例如对于分类问题可以使用指数损失函数、对数似然损失函数。对于回归问题可以选用均方差损失函数、绝对损失函数。GBDT的优点:可以处理连续值和离散值数据,故使用于分类问题与回归问题。
损失函数可较好地处理异常值。比如 Hube 损失函数和 Quantile 损失函数。
(四)GBDT参数
sklearn中的GBDT参数列表,分类器与回归器: 由于GBDT使用了CART回归决策树,因此它的参数很多是来源于决策树,所以可以把参数分为两类,一类是boosting框架相关的参数,另一类是决策树相关参数,与DecisionTreeClassifier和DecisionTreeRegressor的参数类似。 (1)boosting框架相关的参数n_estimators: 是弱学习器的最大迭代次数,或者说最大的弱学习器的个数,默认值为100。
n_estimators太小时,容易欠拟合,n_estimators太大时,容易过拟合。通常n_estimators和learning_rate权衡使用。
learning_rate: 即每个弱学习器的权重缩减系数ν,也称作步长,为了防止过拟合,加上了正则化项,这个正则化项通常称为步长(learningrate),取值范围为(0,1]。
对于同样的训练集拟合效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。
通常用步长和迭代最大次数n_estimators共同决定了算法的拟合效果。
所以这两个参数n_estimators和learning_rate要权衡调参。
通常 learning_rate可以从小值开始调参,也就是使该弱分类器从小到大逐渐发挥作用,默认是1。
subsample: 用于拟合单个若学习器的样本比例,即子采样,取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,相当于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间,默认是1.0,即不使用子采样。 subsample与n_estimators交互使用。
init: 即初始化的弱学习器,默认为None,则用训练集样本来做样本集的初始化分类回归预测,否则用init参数提供的学习器做初始化分类回归预测。
loss: 即GBDT算法中的损失函数。
对于分类模型,有对数似然损失函数"deviance"和指数损失函数"exponential"两者输入选择。默认是对数似然损失函数"deviance"。推荐使用默认的"deviance",而指数损失函数则回到了Adaboost算法。
对于回归模型,loss参数值:{'ls ', ' lad ', ' huber ', ' quantile '},可选(默认=' ls ')
ls:leastsquares regression,最小二乘回归,
lad:leastabsolute deviation,最小绝对偏差,
huber是ls和Lad的结合。如果是噪音数据多,则推荐用抗噪音的损失函数"huber".
quantile:分位数回归,(使用alpha来指定分位数),若需要对训练集进行分段预测的时候,则采用“quantile”
alpha:该参数仅针对GradientBoostingRegressor,当使用Huber损失函数和quantile分位数损失函数时,需要指定分位数的值alpha-quantile,默认是0.9。
max_features: 划分时考虑的最大特征数, 默认为None
整型:max_features是指定的整型数字
浮点型:max_features= int(max_features *n_features)
auto:max_features=n_features
sqrt: max_features=sqrt(n_features)
log2: max_features=log2(n_features)
None:max_features=n_features
max_depth: 单个决策树最大深度,默认值是3。最大深度限制了树中的节点数,如果样本特征数较多且无共线性,可尝试增加深度。
min_samples_split:分割一个内部节点所需最小样本数: 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。默认是2。如果样本量数量级非常大,则可以增大这个值。
如果是int,则min_samples_split作为最小值。
如果是float,则ceil(min_samples_split* n_samples)为每个分割的最小样本数。(在0.18版本中更改:增加了浮点值)
min_samples_leaf:叶子节点最少样本数: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本数量级非常大,则可以增大这个值。
min_weight_fraction_leaf:叶子节点最小的样本权重,这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。默认是0,即不考虑权重问题。有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重。
max_leaf_nodes:最大叶子节点数, 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。
min_impurity_decrease:浮点型,默认为0.0,如果节点的分裂导致不纯度的减少(分裂后样本比分裂前更加纯净)大于或等于min_impurity_decrease,则分裂该节点。
https://scikit-learn.org/
https://numpy.org/
https://www.cnblogs.com/pinard/p/6143927.html
https://www.cnblogs.com/pinard/p/6136914.html
欢迎关注【潇杂想】