2020机器学习GBDT(1)

machine_learning.jpg

目标

介绍什么是梯度提升(Gradient Boost),如何运用梯度提升来作为回归和分类问题。以及其背后实现算法

基本要求

就是需要具有一定决策树的基础知识,随后接下来内容都是如何使用决策树来构建 GBDT 的模型,所以以必要了解决策树。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

准备数据

data = pd.read_csv("./data/data.csv")
data

这是今天的数据集,接下来内容都是基于这个数据集进行讲解,大家可以先简单了解一下这个数据集,身高、喜欢颜色和性别是数据特征,而体重是我们要预测的值。

我们随后将使用梯度提升(Gradient Boost)来进行预测体重值,也就是用梯度提升(Gradient Boost)来做回归(Regression)。要使用的梯度提升(Gradient Boost)与之前学习过的线性回归(Linear Rgression)虽然都是做回归问题,但是背后的方法却完全不同。

如果已经比较熟悉 AdaBoost,那么会有助于你学习梯度提升(Gradient Boost)。所以接下来我们会通过对比 AdaBoost ,来学习梯度提升(Gradient Boost)。

AdaBoost

  • 在 AdaBoost 中,会首先构建一个规模不算大(也就是深度不算深)的决策树
  • 每颗决策树的权重取决于他对之前估计误差值的补偿的程度
  • 所以在 AdaBoost 每新创建一颗决策树,都是基于上一颗决策树的估计值和真实值之间的误差的基础之上
  • 每一个决策树对误差补偿程度可以反映在其权重上,也就是补偿越好,他权重也就自然越大,所以在 AdaBoost 中每构建一颗决策树都是为了补偿上一颗决策树的误差
  • 当 AdaBoost 中决策树的数量达到限制条件或者拟合数据已经达到预期效果,就可以不再构建新的决策树来完成训练

梯度提升(Gradient Boost)

  • 相比于 AdaBoost ,梯度提升只是构建一个(叶)节点而不是一个决策树
  • 构建出叶节点会对所有样本初始化一个权重,通常这个初始化权重就是预测值均值 73.3(体重)
  • 接下来梯度提升就会开始构建决策树,与 AdaBoost 每次构建决策树都是基于上一颗决策树错误而构建新的规模不大决策树不同,梯度提升会构建一颗规模相对比较大决策树,但是并不是所没有限制(规模)。在今天例子,构建决策树的叶节点数量不会超过 4 个叶节点。但是在实际模型中,我们对叶节点数量限制可能在 8 到 32 之间。就每次构建出决策树规模上这一点梯度提升可能要比 AdaBoost 的规模大一些。在 AdaBoost 中,我们决策树的大小可能根据错误不同而不同,也就是说 AdaBoost 会根据上一次错误对新要构建决策树大小进行调整,而梯度提升中也是可以调整决策树的大小,不过不同这种大小调整会反映在每颗决策树上。
  • 在梯度提升停止条件也是和 AdaBoost 比较类似

说了一大堆理论,我们还是动手在数据上来一次梯度提升模型比较直观,看看梯度提升是如何训练和进行预测(体重)

  • 通过取均值作为预测值 71.2, 如果就此不再进行下去,那么我们对每个人体重预测值就是 71.2
  • 接下来我们基于这个预测值误差来构建决策树,如何定义误差,我们将预测值(71.2)与数据样本中每一个数据值进行对比来计算误差,
    (88 - 71.2) = 16.8
    这个实际值和预测值的差叫做伪残差(Pseudo Residual),这里伪残差就是我们梯度提升要做处理的部分。
# 读取数据
data = pd.read_csv("./data/data.csv",header=0)
# 显示数据列名称
data.columns
显示数据
Index(['height', 'favorite', 'gender', 'weight'], dtype='object')
# 通过列名称(weight)获取列值,然后对其进行求取均值
c_avg = np.mean(data['weight'])
c_avg = np.round(c_avg,1)
c_avg
71.2
# 计算残差,我们通过 weight 减去均值得到残差
resual = data['weight'] - c_avg
resual
0    16.8
1     4.8
2   -15.2
3     1.8
4     5.8
5   -14.2
Name: weight, dtype: float64
data['residual'] = resual
data
屏幕快照 2020-03-21 下午6.49.40.png

屏幕快照 2020-03-21 下午6.49.04.png
# plt.scatter(np.linspace(1,6,1),data['weight'])

plt.scatter(np.linspace(0,5,6),data['weight'],color='blue')
output_13_1.png
身高(m) 喜好颜色 性别 体重(预测) 残差
1.6 Blue Male 88 16.8
1.6 Green Female 76 4.8
1.5 Blue Female 56 -15.2
1.8 Red Male 73 1.8
1.5 Green Male 77 5.8
1.4 Blue Female 57 -14.2

构建决策树

通常我们都是预测目标值,而这一次我们通过拟合残差来达到推测预测值来达到训练的目的。我们将预测体重问题转移到预测残差上。

屏幕快照 2020-03-22 下午5.49.55.png
  • 性别=F
    • 身高 < 1.6
      • [-14.2,-15.2]
      • [4.8]
    • 是否喜好蓝色(Blue)
      • [1.8,5.8]
      • [16.8]
gender_female = data[data.gender =='Female']
gender_female
性别=F
gender_male = data[data.gender =='Male']
gender_male
性别=Male

这里暂时不去解释为什么我们要构建这样树来预测残差。大家可能还记得我们对数规模进行限制,也就是最多只能有 4 个叶节点。

short_gender_female = gender_female[gender_female.height < 1.6]
short_gender_female
性别=F 身高<1.6
high_gender_female = gender_female[gender_female.height >= 1.6]
high_gender_female
性别=F 身高>=1.6
屏幕快照 2020-03-22 下午5.51.46.png
  • 性别=F
    • 身高 < 1.6
      • [-14.7]
      • [4.8]
    • 是否喜好蓝色(Blue)
      • [3.8]
      • [16.8]

现在我们通过对比之前预测值和决策树预测值
71.2 + 16.8 = 88
模型现在已经完全拟合训练数据,但是现在 Bias比较低,而且还具有较高的 Variance。在梯度提升是用过添加学习率来解决这个问题的。学习率是一个介于 0 到 1 之间的数。这个例子如果设置学习率为 0.1 那么就得到

71.2 + (0.1 \times 16.8) = 72.9
因为添加了学习率,我们新的预测值不再能够完全拟合训练数据了。但是这一次预测结果要比上一次 71.2 也预测值更加接近观测值 88 了。通过学习率让我们模型一步一步以较小步幅迈向观测值。

Residual = (88 - (71.2 + 0.1 \times 16.8)) = 15.1

# 通过列名称(weight)获取列值,然后对其进行求取均值
c_avg = np.mean(data['weight'])
c_avg = np.round(c_avg,1)
resual = data['weight'] - (c_avg+ 0.1 * (data['weight'] - c_avg))
data['residual'] = resual
data
plt.scatter(np.linspace(0,5,6),data['weight'],color='blue',label='we')
plt.scatter(np.linspace(0,5,6),data['residual'],color='red',label='residual')
plt.axhline(y=c_avg,linestyle='dashed')
pred = data['weight'] - data['residual']
print(pred)
plt.scatter(np.linspace(0,5,6),pred,color='green',label='residual')
plt.grid()
plt.show()
0    72.88
1    71.68
2    69.68
3    71.38
4    71.78
5    69.78
dtype: float64
output_26_1.png

决策树结构

  • 性别=F
    • 身高 < 1.6
      • [-13.2]
      • [4.3]
    • 是否喜好蓝色(Blue)
      • [3.4]
      • [15.1]
        屏幕快照 2020-03-22 下午6.05.10.png

        71.2 + (0.1 \times 16.8) + (0.1 \times 15.1) = 74.4
身高(m) 喜好颜色 性别 体重(预测) 残差
1.6 Blue Male 88 13.6
1.6 Green Female 76 3.9
1.5 Blue Female 56 -12.4
1.8 Red Male 73 1.1
1.5 Green Male 77 5.1
1.4 Blue Female 57 -11.4

每一次进行向前迭代都会不断减少我们预测值。我们通过不断添加新的决策树对模型做加法来减少残差。

身高(m) 喜好颜色 性别 体重
1.6 Green Female ??
身高(m) 喜好颜色 性别 体重
1.6 Green Female 70
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348

推荐阅读更多精彩内容