2020機器學習GBDT(1)

machine_learning.jpg

目標

介紹什么是梯度提升(Gradient Boost),如何運用梯度提升來作為回歸和分類問題啊楚。以及其背后實現(xiàn)算法

基本要求

就是需要具有一定決策樹的基礎知識干签,隨后接下來內容都是如何使用決策樹來構建 GBDT 的模型笨使,所以以必要了解決策樹美澳。

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

準備數(shù)據(jù)

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

這是今天的數(shù)據(jù)集,接下來內容都是基于這個數(shù)據(jù)集進行講解眠饮,大家可以先簡單了解一下這個數(shù)據(jù)集奥帘,身高、喜歡顏色和性別是數(shù)據(jù)特征仪召,而體重是我們要預測的值寨蹋。

我們隨后將使用梯度提升(Gradient Boost)來進行預測體重值松蒜,也就是用梯度提升(Gradient Boost)來做回歸(Regression)。要使用的梯度提升(Gradient Boost)與之前學習過的線性回歸(Linear Rgression)雖然都是做回歸問題已旧,但是背后的方法卻完全不同秸苗。

如果已經(jīng)比較熟悉 AdaBoost,那么會有助于你學習梯度提升(Gradient Boost)运褪。所以接下來我們會通過對比 AdaBoost 惊楼,來學習梯度提升(Gradient Boost)。

AdaBoost

  • 在 AdaBoost 中秸讹,會首先構建一個規(guī)模不算大(也就是深度不算深)的決策樹
  • 每顆決策樹的權重取決于他對之前估計誤差值的補償?shù)某潭?/li>
  • 所以在 AdaBoost 每新創(chuàng)建一顆決策樹檀咙,都是基于上一顆決策樹的估計值和真實值之間的誤差的基礎之上
  • 每一個決策樹對誤差補償程度可以反映在其權重上,也就是補償越好璃诀,他權重也就自然越大弧可,所以在 AdaBoost 中每構建一顆決策樹都是為了補償上一顆決策樹的誤差
  • 當 AdaBoost 中決策樹的數(shù)量達到限制條件或者擬合數(shù)據(jù)已經(jīng)達到預期效果,就可以不再構建新的決策樹來完成訓練

梯度提升(Gradient Boost)

  • 相比于 AdaBoost 劣欢,梯度提升只是構建一個(葉)節(jié)點而不是一個決策樹
  • 構建出葉節(jié)點會對所有樣本初始化一個權重棕诵,通常這個初始化權重就是預測值均值 73.3(體重)
  • 接下來梯度提升就會開始構建決策樹,與 AdaBoost 每次構建決策樹都是基于上一顆決策樹錯誤而構建新的規(guī)模不大決策樹不同凿将,梯度提升會構建一顆規(guī)模相對比較大決策樹校套,但是并不是所沒有限制(規(guī)模)。在今天例子丸相,構建決策樹的葉節(jié)點數(shù)量不會超過 4 個葉節(jié)點搔确。但是在實際模型中彼棍,我們對葉節(jié)點數(shù)量限制可能在 8 到 32 之間灭忠。就每次構建出決策樹規(guī)模上這一點梯度提升可能要比 AdaBoost 的規(guī)模大一些。在 AdaBoost 中座硕,我們決策樹的大小可能根據(jù)錯誤不同而不同弛作,也就是說 AdaBoost 會根據(jù)上一次錯誤對新要構建決策樹大小進行調整,而梯度提升中也是可以調整決策樹的大小华匾,不過不同這種大小調整會反映在每顆決策樹上映琳。
  • 在梯度提升停止條件也是和 AdaBoost 比較類似

說了一大堆理論,我們還是動手在數(shù)據(jù)上來一次梯度提升模型比較直觀蜘拉,看看梯度提升是如何訓練和進行預測(體重)

  • 通過取均值作為預測值 71.2, 如果就此不再進行下去萨西,那么我們對每個人體重預測值就是 71.2
  • 接下來我們基于這個預測值誤差來構建決策樹,如何定義誤差旭旭,我們將預測值(71.2)與數(shù)據(jù)樣本中每一個數(shù)據(jù)值進行對比來計算誤差谎脯,
    (88 - 71.2) = 16.8
    這個實際值和預測值的差叫做偽殘差(Pseudo Residual),這里偽殘差就是我們梯度提升要做處理的部分。
# 讀取數(shù)據(jù)
data = pd.read_csv("./data/data.csv",header=0)
# 顯示數(shù)據(jù)列名稱
data.columns
顯示數(shù)據(jù)
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

這里暫時不去解釋為什么我們要構建這樣樹來預測殘差荠卷。大家可能還記得我們對數(shù)規(guī)模進行限制,也就是最多只能有 4 個葉節(jié)點烛愧。

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]

現(xiàn)在我們通過對比之前預測值和決策樹預測值
71.2 + 16.8 = 88
模型現(xiàn)在已經(jīng)完全擬合訓練數(shù)據(jù)油宜,但是現(xiàn)在 Bias比較低,而且還具有較高的 Variance怜姿。在梯度提升是用過添加學習率來解決這個問題的验庙。學習率是一個介于 0 到 1 之間的數(shù)。這個例子如果設置學習率為 0.1 那么就得到

71.2 + (0.1 \times 16.8) = 72.9
因為添加了學習率社牲,我們新的預測值不再能夠完全擬合訓練數(shù)據(jù)了粪薛。但是這一次預測結果要比上一次 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
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末藤巢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子息罗,更是在濱河造成了極大的恐慌掂咒,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迈喉,死亡現(xiàn)場離奇詭異绍刮,居然都是意外死亡,警方通過查閱死者的電腦和手機挨摸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門孩革,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人得运,你說我怎么就攤上這事膝蜈。” “怎么了熔掺?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵饱搏,是天一觀的道長。 經(jīng)常有香客問我置逻,道長推沸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任诽偷,我火速辦了婚禮坤学,結果婚禮上疯坤,老公的妹妹穿的比我還像新娘。我一直安慰自己深浮,他們只是感情好宝穗,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布警绩。 她就那樣靜靜地躺著旋膳,像睡著了一般收夸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上布卡,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天雨让,我揣著相機與錄音,去河邊找鬼忿等。 笑死栖忠,一個胖子當著我的面吹牛,可吹牛的內容都是我干的贸街。 我是一名探鬼主播庵寞,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼薛匪!你這毒婦竟也來了捐川?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤逸尖,失蹤者是張志新(化名)和其女友劉穎古沥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娇跟,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡岩齿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逞频。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纯衍。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖苗胀,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情瓦堵,我是刑警寧澤基协,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站菇用,受9級特大地震影響澜驮,放射性物質發(fā)生泄漏。R本人自食惡果不足惜惋鸥,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一杂穷、第九天 我趴在偏房一處隱蔽的房頂上張望悍缠。 院中可真熱鬧,春花似錦耐量、人聲如沸飞蚓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趴拧。三九已至,卻和暖如春山叮,著一層夾襖步出監(jiān)牢的瞬間著榴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工屁倔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脑又,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓锐借,卻偏偏與公主長得像挂谍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瞎饲,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內容