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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/juwikuang/article/details/100622473

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分类》

文章创建于: 2019-09-08 10:57:35
展开阅读全文

没有更多推荐了,返回首页