一、原理篇

1.1 温故知新回归树是GBDT的基础,之前的一篇文章曾经讲过回归树的原理和实现。链接如下:

1.2 预测年龄仍然以预测同事年龄来举例,从《回归树》那篇文章中我们可以知道,如果需要通过一个常量来预测同事的年龄,平均值是最佳选择之一。

1.3 年龄的残差我们不妨假设同事的年龄分别为5岁、6岁、7岁,那么同事的平均年龄就是6岁。所以我们用6岁这个常量来预测同事的年龄,即[6, 6, 6]。每个同事年龄的残差 = 年龄 - 预测值 = [5, 6, 7] - [6, 6, 6],所以残差为[-1, 0, 1]

1.4 预测年龄的残差为了让模型更加准确,其中一个思路是让残差变小。如何减少残差呢?我们不妨对残差建立一颗回归树,然后预测出准确的残差。假设这棵树预测的残差是[-0.9,

0, 0.9],将上一轮的预测值和这一轮的预测值求和,每个同事的年龄 = [6, 6, 6] + [-0.9, 0, 0.9] = [5.1,

6, 6.9],显然与真实值[5, 6, 7]更加接近了, 年龄的残差此时变为[-0.1, 0, 0.1],预测的准确性得到了提升。

1.5 GBDT重新整理一下思路,假设我们的预测一共迭代3轮 年龄:[5, 6, 7]

第1轮预测:6, 6, 6

第1轮残差:[-1, 0, 1]

第2轮预测:6, 6, 6 + -0.9, 0, 0.9 = [5.1, 6, 6.9]

第2轮残差:[-0.1, 0, 0.1]

第3轮预测:6, 6, 6 + -0.9, 0, 0.9 + -0.08, 0, 0.07 = [5.02, 6, 6.97]

第3轮残差:[-0.08, 0, 0.03]

看上去残差越来越小,而这种预测方式就是GBDT算法。

1.6 公式推导看到这里,相信您对GBDT已经有了直观的认识。这么做有什么科学依据么,为什么残差可以越来越小呢?前方小段数学公式低能预警。

因此,我们需要通过用第m-1轮残差的均值来得到函数fm,进而优化函数Fm。而回归树的原理就是通过最佳划分区域的均值来进行预测。所以fm可以选用回归树作为基础模型,将初始值,m-1颗回归树的预测值相加便可以预测y。

二、实现篇

Python实现了GBDT回归算法,没有依赖任何第三方库,便于学习和使用。

2.1 导入回归树类回归树是我之前已经写好的一个类,在之前的文章详细介绍过,代码请参考:

https://github.com/tushushu/imylu/blob/master/imylu/tree/regression_tree.py

from ..tree.regression_tree import RegressionTree

2.2 创建GradientBoostingBase类初始化,存储回归树、学习率、初始预测值和变换函数。(注:回归不需要做变换,因此函数的返回值等于参数)

class GradientBoostingBase(object):    def __init__(self):        self.trees = None        self.lr = None        self.init_val = None        self.fn = lambda x: x

2.3 计算初始预测值初始预测值即y的平均值。

def _get_init_val(self, y):    return sum(y) / len(y)

2.4 计算残差

def _get_residuals(self, y, y_hat):    return [yi - self.fn(y_hat_i) for yi, y_hat_i in zip(y, y_hat)]

2.5 训练模型

训练模型的时候需要注意以下几点:

1. 控制树的最大深度max_depth; 2. 控制分裂时最少的样本量min_samples_split; 3.

训练每一棵回归树的时候要乘以一个学习率lr,防止模型过拟合; 4. 对样本进行抽样的时候要采用有放回的抽样方式。

def fit(self, X, y, n_estimators, lr, max_depth, min_samples_split, subsample=None):    self.init_val = self._get_init_val(y)    n = len(y)    y_hat = [self.init_val] * n    residuals = self._get_residuals(y, y_hat)    self.trees = []    self.lr = lr    for _ in range(n_estimators):        idx = range(n)        if subsample is not None:            k = int(subsample * n)            idx = choices(population=idx, k=k)        X_sub = [X[i] for i in idx]        residuals_sub = [residuals[i] for i in idx]        y_hat_sub = [y_hat[i] for i in idx]        tree = RegressionTree()        tree.fit(X_sub, residuals_sub, max_depth, min_samples_split)        self._update_score(tree, X_sub, y_hat_sub, residuals_sub)        y_hat = [y_hat_i + lr * res_hat_i for y_hat_i,                    res_hat_i in zip(y_hat, tree.predict(X))]        residuals = self._get_residuals(y, y_hat)        self.trees.append(tree)

2.6 预测一个样本

def _predict(self, Xi):    return self.fn(self.init_val + sum(self.lr * tree._predict(Xi) for tree in self.trees))

2.7 预测多个样本

def predict(self, X):    return [self._predict(Xi) for Xi in X]

三、效果评估

3.1 main函数

使用著名的波士顿房价数据集,按照7:3的比例拆分为训练集和测试集,训练模型,并统计准确度。

@run_timedef main():    print("Tesing the accuracy of GBDT regressor...")    X, y = load_boston_house_prices()    X_train, X_test, y_train, y_test = train_test_split(        X, y, random_state=10)    reg = GradientBoostingRegressor()    reg.fit(X=X_train, y=y_train, n_estimators=4,            lr=0.5, max_depth=2, min_samples_split=2)    get_r2(reg, X_test, y_test)

3.2 效果展示最终拟合优度0.851,运行时间5.0秒,效果还算不错~

3.3 工具函数本人自定义了一些工具函数,可以在github上查看

https://github.com/tushushu/imylu/blob/master/imylu/utils.py

run_time - 测试函数运行时间

load_boston_house_prices - 加载波士顿房价数据

train_test_split - 拆分训练集、测试集

get_r2 - 计算拟合优度

四、总结

GBDT回归的原理:平均值加回归树

GBDT回归的实现:加加减减for循环

WeChat:https://mp.weixin.qq.com/s/t7kxG9_6ZBIKpuKFZBU0Jg

gbdt python_GBDT回归的原理及Python实现相关推荐

  1. python gdbt+fm_GBDT回归的原理及Python实现

    提到GBDT回归相信大家应该都不会觉得陌生(不陌生你点进来干嘛[捂脸]),本文就GBDT回归的基本原理进行讲解,并手把手.肩并肩地带您实现这一算法. 完整实现代码请参考本人的p...哦不是...git ...

  2. Logistic Regression 逻辑回归数学原理、python代码实现、实际应用

    说在前面 第一次写博客,主要目的是再梳理一下学到东西的逻辑,如果可以帮助到其他在学习的人就更好啦.本篇主要参考的:<机器学习>西瓜书.博主文章:文章链接.以及知乎.百度等大神们的解惑文章 ...

  3. 逻辑回归logistic原理(python代码实现)

    Logistic Regression Classifier逻辑回归主要思想就是用最大似然概率方法构建出方程,为最大化方程,利用牛顿梯度上升求解方程参数. 优点:计算代价不高,易于理解和实现. 缺点: ...

  4. CART回归树原理及python实现

    CART回归树入门学习 一.什么是CART回归算法 二.分类树与回归树区别 三.CART回归树与一般回归算法区别 四.CART回归树创建 4.1 CART回归树的划分 4.2 CART回归树的构建 4 ...

  5. GBDT(回归树)原理详解与python代码实现

    GBDT算法 1.算法原理 2.对数据的要求 3.算法的优缺点 4.算法需要注意的点 5.python代码实现(待更......) 导入相关包 读取数据并预处理 训练及评估 1.算法原理 步骤: 1. ...

  6. python实现逻辑回归的流程_逻辑回归原理及其python实现

    September 28, 2018 7 min to read 逻辑回归原理及其python实现 原理 逻辑回归模型: $h_{\theta}(x)=\frac{1}{1+e^{-{\theta}^ ...

  7. 随机森林分类算法python代码_随机森林的原理及Python代码实现

    原标题:随机森林的原理及Python代码实现 最近在做kaggle的时候,发现随机森林这个算法在分类问题上效果十分的好,大多数情况下效果远要比svm,log回归,knn等算法效果好.因此想琢磨琢磨这个 ...

  8. 决策树之 GBDT 算法 - 回归部分

    GBDT(Gradient Boosting Decision Tree)是被工业界广泛使用的机器学习算法之一,它既可以解决回归问题,又可以应用在分类场景中,该算法由斯坦福统计学教授 Jerome H ...

  9. 监督学习 | CART 分类回归树原理

    文章目录 CART 算法 1. CART 生成 1.1 回归树生成 最小二乘回归树生成算法 1.2 分类树生成 基尼指数 CART 生成算法 参考文献 相关文章: 机器学习 | 目录 监督学习 | I ...

  10. 监督学习 | ID3 决策树原理及Python实现

    文章目录 1. 信息熵 Information Entropy 1.1 信息熵公式推导 2. 信息增益 Information Gain 2.1 信息增益最大化 2.1.1 利用离散特征进行分类 2. ...

最新文章

  1. [蓝桥] 算法提高 扶老奶奶过街
  2. Assign the task HDU - 3974(线段树+dfs建树+单点查询+区间修改)
  3. 数据结构:二叉查找树(C语言实现)
  4. Java虚拟内存区域介绍
  5. [转]C#正则表达式小结
  6. /usr/include/X11/Shell.h:51:26: 致命错误:X11/SM/SMlib.h:没有那个文件或目录
  7. java+switch语句+枚举,Java枚举类型在switch语句中的正确用法
  8. 第三章 3.1 DI配置及使用 --《跟我学Spring》笔记 张开涛
  9. 如何获取AS程序的SHA1值用于百度SDK的下载并且避免keytool的错误
  10. 仿excel的网页版excel
  11. OKHttp原理讲解之责任链模式及扩展
  12. 一个通过网络转换Ico到Png图片的小小程序(Ico2Png)
  13. buildroot rz sz 配置
  14. 处理器最新排行_最新 iOS 性能排行榜,你的设备落伍了吗?
  15. Opencv-Python-导向滤波快速导向滤波
  16. 山西天诚在线教育机构怎么样?靠谱么?
  17. 汇编实现字符串输入并倒序输出
  18. devcpp如何调试
  19. win10如何手动强制关联默认文件打开方式应用
  20. JAVA 单调区间 交集_2015百度之星 单调区间

热门文章

  1. ShadowGun 图形技术分析
  2. 信息安全管理体系ISO27001IT服务管理体系ISO20000(转)
  3. 机械工程师CAD2016
  4. IDEA生成SerialVersionUID
  5. 年底无心工作?给个摸鱼好去处。中国超级英雄【一方净土】,进来看看嘛
  6. iframe是什么?iframe用法详解
  7. 虚拟机运行闪讯 实现linux联网 (多图)
  8. HTTP权威指南 - robots.txt文件
  9. 数字中国城市巡礼之乌兰察布:红山口上的“草原硅谷”
  10. 如何写工作说明书(sow)