一、GBDT算法流程:

二、预测身高

已知四组包含年龄、体重、身高的数据,根据年龄、体重预测身高。

测试数据如下:

1、训练阶段:

参数设置:学习率:learning_rate=0.1,迭代次数:n_tree=5,树的深度:max_depth=2(max_depth=3的计算方式一样)。

(1)初始学习器

由于损失函数为平方损失,所以取训练样本标签值的均值=(1.1+1.3+1.7+1.8)/ 4=1.475。

即有

学习器可以理解为当前模型的预测结果。此处之所以取均值是公式推导得到的。即初始学习器将f_0将所有样本都预测为1.475,误差很大,需要调整。

(2)对迭代轮数m=1,2,...M 。

1)计算负梯度,也就是残差,由于损失函数为平方损失,所以负梯度即残差=标签值-预测值,表格中为label-f_m(x)res_m-0.1*γ的值

2)将上述获得的残差作为标签值训练下一颗树。

3)获取每个叶子节点的预测值γ,去拟合残差,本例中的γ计算方式为:叶子包含样本标签值的均值。

3)更新学习器,对每个样本更新学习器。

实际应用场景中:

在残差作为目标值训练树之前,需要寻找回归树的最佳划分点。

方法:遍历每个特征的每个可能取值。从年龄特征的5开始,到体重特征的70结束,分别计算分裂后两组数据的平方损失,左节点平方损失为 ,右节点平方损失为。找到使平方损失和最小的那个划分节点,即为最佳划分节点。

例如​以age=7为例:SEsum=0+0.140=0.140 遍历特征和体重后所有的划分情况如下表格:

随便选取年龄21或体重60来作为划分点。划分点找到后,进入正题:

步骤一和二:计算残差(res_1 = label – f_0)作为标签值训练第一棵树。

步骤三:计算每个叶子节点的预测值γ(叶子包含样本标签值的均值(-0.375-0.175)/2 = -0.275)。

步骤四:更新学习器(f_1 = f_0+0.1*γ)并计算构建残差(res2 = res1-0.1*γ)作为标签值训练第二棵树。

 循环步骤1~4

第三棵树:

 第四棵树:

第五棵树:

得到最终的学习器

2、测试阶段

由上面最后一个表格,根据测试数据age=25,weight=65,找到id为2对应的f_5值,为1.5876。

具体地,在f_0中,预测为1.475.

在f_1中,age>21, 叶子节点预测为0.275.

在f_2中,age>21, 叶子节点预测为0.2475.

在f_3中,age>21, 叶子节点预测为0.2227.

在f_4中,age>21, 叶子节点预测为0.2005.

在f_5中,age>21, 叶子节点预测为0.1805.

有公式: 预测值 = 1.475 + 0.1 * (0.275+0.2475+0.2227+0.2005+0.1805) = 1.5876.

3、代码实现并可视化

(1)用DecisionTreeRegressor一步一步实现。

import graphviz
import numpy as np
import pandas as pd
from sklearn import tree
from pydotplus import graph_from_dot_data
from sklearn.tree import DecisionTreeRegressor, export_graphviz
from sklearn.ensemble import GradientBoostingRegressordata_1 = [[5, 40, 1.1],[7, 60, 1.3],[21, 140, 1.7],[30, 120, 1.8]]
data = pd.DataFrame(data_1, columns=['age', 'weight', '标签'])X = np.array(data.iloc[:, :-1]).reshape((-1, 2))
y = np.array(data.iloc[:, -1]).reshape((-1, 1))tree_reg = DecisionTreeRegressor(max_depth=1, random_state=14)
tree_reg.fit(X, y)
# 残差y1作为标签值训练第1棵树
y1 = y - np.array([1.475] * 4).reshape((-1, 1))
tree_reg1 = DecisionTreeRegressor(max_depth=1, random_state=14)
tree_reg1.fit(X, y1)
# 残差y2作为标签值训练第2棵树
y2 = y1 - 0.1 * np.array(tree_reg1.predict(X)).reshape((-1, 1))
tree_reg2 = DecisionTreeRegressor(max_depth=1, random_state=14)
tree_reg2.fit(X, y2)
# 残差y3作为标签值训练第3棵树
y3 = y2 - 0.1 * np.array(tree_reg2.predict(X)).reshape((-1,1))
tree_reg3 = DecisionTreeRegressor(max_depth=1, random_state=14)
tree_reg3.fit(X, y3)
# 残差y4作为标签值训练第4棵树
y4 = y3 - 0.1 * np.array(tree_reg3.predict(X)).reshape((-1,1))
tree_reg4 = DecisionTreeRegressor(max_depth=1, random_state=14)
tree_reg4.fit(X, y4)
# 残差y5作为标签值训练第5棵树
y5 = y4 - 0.1 * np.array(tree_reg4.predict(X)).reshape((-1,1))
tree_reg5 = DecisionTreeRegressor(max_depth=1, random_state=14)
tree_reg5.fit(X, y5)
list = [tree_reg1, tree_reg2, tree_reg3, tree_reg4, tree_reg5]
# DecisionTreeRegressor可视化
for i in range(0, 5):nodes = export_graphviz(list[i], feature_names=["age","weight"], precision=4)gra = graphviz.Source(nodes)gra.render(r"./plot/tree{0}".format(i+1))

(2)用sklearn包的GradientBoostingRegressorGBDT算法包。

estimator = GradientBoostingRegressor(max_depth=1, random_state=14)
estimator.fit(data.iloc[:, :-1], data.iloc[:, -1])
# 可视化
for i in range(5):# estimator.estimators_[i, 0],代表第i棵树dot_data = export_graphviz(estimator.estimators_[i, 0], feature_names=["age", "weight"], out_file=None, filled=True, rounded=True, special_characters=True, precision=4)graph = graph_from_dot_data(dot_data)graph.write_pdf('./plot/estimator{0}.pdf'.format(i))

GBDT实例:根据年龄体重预测身高相关推荐

  1. 你的年龄体重身高,最好别对这款 app 撒谎

    硅谷Live / 实地探访 / 热点探秘 / 深度探讨 话说有一天小探看到一款神奇的自拍 App,说是其背后的 AI 通过自拍就能分析出你的身高性别.年龄体重.BMI 等. 小探挑好了光线.角度拍了一 ...

  2. C++list容器实现按照年龄升序排列,年龄相同按照身高降序排列,年龄身高相同对体重升序排列

    感谢黑马先生! //对人的年龄进行升序排列,年龄相同对身高进行降序排列,年龄身高相同对体重升序排列 #include <iostream> #include <list> #i ...

  3. 定义一个Dog类,包括体重和年龄两个数据成员及其成员函数,声明一个实例dog1,体重5,年龄10,使用I/O流把dog1的状态写入磁盘文件。再声明一个实例dog2,读取文件dog1的状态给dog2。

    定义一个Dog类,包括体重和年龄两个数据成员及其成员函数,声明一个实例dog1,体重5,年龄10,使用I/O流把dog1的状态写入磁盘文件.再声明一个实例dog2,通过读取文件dog1的状态赋给dog ...

  4. lstm 变长序列_基于变长时间间隔LSTM方法的胎儿异常体重预测

    1 介绍 预测胎儿体重是产前监护的重要内容, 是医生对孕妇进行临床处理的重要依据. 近年来研究显示, 低体重儿的存活率和扛感染能力相对低下[, 并且与低智商有密切联系[. 而巨大儿则会引起胎儿宫内窘迫 ...

  5. 体重预测[线性回归]

    在人们的日常生活中,体重偏高与偏低均是身体出现亚健康的体现,也是身体部分器官发病的前兆.影响体重的因素较多(如体内激素水平.饮食情况.心情原因等),而且与身高具有直接的相关性.因而,如何在指定身高下评 ...

  6. Kaggle实例-家庭贫困水平预测

    Kaggle实例-家庭贫困水平预测 **1. 数据背景** **2. 数据目标** **3. 问题和数据说明** **3.1. 目标说明** **3.2. 评估度量** **4. 数据分析** **4 ...

  7. ARIMA模型实例讲解——网络流量预测可以使用啊

    ARIMA模型实例讲解:时间序列预测需要多少历史数据? from:https://www.leiphone.com/news/201704/6zgOPEjmlvMpfvaB.html   雷锋网按:本 ...

  8. //输入学生人数,挨个输入姓名,身高,年龄,求平均年龄,然后按身高降序排列输出...

    13:52:49 N U L L 2014/12/19 13:52:49 using System; using System.Collections; using System.Collection ...

  9. Java 学习 if循环 使用Scanner收集你的身高体重,并计算出你的BMI值是多少BMI的计算公式是 体重(kg) / (身高*身高)

    使用Scanner收集你的身高体重,并计算出你的BMI值是多少 BMI的计算公式是 体重(kg) / (身高*身高) 比如邱阳波的体重是72kg, 身高是1.69,那么这位同学的BMI就是 72 / ...

最新文章

  1. 终于!有本书把我从“看完就忘、死记硬背”的学习困境中拯救出来了!
  2. (转)线段树的区间更新
  3. android升级功能键,Android 按键添加转载
  4. 手把手教你写DI_0_DI是什么?
  5. 图像分类_01图像分类简介:挑战+近邻分类器+CIFAR-10数据集概述
  6. 从集合大小的定义到数学结构-解决了多年的疑惑
  7. CentOS中nginx负载均衡和反向代理的搭建
  8. Unity C# 设计模式(五)建造者模式
  9. Redis命令 - sortedSet
  10. 14万程序员挑战过的算法趣题
  11. RAW-socket
  12. setting文件详解
  13. PowerShadow Master(影子系统)
  14. 品质生活最前端 ACCESS品牌管理集团协同VTN会员商城打响品质购物节
  15. 收藏 90+深度学习开源数据集整理|包括目标检测、工业缺陷、图像分割等多个方向
  16. 2021年中国人口数量、人口结构现状、男女比例及人口增长情况分析[图]
  17. U盘文件变成快捷方式的解决方案
  18. 装完 Ubuntu 13.10 该干的事儿
  19. 备忘5:爬取微博热门信息以及所有热门微博评论的用户信息
  20. 拉格朗日插值公式---读题题

热门文章

  1. 退押金还得拉好友,ofo神操作惹众怒,网友:坑钱就算了,还要坑朋友?
  2. android字体变斜,TextView设置倾斜字体样式(android:textStyle=bold|italic)后,右边字显示不全...
  3. 失去的远东国土海兰泡:述说近代中国血泪史
  4. 怎么有效克服演讲的紧张感?
  5. LightGBM教程
  6. matlab画转体_MATLAB旋转体的绘制
  7. MySQL中删除数据的两种方法_MySQL删除数据库的两种方法
  8. MySQL删除数据库时无响应解决办法
  9. Android Handler Message 里面的message.what, message.arg1,message.obj,obtainMessage, message.setData的使用
  10. Google Earth KML中文说明