基于树模型的集成算法---GBDT

2020-06-28  本文已影响0人  自由调优师_大废废

一、模型介绍

GBDT 的全称是 Gradient Boosting Decision Tree,梯度提升决策树。 GBDT 也是集成学习 Boosting 家族的成员,但是却和传统的 Adaboost 有很大的不同。
回顾下 Adaboost,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT 也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用 CART 回归树模型,无论是处理回归问题还是二分类以及多分类,GBDT 使用的决策树通通都是 CART 回归树。因为 GBDT 每次迭代要拟合的是梯度值,是连续值所以要用回归树。同时迭代思路和 Adaboost 也有很大不同。 在 RF、Adaboost 等加法模型中,都是通过直接拟合真实值来构建模型的,而在 GBDT 里面:非首轮迭代的模型拟合的目标值不再是真实值,而是一个梯度值,主要是通过拟合损失函数的负梯度值在当前模型的值来构建模型。

二、模型原理

Gradient Bossting:梯度提升树

梯度提升树(Grandient Boosting)是提升树(Boosting Tree)的一种改进算法。
首先我们来看一下提升树的思想:假如有个人 30 岁,我们首先用 20 岁去拟合,发现损失有 10 岁,这时我们用 6 岁去拟合剩下的损失,发现差距还有 4 岁,第三轮我们用 3 岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。最后将每次拟合的岁数加起来便是模型输出的结果。

在提升树算法中,假设我们上一轮迭代得到的强学习器是 f_{t-1}(x),损失函数是 L(y, f_{t-1}(x)),我们本轮迭代的目标是找到一个弱学习器 h_t(x),当我们采用平方损失函数时 L(y, f_{t-1}(x) + h_t(x)) = (y - f_{t-1}(x) - h_{t}(x))^2 = (r - h_{t}(x))^2
这里的 r = y - f_{t-1}(x) 是当前模型拟合数据的残差(residual)。所以,对于提升树来说只需要简单地拟合当前模型的残差。
当损失函数是平方损失和指数损失函数时,梯度提升树每一步优化是很简单的,但是对于一般损失函数而言,往往每一步优化起来不那么容易,针对这一问题,Freidman 提出了梯度提升树算法,这是利用最速下降的近似方法,其关键是利用损失函数的负梯度作为提升树算法中的残差的近似值。

原理:

上面介绍完了 Gradient Bossting 的原理,那么对于 GBDT 的算法原理如下:

三、模型细节

1. 对于分类算法来说, GBDT 如何实现?

GBDT 的分类算法从思想上和 GBDT 的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致无法直接从输出类别去拟合类别输出的误差。为了解决这个问题,主要有两个方法,一个是用指数损失函数,此时 GBDT退化为 Adaboost 算法。另一种方法是用类似于逻辑回归的对数似然损失函数的方法。也就是说,用的是类别的预测概率值和真实概率值的差来拟合损失。接下来讨论用对数似然损失函数的 GBDT。而对于对数似然损失函数,又有二元分类和多元分类的区别。

2. GBDT 常用的损失函数

对于Huber损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。

3. 对于 GBDT 的正则化

四、模型优缺点

优点:

缺点:

五、模型使用

from sklearn.ensemble import GradientBoostingClassifier, GradientBoostingRegressor
gbclf = GradientBoostingClassifier(loss='deviance', learning_rate=0.1, n_estimators=100,
                 subsample=1.0, criterion='friedman_mse', min_samples_split=2,
                 min_samples_leaf=1, min_weight_fraction_leaf=0.,
                 max_depth=3, min_impurity_decrease=0.,
                 min_impurity_split=None, init=None,
                 random_state=None, max_features=None, verbose=0,
                 max_leaf_nodes=None, warm_start=False,
                 presort='deprecated', validation_fraction=0.1,
                 n_iter_no_change=None, tol=1e-4, ccp_alpha=0.0)
gbclf.fit(x,y)
gbclf.predict(test_x)


gbreg = GradientBoostingRegressor(loss='ls', learning_rate=0.1, n_estimators=100,
                 subsample=1.0, criterion='friedman_mse', min_samples_split=2,
                 min_samples_leaf=1, min_weight_fraction_leaf=0.,
                 max_depth=3, min_impurity_decrease=0.,
                 min_impurity_split=None, init=None, random_state=None,
                 max_features=None, alpha=0.9, verbose=0, max_leaf_nodes=None,
                 warm_start=False, presort='deprecated',
                 validation_fraction=0.1,
                 n_iter_no_change=None, tol=1e-4, ccp_alpha=0.0)
gbreg.fit(x,y)
gbreg.predict(test_x)
上一篇 下一篇

猜你喜欢

热点阅读