目標
介紹什么是梯度提升(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ù)值進行對比來計算誤差谎脯,
這個實際值和預測值的差叫做偽殘差(Pseudo Residual),這里偽殘差就是我們梯度提升要做處理的部分。
# 讀取數(shù)據(jù)
data = pd.read_csv("./data/data.csv",header=0)
# 顯示數(shù)據(jù)列名稱
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
# plt.scatter(np.linspace(1,6,1),data['weight'])
plt.scatter(np.linspace(0,5,6),data['weight'],color='blue')
身高(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 |
構建決策樹
通常我們都是預測目標值娱俺,而這一次我們通過擬合殘差來達到推測預測值來達到訓練的目的。我們將預測體重問題轉移到預測殘差上废麻。
- 性別=F
- 身高 < 1.6
- 是否喜好藍色(Blue)
- 身高 < 1.6
gender_female = data[data.gender =='Female']
gender_female
gender_male = data[data.gender =='Male']
gender_male
這里暫時不去解釋為什么我們要構建這樣樹來預測殘差荠卷。大家可能還記得我們對數(shù)規(guī)模進行限制,也就是最多只能有 4 個葉節(jié)點烛愧。
short_gender_female = gender_female[gender_female.height < 1.6]
short_gender_female
high_gender_female = gender_female[gender_female.height >= 1.6]
high_gender_female
- 性別=F
- 身高 < 1.6
- 是否喜好藍色(Blue)
- 身高 < 1.6
現(xiàn)在我們通過對比之前預測值和決策樹預測值
模型現(xiàn)在已經(jīng)完全擬合訓練數(shù)據(jù)油宜,但是現(xiàn)在 Bias比較低,而且還具有較高的 Variance怜姿。在梯度提升是用過添加學習率來解決這個問題的验庙。學習率是一個介于 0 到 1 之間的數(shù)。這個例子如果設置學習率為 0.1 那么就得到
因為添加了學習率社牲,我們新的預測值不再能夠完全擬合訓練數(shù)據(jù)了粪薛。但是這一次預測結果要比上一次 71.2 也預測值更加接近觀測值 88 了。通過學習率讓我們模型一步一步以較小步幅邁向觀測值搏恤。
# 通過列名稱(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
決策樹結構
- 性別=F
- 身高 < 1.6
- 是否喜好藍色(Blue)
-
屏幕快照 2020-03-22 下午6.05.10.png
- 身高 < 1.6
身高(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 |