當前位置:首頁 » 操作系統 » gbdt演算法原理

gbdt演算法原理

發布時間: 2022-04-17 18:02:14

1. xgboost/gbdt在調參時為什麼樹的深度很少就能達到很高的精度

考慮這個簡化的操作:試想把樹的深度設為2,那麼gbdt裡面的基學習器都是二分類決策樹,然後自己在二維坐標繫上畫很多點,然後不停的用boosting的方法用二分類決策樹去進行分類,不同的是,我們簡化權重的計算方式,初始化權重都為1,每次分錯權重不變,分對則權重將為原來的一半,最終能用深度為2的樹成功對很多不規則的點進行分類。
然而用深度為2的樹,用類似RF的bagging方法也能成功對不規則的點分類。
所以到這里,我們實際操作了,用深度低的樹通過ensemble對於不規則的點的分類這種「黑科技」。

那麼為什麼gbdt在樹的深度很小的時候能很快達到很高的預測或分類精度呢?或者說,它比RF明顯。
我的理解是,因為gbdt更多的是一種優化演算法。具體怎麼優化的,期待牛人用公式解答。

2. matlab中怎麼使用gbdt

1 機器學習是萬能的?
當然不是,如果你認為可以簡單地把一堆特徵樣本扔給機器學習,就期望它給一個好的模型,那是不可能。在使用機器學習之前,一定要對所使用的模型有個基本的了解,最好能夠知道它的計算原理。如果你都不知道treelink為何物,那些參數大概是個什麼意思,你最好就不要用了,用也是在拼人品。
2 使用機器學習的同時做好數據分析工作
就算使用機器學習,數據的分析工作也是省不了的,做好了分析工作,你會發現自己都可以像機器一樣找到那些規律。其實機器學習本身也就是統計,幫你找數據之間的規律,並把這些規律做成規則。好萊塢奧斯卡金像獎電影《美麗心靈》中的男主人翁,諾貝爾經濟學獎得主數學家約翰納什在電影中被稱為最厲害的人肉密碼破譯者,充分向我們展現了how people learning beats machine learning,當然是有些誇張的成份。下面是一些可以做的最基本的數據分析工作:
1) 特徵的分布:按特徵的取值分段,每一段包含的樣本數量,特徵均值,方差。
2) 目標分布同上
3) 特徵目標關系:特徵分段,每段中包含的樣本的目標取值。
4) 目標特徵關系:目標分段,每段中包含的樣本的特徵取值
3 模型在訓練數據上效果不錯,但做Cross-validation效果不佳
主要原因有兩個:
1) 選取的樣本數據太少,覆蓋度不夠,考慮增加訓練樣本
2) 樣本特徵過多,可以考慮減少一些特徵,只留下重要的特徵
4 模型在類似Cross-validation這樣的封閉測試上效果不錯,但在開放測試上效果不佳
1) 選取的訓練數據覆蓋度不夠,不具備代表性,不能體現真實數據的分布。
2) 模型遷移(Model drift),隨著時間變化,特徵數據也隨之變化。比如3個月前做的模型對現在的特徵可能不會有好的效果。

3. 機器學習中GBDT和XGBoosts的區別是

首先來了解一下boosting思想,每次訓練單個弱分類器時,都將上一次分錯的數據權重提高一點再進行當前單個弱分類器的學習,這樣往後執行,訓練出來的單個弱分類器就會越在意那些容易分錯的點,最終通過加權求和的方式組合成一個最終的學習器,gradent boosting 是boosting的一種,每一次構建單個學習器時,是在之前建立的模型的損失函數的梯度下降方向, GB與Adaboost的區別在於:
AdaBoost是通過提升錯分數據點的權重來定位模型的不足。
Gradient Boosting是通過算梯度(gradient)來定位模型的不足。
主要思想是,每一次建立單個學習器時,是在之前建立的模型的損失函數的梯度下降方向,損失函數越大,說明模型越容易出錯,如果我們的模型能夠讓損失函數持續的下降,則說明我們的模型在不停的改進,而最好的方式就是讓損失函數在其梯度方向上下降。
GBDT=GB+DT(decision tree),即基分類器為決策樹時,這里的決策樹是回歸樹。
Xgboost 是GB演算法的高效實現,其中基分類器除了可以使CART也可以是線性分類器。
幾大區別:
傳統GBDT以CART作為基分類器,xgboost還支持線性分類器,這個時候xgboost相當於帶L1和L2正則化項的邏輯斯帝回歸或者線性回歸
傳統GBDT在優化時只用到了一階導數,而xgboost對代價函數進行了二階泰勒展開,用到了一階和二階導數
xgboost加入了正則項,防止過擬合
shrinkage,相當於學習率,在每完成一次迭代後,會乘上這個系數,削減每棵樹的影響
列抽樣,借鑒隨機森林的做法,支持列抽樣,不僅能降低過擬合,還能減少計算。

4. 從原理上來說,GBDT 和 SVM 哪個更強為什麼

為了簡單,只討論一下分類的情況。
演算法很難比較說誰更強,而是誰更適應業務場景。
主要是特徵數量、訓練過程、可解釋性上面有很大的差異。
SVM 能夠訓練大量(上萬的詞)特徵,不用考慮特徵離散化或者分段,非線性映射可以很好的分類。
GBDT在特徵較少的時候(200以內),能夠高效bootstrap 抽取樣本和特徵,訓練多顆樹。能夠自動做特徵重要性排序,通過gini系數等指標判斷分割點。能夠表達非常復雜的規則。

作者:秉機夜讀
來源:知乎

5. scikit-learn怎樣使用gbdt演算法

你好,你有讀寫的許可權嗎?嘗試普通的文件讀寫操作: f=open('a.txt', 'w') 如果不能正常運行,那麼嘗試用管理員許可權運行你的程序。或者,修改保存的文件名,'iris.doct'修改為其它的名字,如'abcd.dot'.

6. GBDT預測時每一棵樹是否能並行

傳統GBDT以CART作為基分類器,xgboost還支持線性分類器,這個時候xgboost相當於帶L1和L2正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)。
傳統GBDT在優化時只用到一階導數信息,xgboost則對代價函數進行了二階泰勒展開,同時用到了一階和二階導數。順便提一下,xgboost工具支持自定義代價函數,只要函數可一階和二階求導。
xgboost在代價函數里加入了正則項,用於控制模型的復雜度。正則項里包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優於傳統GBDT的一個特性。
Shrinkage(縮減),相當於學習速率(xgboost中的eta)。xgboost在進行完一次迭代後,會將葉子節點的權重乘上該系數,主要是為了削弱每棵樹的影響,讓後面有更大的學習空間。實際應用中,一般把eta設置得小一點,然後迭代次數設置得大一點。(補充:傳統GBDT的實現也有學習速率)
列抽樣(column subsampling)。xgboost借鑒了隨機森林的做法,支持列抽樣,不僅能降低過擬合,還能減少計算,這也是xgboost異於傳統gbdt的一個特性。

對缺失值的處理。對於特徵的值有缺失的樣本,xgboost可以自動學習出它的分裂方向。
xgboost工具支持並行。boosting不是一種串列的結構嗎?怎麼並行的?注意xgboost的並行不是tree粒度的並行,xgboost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數里包含了前面t-1次迭代的預測值)。xgboost的並行是在特徵粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特徵的值進行排序(因為要確定最佳分割點),xgboost在訓練之前,預先對數據進行了排序,然後保存為block結構,後面的迭代中重復地使用這個結構,大大減小計算量。這個block結構也使得並行成為了可能,在進行節點的分裂時,需要計算每個特徵的增益,最終選增益最大的那個特徵去做分裂,那麼各個特徵的增益計算就可以開多線程進行。

可並行的近似直方圖演算法。樹節點在進行分裂時,我們需要計算每個特徵的每個分割點對應的增益,即用貪心法枚舉所有可能的分割點。當數據無法一次載入內存或者在分布式情況下,貪心演算法效率就會變得很低,所以xgboost還提出了一種可並行的近似直方圖演算法,用於高效地生成候選的分割點。

7. GBDT 如何實現特徵組合提取

python調用sklearn為例,在你建立GBDT對象並作fit之後,可以使用如下代碼獲得你要的規則代碼:

dot_data = tree.export_graphviz(model_tree, out_file=None,
max_depth=5, feature_names=names_list, filled=True, rounded=True) # 將決策樹規則生成dot對象

其中tree就是你的數對象,如果你的out_file後面是一個文件名,那麼你的規則會輸出到文件中;如果是None(就像上面代碼),那麼值會保存在dot_data中。

無論哪種方法,你都能獲得規則文本。然後剩下的就是普通的文本解析的事情了。

在決策樹演算法對象的tree_屬性中,存儲了所有有關決策樹規則的信息(示例中的決策樹規則存儲在model_tree.tree_中)。最主要的幾個屬性:

  • children_left:子級左側分類節點

  • children_right:子級右側分類節點

  • feature:子節點上用來做分裂的特徵

  • threshold:子節點上對應特徵的分裂閥值

  • values:子節點中包含正例和負例的樣本數量

  • 上述屬性配合節點ID、節點層級便迭代能得到如下的規則信息:

    1 [label="rfm_score <= 7.8375 gini = 0.1135 samples =
    14581 value = [13700, 881]", fillcolor="#e58139ef"] ;

    其中規則開始的1代表節點ID,rfm_score是變數名稱,rfm_score
    <= 7.8375是分裂閥值,gini = 0.1135是在當前規則下的基尼指數,nsamples是當前節點下的總樣本量,nvalue為正例和負例的樣本數量。

來源:知乎

8. LightGBM 如何確定最佳迭代次數

LightGBM中實現了哪些梯度增強方法,它們有什麼區別?一般來說,哪些參數是重要的?哪些正則化參數需要調整?如何調整lightGBM參數在python?梯度提升的方法

使用LightGBM,你可以運行不同類型的漸變增強提升方法。你有:GBDT、DART和GOSS,這些可以通過「boosting」參數指定。

在下一節中,我將對這些方法進行解釋和比較。

梯度提升決策樹(GBDT)

該方法是本文首先提出的傳統梯度提升決策樹,也是XGBoost和pGBRT等優秀庫背後的演算法。

由於其精度高、效率高、穩定性好,目前已得到廣泛的應用。你可能知道gbdt是一個決策樹的集合模型但是它到底是什麼意思呢?

讓我來告訴你要點。

它基於三個重要原則:

弱學習者(決策樹)梯度優化提升技術所以在gbdt方法中,我們有很多決策樹(弱學習者)。這些樹是按順序構建的:

首先,樹學習如何適應目標變數第二棵樹學習如何適合殘差(差異)之間的預測,第一棵樹和地面真相第三棵樹學習如何匹配第二棵樹的殘差,以此類推。所有這些樹都是通過傳播整個系統的誤差梯度來訓練的。

gbdt的主要缺點是,在每個樹節點中找到最佳分割點非常耗時,而且會消耗內存。其他的提升方法試圖解決這個問題。

DART梯度提升

在這篇優秀的論文中(arxiv/1505.01866),你可以學習所有關於DART梯度提升的東西,這是一種使用dropout(神經網路中的標准)的方法,來改進模型正則化和處理一些其他不太明顯的問題。

也就是說,gbdt存在過度專門化(over-specialization)的問題,這意味著在以後的迭代中添加的樹往往只會影響對少數實例的預測,而對其餘實例的貢獻則可以忽略不計。添加dropout會使樹在以後的迭代中更加難以專門化那些少數的示例,從而提高性能。

lgbm goss基於梯度的單邊采樣

事實上,將該方法命名為lightgbm的最重要原因就是使用了基於本文的Goss方法。Goss是較新的、較輕的gbdt實現(因此是「light」gbm)。

標準的gbdt是可靠的,但在大型數據集上速度不夠快。因此goss提出了一種基於梯度的采樣方法來避免搜索整個搜索空間。我們知道,對於每個數據實例,當梯度很小時,這意味著不用擔心數據是經過良好訓練的,而當梯度很大時,應該重新訓練。這里我們有兩個方面,數據實例有大的和小的漸變。因此,goss以一個大的梯度保存所有數據,並對一個小梯度的數據進行隨機抽樣(這就是為什麼它被稱為單邊抽樣)。這使得搜索空間更小,goss的收斂速度更快。

讓我們把這些差異放在一個表格中:

注意:如果你將增強設置為RF,那麼lightgbm演算法表現為隨機森林而不是增強樹! 根據文檔,要使用RF,必須使用baggingfraction和featurefraction小於1。

正則化

在這一節中,我將介紹lightgbm的一些重要的正則化參數。顯然,這些是您需要調優以防止過擬合的參數。

您應該知道,對於較小的數據集(<10000條記錄),lightGBM可能不是最佳選擇。在這里,調優lightgbm參數可能沒有幫助。

此外,lightgbm使用葉向樹生長演算法,而xgboost使用深度樹生長演算法。葉向方法使樹的收斂速度更快,但過擬合的幾率增加。

注意:如果有人問您LightGBM和XGBoost之間的主要區別是什麼?你可以很容易地說,它們的區別在於它們是如何實現的。

根據lightGBM文檔,當面臨過擬合時,您可能需要做以下參數調優:

使用更小的max_bin使用更小的num_leaves使用mindatainleaf和minsumhessianin_leaf通過設置baggingfraction和baggingfreq使用bagging_freq通過設置feature_fraction使用特徵子采樣使用更大的訓練數據嘗試lambdal1、lambdal2和mingainto_split進行正則化嘗試max_depth以避免樹的深度增長在下面的部分中,我將更詳細地解釋這些參數。

lambda_l1

Lambdal1(和lambdal2)控制l1/l2,以及mingainto_split用於防止過擬合。我強烈建議您使用參數調優(在後面的小節中討論)來確定這些參數的最佳值。

num_leaves

numleaves無疑是控制模型復雜性的最重要參數之一。通過它,您可以設置每個弱學習者擁有的葉子的最大數量。較大的numleaves增加了訓練集的精確度,也增加了因過度擬合而受傷的幾率。根據文檔,一個簡單的方法是numleaves = 2^(maxdepth)但是,考慮到在lightgbm中葉狀樹比層次樹更深,你需要小心過度擬合!因此,必須同時使用maxdepth調優numleaves。

子采樣

通過子樣例(或bagging_fraction),您可以指定每個樹構建迭代使用的行數百分比。這意味著將隨機選擇一些行來匹配每個學習者(樹)。這不僅提高了泛化能力,也提高了訓練速度。

我建議對基線模型使用更小的子樣本值,然後在完成其他實驗(不同的特徵選擇,不同的樹結構)時增加這個值。

feature_fraction

特徵分數或子特徵處理列采樣,LightGBM將在每次迭代(樹)上隨機選擇特徵子集。例如,如果將其設置為0.6,LightGBM將在訓練每棵樹之前選擇60%的特性。

這個功能有兩種用法:

可以用來加速訓練嗎可以用來處理過擬合嗎

max_depth

該參數控制每棵經過訓練的樹的最大深度,將對:

num_leaves參數的最佳值模型的性能訓練時間注意,如果您使用較大的max_depth值,那麼您的模型可能會對於訓練集過擬合。

max_bin

裝箱是一種用離散視圖(直方圖)表示數據的技術。Lightgbm在創建弱學習者時,使用基於直方圖的演算法來尋找最優分割點。因此,每個連續的數字特性(例如視頻的視圖數)應該被分割成離散的容器。

此外,在這個GitHub repo(huanzhang12/lightgbm-gpu)中,你可以找到一些全面的實驗,完全解釋了改變max_bin對CPU和GPU的影響。

如果你定義maxbin 255,這意味著我們可以有255個唯一的值每個特性。那麼,較小的maxbin會導致更快的速度,較大的值會提高准確性。

訓練參數

當你想用lightgbm訓練你的模型時,一些典型的問題可能會出現:

訓練是一個耗時的過程處理計算復雜度(CPU/GPU RAM約束)處理分類特徵擁有不平衡的數據集定製度量的需要需要對分類或回歸問題進行的調整在本節中,我們將嘗試詳細解釋這些要點。

num_iterations

Num_iterations指定增強迭代的次數(要構建的樹)。你建立的樹越多,你的模型就越精確,代價是:

較長的訓練時間過擬合的可能性更高從較少的樹開始構建基線,然後當您想從模型中擠出最後的%時增加基線。

建議使用更小的learningrate和更大的numiteration。此外,如果您想要更高的numiteration,那麼您應該使用earlystopping_rounds,以便在無法學習任何有用的內容時停止訓練。

earlystoppingrounds

如果驗證度量在最後一輪停止後沒有改進,此參數將停止訓練。這應該與一些迭代成對地進行定義。如果你把它設置得太大,你就增加了過擬合的變化(但你的模型可以更好)。

經驗法則是讓它佔num_iterations的10%。

lightgbm categorical_feature

使用lightgbm的優勢之一是它可以很好地處理分類特性。是的,這個演算法非常強大,但是你必須小心如何使用它的參數。lightgbm使用一種特殊的整數編碼方法(由Fisher提出)來處理分類特徵

實驗表明,該方法比常用的單熱編碼方法具有更好的性能。

它的默認值是「auto」,意思是:讓lightgbm決定哪個表示lightgbm將推斷哪些特性是絕對的。

它並不總是工作得很好,我強烈建議您簡單地用這段代碼手動設置分類特性

cat_col = dataset_name.select_dtypes(『object』).columns.tolist()

但是在幕後發生了什麼,lightgbm是如何處理分類特徵的呢?

根據lightgbm的文檔,我們知道樹學習器不能很好地使用一種熱編碼方法,因為它們在樹中深度生長。在提出的替代方法中,樹形學習器被最優構造。例如,一個特徵有k個不同的類別,有2^(k-1) -1個可能的劃分,通過fisher方法,可以改進到k * log(k),通過找到分類特徵中值排序直方圖的最佳分割方式。

isunbalance vs scalepos_weight

其中一個問題,你可能面臨的二分類問題是如何處理不平衡的數據集。顯然,您需要平衡正/負樣本,但如何在lightgbm中做到這一點呢?

lightgbm中有兩個參數允許你處理這個問題,那就是isunbalance和scalepos_weight,但是它們之間有什麼區別呢?

當您設置Is_unbalace: True時,演算法將嘗試自動平衡佔主導地位的標簽的權重(使用列集中的pos/neg分數)

如果您想改變scaleposweight(默認情況下是1,這意味著假設正負標簽都是相等的),在不平衡數據集的情況下,您可以使用以下公式來正確地設置它

sample_pos_weight = number of negative samples / number of positive samples

lgbm函數宏指令(feaval)

有時你想定義一個自定義評估函數來測量你的模型的性能,你需要創建一個「feval」函數。

Feval函數應該接受兩個參數:

preds 、train_data

並返回

evalname、evalresult、ishigherbetter

讓我們一步一步地創建一個自定義度量函數。

定義一個單獨的python函數

def feval_func(preds, train_data): # Define a formula that evaluates the results return ('feval_func_name', eval_result, False)

使用這個函數作為參數:

print('Start training...') lgb_train = lgb.train(..., metric=None, feval=feval_func)

注意:要使用feval函數代替度量,您應該設置度量參數 metric 「None」。

分類參數與回歸參數

我之前提到的大多數事情對於分類和回歸都是正確的,但是有些事情需要調整。

具體你應該:

lightgbm最重要的參數

我們已經在前面的部分中回顧並了解了有關lightgbm參數的知識,但是如果不提及Laurae令人難以置信的基準測試,那麼關於增強樹的文章將是不完整的。

您可以了解用於lightGBM和XGBoost的許多問題的最佳默認參數。

你可以查看這里,但一些最重要的結論是:

注意:絕對不要理會任何參數值的默認值,並根據您的問題進行調整。 也就是說,這些參數是超參數調整演算法的一個很好的起點。

Python中的Lightgbm參數調整示例

最後,在解釋完所有重要參數之後,該進行一些實驗了!

我將使用最受歡迎的Kaggle競賽之一:Santander Customer Transaction Prediction. 交易預測

我將使用本文介紹如何在任何腳本中的Python中運行超參數調整。

在開始之前,一個重要的問題! 我們應該調整哪些參數?

請注意您要解決的問題,例如,Santander 數據集高度不平衡,在調整時應考慮到這一點!

一些參數是相互依賴的,必須一起調整。 例如,mindatainleaf取決於訓練樣本和numleaves的數量。

注意:為超參數創建兩個字典是一個好主意,一個字典包含您不想調整的參數和值,另一個字典包含您想要調整的參數和值范圍。

SEARCH_PARAMS = {'learning_rate': 0.4, 'max_depth': 15, 'num_leaves': 20, 'feature_fraction': 0.8, 'subsample': 0.2} FIXED_PARAMS={'objective': 'binary', 'metric': 'auc', 'is_unbalance':True, 'boosting':'gbdt', 'num_boost_round':300, 'early_stopping_rounds':30}

9. 機器學習演算法中GBDT和XGBOOST的區別有哪些

GBDT是一種演算法,XGBOOST是GBDT的一種實現。
除了XGBOOST,還有LightGBM,也支持GBDT演算法,具體可參見:https://github.com/Microsoft/LightGBM

熱點內容
伺服器如何查看線程池未關閉 發布:2024-09-30 07:13:51 瀏覽:412
如何配置資源管理 發布:2024-09-30 07:08:10 瀏覽:992
坦克世界亞服伺服器怎麼連接 發布:2024-09-30 07:07:18 瀏覽:493
手機nba2k17的文件夾 發布:2024-09-30 06:50:30 瀏覽:898
廣州市java培訓 發布:2024-09-30 06:48:52 瀏覽:143
python爬蟲簡歷模板 發布:2024-09-30 06:40:23 瀏覽:590
項目源碼丟失反編譯 發布:2024-09-30 06:27:07 瀏覽:776
fpga編譯後生成什麼文件 發布:2024-09-30 06:18:34 瀏覽:111
端編程語言 發布:2024-09-30 06:13:19 瀏覽:423
xp資料庫 發布:2024-09-30 06:02:56 瀏覽:539