生活随笔
收集整理的這篇文章主要介紹了
【机器学习】集成学习知识点总结二
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
GBDT原理概述
GBDT是集成學習Boosting的一種。算法流程詳見集成學習之梯度提升樹GBDT。
Gradient boosting的主要思想是,每一次建立單個學習器時,是在之前建立的模型的損失函數的梯度下降方向。損失函數越大,說明模型越容易出錯,如果我們的模型能夠讓損失函數持續的下降,則說明我們的模型在不斷改進,而最好的方式就是讓損失函數在其梯度的方向上下降。
GBDT的核心就在于,每一顆樹學的是之前所有樹結論和的負梯度,這個負梯度就是一個加預測值后能夠得到真實值的累加量。所以為了得到負梯度,GBDT中的樹都是回歸樹 ,而不是分類樹,即使GBDT是用來處理分類問題。
GBDT常用損失函數有哪些
對于分類算法 ,其損失函數一般有對數損失函數 和指數損失函數 兩種:
a) 如果是指數損失函數 ,則損失函數表達式為
其負梯度計算和葉子節點的最佳殘差擬合參見Adaboost原理篇。
b)?如果是對數損失函數 ,分為二元分類和多元分類兩種
二元GBDT:
多元GBDT:
對于回歸算法 ,常用損失函數有如下4種:
a)?均方差 ,這個是最常見的回歸損失函數了
b)?絕對損失 ,這個損失函數也很常見
對應負梯度誤差為:(雖然不是處處可導,但幾乎不會發生,影響不大。L1正則梯度使用坐標下降法或者次梯度下降法,因L1正則化有稀疏特征的特質,不可導的情況易存在。)
c)?Huber損失 ,它是均方差和絕對損失的折衷產物,對于遠離中心的異常點,采用絕對損失,而中心附近的點采用均方差。這個界限一般用分位數點度量。損失函數如下:
對應的負梯度誤差為:
d) 分位數損失 。它對應的是分位數回歸的損失函數,表達式為
其中θ為分位數,需要我們在回歸前指定。對應的負梯度誤差為:
對于Huber損失和分位數損失,主要用于健壯回歸 ,也就是減少異常點 對損失函數的影響。
GBDT中為什么要用負梯度來代表殘差計算
其實除了均方誤差的情況一階導是殘差外,其他的情況沒有殘差的概念,GBDT每一輪擬合的都是損失函數負梯度。
使用梯度計算代替殘差的主要原因是為了將GBDT拓展到更復雜的損失函數 中。
當損失函數形式簡單,可以認為模型輸出值等于實際值時損失函數最小,但當損失函數加入正則項 (決策樹的正則項主要是葉子節點個數 ,在xgboost中還與葉子節點的取值 有關)后,并非在時損失函數取得最小值,所以我們需要計算損失函數的梯度,而不能直接使用模型來計算殘差。
GBDT用于分類
GBDT無論是用于分類還是回歸一直都是使用的CART回歸樹。 之所以要使用回歸樹,是由于分類樹的結果相減是沒有意義的,而回歸樹的結果相減為殘差(梯度)是有意義的。 二分類的GBDT與回歸問題的GBDT的區別在于以下三點: 樹的初始化方式不同。普通的回歸GBDT可將樹直接初始化為一個常數(取樣本均值,本質上是取一個值使得損失函數最小。)。二分類的GBDT在初始化樹時也是取一個常數,這個常數為整體樣本分類的一個odd,又叫機會比。 葉子節點取值不同。普通的回歸GBDT在選定分裂特征后將每個分支節點的均值作為其節點預測值(損失函數為MSE);而二分類的GBDT選定分裂特征的規則是相同的,不過每個分支節點的預測值采用一個新的公式。 最重要的還是損失函數的不同。對于回歸問題通常會使用MSE,對于二分類問題通常使用的是交叉熵損失(對數損失)。 多分類的GBDT在本質上是對二分類GBDT使用了One Vs All的策略。對于K個類別,需要訓練K顆GBDT樹。與普通回歸GDBT的區別與二分類GDBT和普通回歸GDBT的區別相差無幾。其實也是在三個方向上做了改動: 樹的棵樹較二分類增多。 樹的初始化方式改變,簡單的置為0. 葉子節點的取值公式更新。公式較為復雜。 損失函數重新定義。 對于分類問題而言,我們用GDBT最后得到的是一個預測數值,顯然需要對輸出做一定的處理。常見的處理方式為,二分類問題中使用Sigmoid函數縮放到[0,1]區間后設定劃分閾值。多分類問題中使用Softmax函數將概率最大的設定為該樣本的預測類別。 雖然當GDBT用在回歸和分類不同場合時,其應用細節有較大的改變,從根本的損失函數定義到節點的初始化與賦值操作,都發生了變化。但在算法的流程上,其實GBDT模型還是較為統一 的,以及接下來將會介紹的Xgboost,即使作出了較多的改進,但在算法的整體流程上,依舊采用的是GDBT的模式。
使用GBDT構建特征
之前整理有整理過一點,詳見高維稀疏特征及特征構建
GBDT本身是不能產生特征的,但是我們可以利用GBDT去產生特征的組合,其主要思想是GBDT每棵樹的路徑 (每一條路徑其實就是不同的特征之間的組合)直接作為其他模型的輸入特征使用,例如輸入邏輯回歸模型中去。
具體的做法是 :用已有特征訓練GBDT模型,然后利用GBDT模型學習到的樹來構造新特征,最后把這些新特征加入原有特征一起訓練模型。
構造的新特征向量是取值0/1的,向量的每個元素對應GBDT模型中樹的葉子節點。當一個樣本點通過某棵樹最終落在這顆樹的一個葉子節點上,那么在新的特征向量中這個葉子節點對應的元素之為1,而這棵樹的其他葉子節點對應的元素值為0。新特征向量的長度等于GBDT模型里所有樹包含的葉子節點數之和(路徑數)。
如上圖,記有樣本,假設我們利用已有特征已經構架出來兩顆GBDT數即為tree1和tree2.然后我們將樣本輸入到這兩棵樹中去,對于每一個輸入樣本,其總會在每一顆樹中落到一個葉節點上,同時每一個葉節點其必對應一條特征路徑。假設樣本落在了第一棵樹的第二個節點,第二棵樹的第一個節點,則我們可以為該樣本添加新的特征,特征組合為每一條路徑,上圖中為一個5維的向量,這個特征的值為[0,1,0,1,0]。
實驗證明這樣會得到比較顯著的提升模型效果。
論文中提到這樣的GBDT樹(驗證樹)的數量最多為500,大于500就沒有性能提升了,同時每棵樹的節點不多于12.
為什么GBDT不適合使用高維稀疏特征
特征太多,GBDT不一定跑的動,即使可以跑也會耗費很長時間。主要是由于樹模型在分支時的特征選擇相當耗時 ,尤其是當特征量很大的時候!其次由于GBDT的boosting算法,需要構建多棵CART樹,雖然對于弱分類器CART樹而言,不需要很深,但弱分類器的構建往往在開始的時候是很慢的。 樹的分割往往只考慮了少量的特征,大部分的特征都用不到。boosting過程需要迭代多棵CART樹,每次樹的構建可能使用的特征都類似。所以高維稀疏特征會造成大量特征的浪費。
GBDT正則化
第一種是和Adaboost類似的正則化項,即步長(learning rate)。對于同樣的訓練集學習效果,較小的v意味著我們需要更多的弱學習器的迭代次數。通常我們用步長和迭代最大次數一起來決定算法的擬合效果。? 第二種正則化的方式是通過子采樣比例(subsample)。取值為(0,1]。注意這里的子采樣和隨機森林不一樣,隨機森林使用的是放回抽樣,而這里是不放回抽樣。如果取值為1,則全部樣本都使用,等于沒有使用子采樣。如果取值小于1,則只有一部分樣本會去做GBDT的決策樹擬合。選擇小于1的比例可以減少方差 ,即防止過擬合,但是會增加樣本擬合的偏差 ,因此取值不能太低。推薦在[0.5, 0.8] 之間。?使用了子采樣的GBDT有時也稱作隨機梯度提升樹(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采樣,程序可以通過采樣分發到不同的任務去做boosting的迭代過程,最后形成新樹,從而減少弱學習器難以并行學習的弱點。這里其實引入了bagging 的思想,所以GBDT能夠有效地抵御訓練數據中的噪音,具有更好的健壯性。(降低方差) 第三種是對于弱學習器即CART回歸樹進行正則化剪枝。在決策樹原理篇里我們已經講過,這里就不重復了。
GBDT調參
n_estimators:也就是弱學習器的最大迭代次數,或者說最大的弱學習器的個數。太小容易欠擬合,太大容易過擬合。 learning_rate:即每個弱學習器的權重縮減系數v,也稱為步長。 subsample:不放回抽樣比例,又叫做子采樣。如果取值為1,即使用全部樣本構建GBDT。一般使用[0.5,0.8] ,過大可能會過擬合,過小會欠擬合。適當的子采樣可以使得模型具有較好的泛化能力。 基分類器的葉子節點個數J選在[4,8] 區間內較好,太小,需要太多的迭代次數。太大又容易過擬合。 預剪枝策略的設定參數,不作累述了,在之前將隨機森林或者剪枝策略中都有提到過。
GBDT對異常值敏感嗎?
GBDT在不使用一些健壯的損失函數的情形下,對于異常值實際上是極為敏感的。如果使用一些健壯的損失函數,如Huber以及分位數Quantile損失函數則可以改善這個狀況。
從GBDT的算法模型來理解為什么GBDT對異常值相當敏感。
GBDT每一次擬合上一次弱回歸樹的負梯度。如果樣本中存在異常值。則每一次的負梯度往往都會被異常值給放大(仔細回想回歸樹的最優分裂點選取準則以及子節點的預測值計算)。直觀來想,其實很好理解,模型是無法判斷這個值是不是異常值的,它只會機械的讓模型去充分擬合樣本,如果存在異常值,模型依舊希望可以較為充分的擬合它(使得損失函數最低),此時整個模型的預測就會因為一個極端的預測值而被帶偏。對于正常樣本的預測能力就會大大降低了。
GBDT的優缺點
優點 :
使用一些健壯的損失函數,對異常值的魯棒性非常強。比如 Huber損失函數和Quantile損失函數。 GBDT幾乎可用于所有回歸問題(線性/非線性),相對logistic regression僅能用于線性回歸,GBDT的適用面非常廣。 訓練過程中可以自動構建特征。同時可以用于特征構建。 在相對少的調參時間情況下,預測的準備率也可以比較高。這個是相對SVM來說的。 可以靈活處理各種類型的數據,包括連續值和離散值。(其實這可以算作是決策樹的一個特性了。) 不需要歸一化。(也算是樹模型的一大特色,作為概率模型,是不需要歸一化的。)
缺點 :
由于弱學習器之間存在依賴關系,難以并行訓練數據。不過可以通過子采樣的SGBT來達到部分并行。 不適合高維稀疏特征。
為什么Xgboost要用泰勒展開
Xgboost使用了一階和二階偏導,二階導數有利于梯度下降的更快更準,使用泰勒展開取得函數做自變量的二階導數形式,可以在不選定損失函數具體形式的情況下,僅僅依靠輸入數據的值就可以進行葉子分裂優化計算,本質上也就把損失函數的選取和模型算法優化/參數選擇分開 了。這種去耦合增加了Xgboost的適用性,使得它按需選取損失函數,可以用于分類,也可以用于回歸。
XGBoost的特征重要性是如何得到的
某個特征的重要性(feature score),等于它被選中為樹節點分裂特征的次數的和,比如特征A在第一次迭代中(即第一棵樹)被選中了1次去分裂樹節點,在第二次迭代被選中2次…..那么最終特征A的feature score就是 1+2+….
Xgboost如何尋找最優特征
Xgboost在訓練的過程中給出各個特征的增益評分,最大增益的特征會被選出來作為分類依據。像CART樹中的基尼增益等,不過Xgboost的增益計算相對復雜。
Xgboost調參
booster [default=gbtree]:選擇基分類器 ,gbtree: tree-based models/gblinear: linear models? eta [default=0.3]:shrinkage 參數,用于更新葉子節點權重時,乘以該系數,避免步長 過大。參數值越大,越可能無法收斂。把學習率 eta 設置的小一些,小學習率可以使得后面的學習更加仔細。? min_child_weight [default=1]:這個參數默認是 1,是每個葉子里面 h 的和至少是多少,對正負樣本不均衡時的 0-1 分類而言,假設 h 在 0.01 附近,min_child_weight 為 1 意味著葉子節點中最少需要包含 100 個樣本。這個參數非常影響結果,控制葉子節點中二階導的和的最小值 ,該參數值越小,越容易 overfitting。 gamma [default=0]:后剪枝 時,用于控制是否后剪枝的參數。? max_delta_step [default=0]:這個參數在更新步驟中起作用,如果取0表示沒有約束,如果取正值則使得更新步驟更加保守。可以防止做太大的更新步子,使更新更加平緩。? subsample [default=1]:樣本子采樣 ,較低的值使得算法更加保守,防止過擬合,但是太小的值也會造成欠擬合。? colsample_bytree [default=1]:列采樣 ,對每棵樹的生成用的特征進行列采樣.一般設置為:[0.5,1] lambda [default=1]:控制模型復雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合。? alpha [default=0]:控制模型復雜程度的權重值的 L1 正則項參數,參數值越大,模型越不容易過擬合。? scale_pos_weight [default=1]:如果取值大于0的話,在類別樣本不平衡 的情況下有助于快速收斂。 objective [default=reg:linear]:定義最小化損失函數 類型,常用參數:? binary :logistic?–logistic regression for binary classification, returns predicted probability (not class)?multi:softmax ?–multiclass classification using the softmax objective, returns predicted class (not probabilities) ,you also need to set an additional?num_class?(number of classes) parameter defining the number of unique classes?multi:softprob ?–same as softmax, but returns predicted probability of each data point belonging to each class.?
XGBoost樹剪枝
預剪枝,,每一次分類選擇Gain值最大的分裂方式,可以通過調節值的大小來改變樹的分裂傾向,實現預剪枝。 當最優分裂點對應的增益值為負值是停止分裂; 但是這也會存在問題,即將來的某個時刻能夠獲取更高的增益; 其次XGBoost會在完整生成一顆決策樹后回溯剪枝(從底到頂進行剪枝)。 將決策樹增長到它的最大深度,遞歸的進行剪枝,剪去那些使得增益值為負值的葉子節點;
XGBoost對缺失值的處理
當數據中含有缺失值的時候,我們可以不再填充缺失值。利用XGBoost的機制自動處理缺失值。
上圖給出了XGBoost關于缺失值的處理方式,XGBoost為缺失值設定了默認的分裂方向,XGBoost在樹的構建過程中選擇能夠最小化訓練誤差的方向作為默認的分裂方向,即在訓練時將缺失值先分入左子樹 計算增益再分入右子樹 計算增益,將缺失值劃入增益大的方向。
XGBoost和GBDT的區別
傳統GBDT以CART作為基分類器,xgboost還支持線性分類器 ,這個時候xgboost相當于帶L1和L2正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)。 傳統GBDT在優化時只用到一階導數信息,xgboost則對代價函數進行了二階泰勒展開,同時用到了一階和二階導數 。順便提一下,xgboost工具支持自定義代價函數 ,只要函數可一階和二階求導。 xgboost在代價函數里加入了正則項 ,用于控制模型的復雜度。正則項里包含了樹的葉子節點個數 、每個葉子節點上輸出的score的L2模的平方和 。從Bias-variance tradeoff角度來講,正則項降低了模型variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優于傳統GBDT的一個特性?—正則化包括了兩個部分,都是為了防止過擬合,剪枝是都有的,葉子結點輸出L2平滑是新增的。 Shrinkage(縮減),相當于學習速率 (xgboost中的eta)。xgboost在進行完一次迭代后,會將葉子節點的權重乘上該系數,主要是為了削弱每棵樹的影響,讓后面有更大的學習空間。實際應用中,一般把eta設置得小一點,然后迭代次數設置得大一點。(補充:傳統GBDT的實現也有學習速率) column subsampling列(特征)抽樣 ,說是從隨機森林那邊學習來的,防止過擬合的效果比傳統的行抽樣還好(行抽樣功能也有),并且有利于后面提到的并行化處理算法。 xgboost工具支持并行 。boosting不是一種串行的結構嗎?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數里包含了前面t-1次迭代的預測值)。xgboost的并行是在特征粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特征的值進行排序(因為要確定最佳分割點),xgboost在訓練之前,預先對數據進行了排序(預排序 ),然后保存為block結構,后面的迭代中重復地使用這個結構,大大減小計算量。這個block結構也使得并行成為了可能,在進行節點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行 。(其實就是在特征分類的時候,傳統的做法是遍歷每個特征再遍歷每個特征的所有分裂點,然后去尋找一個損失最小的特征的分裂點。這些特征與特征間的選擇是獨立的,所以給了實現并行計算的可能性。同時在分裂點的選取的時候還需要對特征進行排序,這個也是獨立的,所以也給了實現并行計算的可能。) 對缺失值的處理 。對于特征的值有缺失的樣本,xgboost可以自動學習出它的分裂方向。上面也有講到。split finding algorithms(劃分點查找算法 ):提出了候選分割點 概念,先通過直方圖算法 獲得候選分割點的分布情況,然后根據候選分割點將連續的特征信息映射到不同的buckets中,并統計匯總信息。
?
總結
以上是生活随笔 為你收集整理的【机器学习】集成学习知识点总结二 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。