python机器学习手写算法系列——梯度提升GBDT回归

  • 时间:1个月前
  • 浏览:588次
  • 网赌被黑找腾龙D哥出黑【微信:JLYL78999 QQ:840093333】

    Prerequisite 必备的知识

    要理解GBDT,首先要理解DT和线性回归。可以参考一下文章:

    《python机器学习手写算法系列——线性回归》

    《python机器学习手写算法系列——决策树》

    概述

    GBDT全称Gradent Boosting Decision Tree, 也叫Gradient Boosting Tree。

    GBDT是一种ensemble方法。所以如果你使用sklearn,可以在sklearn.ensemble下面找到它。我们知道一般ensemble方法的表现会比较好一点。

    最简单的ensemble回归方法,就是训练几个独立(individual)模型,然后求平均。当然,GBDT没这么简单,但是也并不难。

    算法

    GBDT大致的思路是,先计算平均值和残差。然后训练新的模型,但是新的模型的目标(y),换成了残差。预测的时候,预测值是平均值加上预测的残差。再在这个基础上,继续用残差训练新的模型。最后,把所有的模型的残差加起来,以消灭残差,达到残差最小。

    这样,新的模型实际上就是,在老模型的基础上,对老模型不足之处的补充。

    步骤如下:

    第1步:求平均值,这个平均值就是我们的第一个模型。

    第2步:for i = 1 to n
    2.1计算残差
    2.2根据残差训练一个独立的决策树
    2.3预测
    y=+i=1n(α)y=平均值+ \sum_{i=1}^{n} (\alpha * 独立模型预测的残差)

    代码

    from sklearn.tree import DecisionTreeRegressor
    from sklearn.datasets import load_boston
    import numpy as np
    import matplotlib.pyplot as plt
    
    boston=load_boston()
    n_samples = len(boston.target)
    X = boston.data
    y = boston.target
    ## Step 1 Average
    average_y=np.average(y)
    print(f'the average y is : {average_y}')
    
    ## Step 2 For Loop
    #now let's get started
    learning_rate=0.1
    loss = [0] * 101
    residuals = np.zeros([101,n_samples])
    predictoin = np.zeros([101,n_samples])
    #calculation
    predictoin[0] = [average_y] * n_samples
    residuals[0] = y - predictoin[0]
    loss[0] = np.sum(residuals[0] ** 2)
    trees = []
    
    for i in range(100):
        tree = DecisionTreeRegressor(max_depth=3)
        tree.fit(X,residuals[i])
        trees.append(tree)
        #next prediction, residual
        predictoin[i+1]=predictoin[i]+learning_rate * tree.predict(X)
        residuals[i+1]=y-predictoin[i+1]
        loss[i+1] = np.sum(residuals[i+1] ** 2)
    

    完整代码见Github:

    https://github.com/juwikuang/machine_learning_step_by_step/blob/master/GradiantBoostingRegression.ipynb

    有趣的问题

    可以把GBDT里面的决策树换成线性回归么?

    答案是不可以,这是由线性回归的特性决定的。假如换成了线性回归,那么最后的公式会变成

    平均值+
    (w1x+b1)+
    (w2
    x+b2)+
    (w3*x+b3)=
    (w1+w2+w3)*x+b1+b2+b3+平均值

    由公式可知,梯度提升的线性回归算法,最后得到的,还是一个线性回归公式。

    欢迎阅读本系列其他文章:

    《python机器学习手写算法系列——线性回归》

    《python机器学习手写算法系列——逻辑回归》

    《python机器学习手写算法系列——决策树》

    《python机器学习手写算法系列——kmeans聚类》

    《python机器学习手写算法系列——梯度提升GBDT回归》

    《python机器学习手写算法系列——梯度提升GBDT分类》

    网赌被黑找腾龙D哥出黑【微信:JLYL78999 QQ:840093333】

    留言反馈

    网赌被黑找腾龙D哥出黑【微信:JLYL78999 QQ:978107219】鲁ICP备13008445号-3||Theme by Cn+网络, Soft by ZBlogPHP
  • 网赌被黑