梯度提升树算法

        定义:梯度提升树GBDT是集成学习Boosting家族成员之一,也称为GBT、GTB、GBRT、MART。(是一种从弱分类器中创建一个强分类器的集成技术。它先由训练数据构建一个模型,然后创建第二个模型来尝试纠正第一个模型的错误,不断地添加模型,直到训练集完美预测或已经添加到数量上限)

        GBDT是采用前向分布算法进行迭代,但弱学习器只能使用CART回归树模型。GBDT在迭代过程中,假设前一轮迭代得到的强学习器是f_{t-1}\left ( x \right ),损失函数Loss\left ( y,f_{t-1}\left ( x \right ) \right ),本轮迭代的目标是找到一个CART回归树弱学习器h_{t}\left ( x \right ),即本轮的损失为Loss\left ( y,f_{t}\left ( x \right ) \right )=Loss\left ( y,f_{t-1}\left ( x \right ) +h_{t}\left ( x \right )\right ) 最小。  

  • 回归算法

        训练样本集:T=\left \{ \left (x1, y1 \right ), \left (x2, y2 \right ),......,\left(xn, yn \right ) \right \},最大迭代次数为T,损失为Loss。

        初始化弱学习器:f_{0}\left ( x \right )=\underbrace{argmin}\sum_{i=1}^{n}Loss\left ( y_{i},c \right )

  • 迭代T轮:

        对于样本i=1,2,......,n有负梯度r_{ti}=\left [ \frac{\partial Loss\left ( y_{i},f\left ( x_{i} \right ) \right )}{\partial f\left ( x_{i} \right )} \right ],用\left ( x_{i},r_{ti} \right )i=1,2,......,n拟合一颗CART回归树,得到第t颗回归树的叶子节点区域为R_{tj},j=1,2,......,J的最佳拟合值:c_{tj}=\underbrace{argmin}\sum_{x_{i}\in R_{tj}}^{}Loss\left ( y_{i},f_{t-1}\left ( x_{i} \right )+ c \right )

        更新强学习器:f_{t}\left ( x \right )=f_{t-1}\left ( x \right )+\sum_{j=1}^{J}c_{tj}I\left ( x\in R_{tj} \right )

        得到强学习器:f\left ( x \right )=f_{T}\left ( x \right )=\sum_{t=1}^{T}\sum_{j=1}^{J}c_{tj}I\left ( x\in R_{tj} \right )

  • 分类算法

GBDT分类算法在思想上与回归算法没有区别,只是样本输出不是连续的值,是离散的类别,从而无法直接从输出类别去拟合类别是输出的误差。针对于这种情况,可以采用两种形式进行处理:(1)逻辑回归的对数似然损失函数法(2)指数损失函数法。简而言之,就是用类别的预测概率值与真实概率值的差来拟合损失。以对数似然损失函数法为例:

二元分类

损失函数:Loss\left ( y,f\left ( x \right ) \right )=log\left (1+exp\left ( -yf\left ( x \right ) \right ) \right ),其中y\in \left ( -1,1 \right )

负梯度误差:r_{ti}=-\left [ \frac{\partial Loss\left ( y_{i},f\left ( x_{i} \right ) \right )}{\partial f\left ( x_{i} \right )} \right ]=\frac{y_{i}}{1+exp\left ( y_{i}f\left ( x_{i} \right ) \right )}, 各个叶子节点的最佳负梯度拟合值:c_{tj}=\underbrace{argmin}\sum_{x_{i}\in R_{tj}}^{}log\left ( 1+exp\left ( -y_{i}\left ( f_{t-1} \left ( x_{i} \right ) +c\right )\right ) \right )

由于上式难以优化,即选取近似值代c_{tj}=\frac{\sum_{x_{i}\in R_{tj}}^{}r_{ti}}{\sum_{x_{i}\in R_{tj}\left | r_{ti} \right |\left ( 1-\left ( \left | r_{ti} \right | \right ) \right )}^{}}

与回归算法的区别:负梯度的计算和叶子节点最佳负梯度拟合的线性搜索。

多元分类

假设类别为K,损失函数:Loss\left ( y,f\left ( x \right ) \right )=-\sum_{k=1}^{K}y_{k}logp_{k}\left ( x \right )

如果样本输出类别为k,则y_{k}=1。第k类的概率为:p_{k}\left ( x \right )=\frac{exp\left ( f_{k} \left ( x \right )\right )}{\sum_{l=1}^{K}exp\left ( f_{l}\left ( x \right ) \right )}

计算第t轮的第i个样本对应类别l的负梯度误差(样本i对应类别l的真实概率和t-1轮预测概率的差值):r_{til}=\left [ \frac{\partial Loss\left ( y_{i},f\left ( x_{i} \right ) \right )}{\partial f\left ( x_{i} \right )} \right ]_{f_{k}\left ( x \right )=f_{l,t-1}\left ( x \right )}=y_{il}-p_{l,t-1}\left ( x_{i} \right )

各个叶子节点的最佳负梯度拟合值:

c_{tjl}=\sum_{i=0}^{n}\sum_{k=1}^{K}Loss\left ( y_{k},f_{t-1,l}\left ( x \right )+\sum_{j=0}^{J}c_{jl}I\left ( x_{i} \in R_{tjl}\right )\right )

由于上式难以优化,即选取近似值代替:c_{tj}=\frac{K-1}{K}\frac{\sum_{x_{i}\in R_{tjl}}^{}r_{til}}{\sum_{x_{i}\in R_{tjl}\left | r_{til} \right |\left ( 1-\left ( \left | r_{til} \right | \right ) \right )}^{}}

与回归算法的区别:负梯度的计算和叶子节点最佳负梯度拟合的线性搜索。

常匹配的损失函数

        分类算法:对数似然损失函数(如上)、指数损失函数Loss\left ( y,f\left ( x \right ) \right )=exp\left ( -yf\left ( x \right ) \right )

        回归算法:均方差损失函数Loss\left ( y,f\left ( x \right ) \right )=\left ( y-f\left ( x \right ) \right )^{2}、绝对误差损失函数Loss\left ( y,f\left ( x \right ) \right )=\left | y-f\left ( x \right ) \right |,它们对应的负梯度误差为:sign\left ( y-f\left ( x \right ) \right )

Huber损失函数Loss\left ( y,f\left ( x \right ) \right )=\left\{\begin{matrix} \frac{1}{2}\left ( y-f\left ( x \right ) \right )^{2},\left | \left ( y-f\left ( x \right ) \right ) \right |\leq\delta \\ \delta \left ( \left | \left ( y-f\left ( x \right ) \right ) \right |-\frac{\delta }{2} \right ),\left | \left ( y-f\left ( x \right ) \right ) \right |> \delta \end{matrix}\right.,对应的负梯度误差为r\left ( y,f\left ( x \right ) \right )=\left\{\begin{matrix} y-f\left ( x \right ),\left | y-f\left ( x \right )\right |\leq\delta \\ \delta sign \left ( y-f\left ( x \right ) \right ) ,\left | y-f\left ( x \right ) \right |> \delta \end{matrix}\right.

 分位数损失函数Loss\left ( y,f\left ( x \right ) \right )=\sum_{y\geq f\left ( x \right )}^{}\theta \left | y-f\left ( x \right ) \right |+\sum_{y\geq f\left ( x \right )}^{}\left ( 1-\theta \right ) \left | y-f\left ( x \right ) \right | ,对应得负梯度误差为r\left ( y,f\left ( x \right ) \right )=\left\{\begin{matrix} \theta ,y\geq f\left ( x \right ) \\ \theta -1,y< f\left ( x \right ) \end{matrix}\right..

  1. 正则化方法

        学习率\varepsilon \in \left ( 0,1 \right )f_{k}\left ( x \right )=f_{k-1}\left ( x \right )+\varepsilon h_{k}\left ( x \right ),对于同样的训练集学习效果,较小的\varepsilon对应着需要更多的弱学习器得迭代次数。通常用学习率和迭代最大次数一起决定算法的拟合效果。

        子采样比例,取值范围为\left ( 0,1 \right )。这里的子采样和随机森林不一样,随机森林是有放回抽样,这里是不放回抽样。取值为1时,全部样本参与,此时没有使用子采样。取值小于1时,只有一部分样本去做GBDT决策树拟合。小于1的子采样比例可以减少方差,防止过拟合,但会增加样本拟合的偏差,所以此值也不宜太低,一般在\left [ 0.5,0.8 \right ]之间。

        对CART回归树进行正则化剪枝。

回归样例:

        说明:GBRT是利用损失函数的负梯度方向在当前模型的值作为残差的近似值,进而拟合一颗CART回归树,GBRT会累加所有树的结果。

import numpy as np
import pandas as pd
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import GradientBoostingRegressor


data = pd.read_csv(filename)
data_x = data[[columns[0], columns[1], columns[3], columns[4], columns[5]]]
data_y = data[[columns[2]]]
trainx, testx, trainy, testy = train_test_split(data_x, data_y, test_size=1-split, random_state=0)
print(trainx.shape, testx.shape, trainy.shape, testy.shape)

def performance(yture, ypred):
    score = metrics.r2_score(yture, ypred)
return score

def model_fit(x, y):
    cross_validator = KFold(n_splits=3, shuffle=True, random_state=500)
    regression = GradientBoostingRegressor(loss='ls', max_features=None, learning_rate=0.2)
    para = {'max_depth': range(1, 30)}
    score_fnc = metrics.make_scorer(performance)
    grid = GridSearchCV(regression, para, cv=cross_validator, scoring=score_fnc)
    grid = grid.fit(x, y)
return grid.best_estimator_

trainy = np.array(trainy).astype('int').ravel()
model = model_fit(trainx, trainy)
print(model)
testy = np.array(testy)[:, 0]

def model_est(model):
    ypre = model.predict(testx)
    r2 = performance(testy, ypre)
    MSE = metrics.mean_squared_error(testy, ypre)
    RMSE = metrics.mean_squared_error(testy, ypre) ** 0.5
    MAE = metrics.mean_absolute_error(testy, ypre)
    print('r2', r2)
    print('MSE', MSE)
    print('RMSE', RMSE)
    print('MAE', MAE)

    plt.figure(figsize=(10, 8), dpi=100)
    plt.plot(testy, label='true')
    plt.plot(ypre, label='predict')
    plt.legend()
    plt.title('GBRT predict result compare')
    plt.show()

model_est(model)

GBRT模型研究方向

  1. 在预测时,每个CART是独立的,因此可以并行计算。此外得益于决策树的高效率,GBRT在预测时的计算速度时很快的;
  2. 在训练时,GBRT里的CART之间存在依赖,无法并行,所以GBRT的训练速度较慢;只能在决策树内部采用一些局部并行的手段提高训练速度
  3. 可以修改损失函数,可以时残差ls,也可以修改为Mse、Huber等损失函数,让GBRT在鲁棒性等方面得到提升;
  4. GBRT学习能力很强,但容易过拟合。可以给目标函数添加对模型复杂度的惩罚项,控制模型复杂度。
  • 43
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值