1. 程式人生 > >機器學習演算法-梯度樹提升GTB(GBRT)

機器學習演算法-梯度樹提升GTB(GBRT)

Introduction

決策樹這種演算法有著很多良好的特性,比如說訓練時間複雜度較低,預測的過程比較快速,模型容易展示(容易將得到的決策樹做成圖片展示出來)等。但是同時,單決策樹又有一些不好的地方,比如說容易over-fitting,雖然有一些方法,如剪枝可以減少這種情況,但是還是不太理想。

模型組合(比如說有Boosting,Bagging等)與決策樹相關的演算法比較多,如randomForest、Adaboost、GBRT等,這些演算法最終的結果是生成N(可能會有幾百棵以上)棵樹,這樣可以大大的減少單決策樹帶來的毛病,有點類似於三個臭皮匠賽過一個諸葛亮的做法,雖然這幾百棵決策樹中的每一棵都很簡單(相對於C4.5這種單決策樹而言),但是他們組合起來確是很強大。雖然這些演算法都是通過決策樹演變過來的,但在處理的過程上有著一些差異,我會在後面對此做一個本質上的比較。下面先來介紹下本文的梯度提升演算法。

Gradient Tree Boosting

梯度樹提升(Gradient Tree Boosting)是一種組合演算法,也叫做梯度提升迴歸樹(gradient boosting regression tree),它的基分類器是決策樹,既可以用來回歸,也可以用作分類。在分類效能上,能夠和隨機森林媲美,甚至在有的資料集上表現的有過之而無不及。如今,Gradient Tree Boosting模型已經廣泛的運用在Web搜尋排行榜以及生態學上。在阿里內部也用的比較多,所以值得我們去花點時間認真學習。

根據scikit-learn官網的介紹,GBRT的優勢有:

  • 自然而然地處理混合型別的資料
  • 預測能力強
  • 在輸出空間對於異常值的魯棒性強(通過強大的損失函式)

然而,GBRT也有劣勢:

  • 可擴充套件性方面,由於提升的時序性,不能進行並行處理

儘管如此,由於GTB的表現效能很好,所以它仍然受廣大業界人士的青睞。下面來介紹下梯度提升樹的演算法原理。

GTB演算法

梯度提升(gradient boosting)演算法最初是FreidMan在2000年提出來的,其核心就在於,每棵樹是從先前所有樹的殘差中來學習。利用的是當前模型中損失函式的負梯度值

rmi=[L(yi,f(xi))f(xi)]f(x)=fm1(x)

作為提升樹演算法中的殘差的近似值,進而擬合一棵迴歸(分類)樹。

梯度提升屬於Boost演算法的一種,也可以說是Boost演算法的一種改進,原始的Boost演算法是在演算法開始時,為每一個樣本賦上一個相等的權重值,也就是說,最開始的時候,大家都是一樣重要的。在每一次訓練中得到的模型,會使得資料點的估計有所差異,所以在每一步結束後,我們需要對權重值進行處理,而處理的方式就是通過增加錯分類點的權重,同時減少正確分類點的權重,這樣使得某些點如果老是被分錯,那麼就會被“嚴重關注”,也就被賦上一個很高的權重。然後等進行了N次迭代(由使用者指定),將會得到N個簡單的基分類器(basic learner),最後將它們組合起來,可以對它們進行加權(錯誤率越大的基分類器權重值越小,錯誤率越小的基分類器權重值越大)、或者讓它們進行投票等得到一個最終的模型。

Gradient Boost與傳統的Boost有著很大的區別,它的每一次計算都是為了減少上一次的殘差(residual),而為了減少這些殘差,可以在殘差減少的梯度(Gradient)方向上建立一個新模型。所以說,在Gradient Boost中,每個新模型的建立是為了使得先前模型殘差往梯度方向減少,與傳統的Boost演算法對正確、錯誤的樣本進行加權有著極大的區別。

梯度提升演算法(以迴歸為例)

對於給定的輸入:訓練資料集T=(x1,y1),(x2,y2),...,(xn,yn),損失函式L(y,f(x));
輸出結果:一棵迴歸樹f~(x)

(1)首先初始化

f0(x)=argminci=1NL(yi,c)

估計一個使損失函式極小化的常數值,此時它只有一個節點的樹;

(2)迭代的建立M棵提升樹
for m=1 to M:(第一層迴圈)
for i=1 to N:(第二層迴圈) 計算損失函式的負梯度在當前模型的值,並將它作為殘差的估計值。

rmi=[L(yi,f(xi))f(xi)]f(x)=fm1(x)

對於rmi擬合一棵迴歸樹,得到第m棵樹的葉節點區域Rmj,j=1,2,…,J

for j=1 to J:(第二層迴圈),計算:

cmj=argmincxiϵRmjL(yi,fm1(xi)+c)

利用線性搜尋估計葉節點區域的值,使損失函式極小化;

然後,更新fm(x)=fm1(x)+Jj=1cmjI(xϵRmj)

(3)最後得到的fm(x)就是我們最終的模型

f~(x)=fM(x)=m=1Mj=1JcmjI(xϵRmj)

使用scikit-learn中的GTB

在scikit-learn中對GTB演算法有了很好的封裝,對於分類可以選擇的損失函式有邏輯迴歸和指數函式,對於迴歸的損失函式相對比較多,有最小二乘法、最小絕對偏差函式、huber以及分位數等。具體描述參考下面的圖片:
這裡寫圖片描述

下面是sklearn中的一個分類原例:

>>> from sklearn.datasets import make_hastie_10_2
>>> from sklearn.ensemble import GradientBoostingClassifier
>>> X, y = make_hastie_10_2(random_state=0)
>>> X_train, X_test = X[:2000], X[2000:]
>>> y_train, y_test = y[:2000], y[2000:]
>>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0,
...     max_depth=1, random_state=0).fit(X_train, y_train)
>>> clf.score(X_test, y_test)                 
0.913...

其中n_estimators表示弱分類器的個數,learning_rate表示學習率,max_depth表示最大的深度等。GTB的引數比較多,在實際應用中需要自己去調整合適的引數。

基於決策樹的組合演算法比較

基於決策樹的組合演算法常用的有三個,分別是Adaboost、RandomFrest以及本文的GBRT。

Adaboost是通過迭代的學習每一個基分類器,每次迭代中,把上一次錯分類的資料權值增大,正確分類的資料權值減小,然後將基分類器的線性組合作為一個強分類器,同時給分類誤差率較小的基本分類器以大的權值,給分類誤差率較大的基分類器以小的權重值。Adaboost使用的是自適應的方法,其中概率分散式變化的,關注的是難分類的樣本。詳細內容請參考我之前的文章:機器學習演算法-Adaboost

隨機森林RandomForest演算法,與adaboost有錯區別,可以說一種改進的裝袋組合演算法。隨機森林則(randomForest),不僅對樣本進行抽樣,還對變數進行抽樣。它通過隨機的方式建立一個森林,森林裡面有許多棵決策樹,並且每一棵樹之間是沒有聯絡的。在得到森林之後,當有一個新的輸入樣本進來的時候,就讓森林中的每一棵決策樹分別對其進行判斷,看這個樣本應該屬於哪一類(就分類演算法而言),然後看看哪一類選擇最多,就預測這個樣本為該類。在建立每一棵決策樹的過程中,有兩點需要注意,即取樣完全分裂。首先是兩個隨機取樣的過程,RF對輸入的資料要進行行取樣和列取樣。對於行取樣,是採用有放回的方式,也就是在取樣得到的樣本集合中,可能有重複的樣本。假設輸入樣本為N個,那麼取樣的樣本也為N個。這樣使得在訓練的時候,每一棵樹的輸入樣本都不是全部的樣本,使得相對不容易出現over-fitting過擬合。然後進行列取樣,從M個feature特徵中,選擇m個(m << M)。之後就是對取樣之後的資料使用完全分裂的方式建立出決策樹,這樣決策樹的某一個葉子節點要麼是無法繼續分裂的,要麼裡面的所有樣本的都是指向的同一個類別。一般很多的決策樹演算法都一個重要的步驟-剪枝,但是這裡不這樣幹,由於之前的兩個隨機取樣的過程保證了隨機性,所以就算不剪枝,也不會出現over-fitting。按照這種演算法得到的隨機森林中的每一棵決策樹都是非常弱的,但當它們組合在一起的時候,就相當厲害了。隨機森林就好比是:每一棵決策樹就是一個精通於某一領域的專家(因為我們從M個feature中選擇m個讓每一棵決策樹進行學習),這樣在隨機森林中就有了很多個精通不同領域的專家,對一個新的問題(新的輸入資料),可以用不同的角度去看待它,最終由各個專家,投票得到結果。隨機森林的分類準確率可以與adaboost媲美。它對噪聲資料更加魯棒,執行速度比adaboost也快得多。

對於梯度提升樹,它的每一次計算都是為了減少上一次的殘差(residual),而為了減少這些殘差,可以在殘差減少的梯度(Gradient)方向上建立一個新模型。這與adaboost和隨機森林有很大的區別。

References

[1] Introduction to Data Mining 資料探勘概論. Pang-Ning Tan Michael Steinbach Vipin Kumar著
[2] 統計學習方法 李航 著
[3] scikit-learn官網組合演算法 點選這裡

本欄目Machine Learning持續更新中,歡迎關注:Dream_Angel_Z部落格