python機器學習 xgboost簡介

2021-10-23 22:22:39 字數 3648 閱讀 7870

boosting 分類器屬於整合學習模型,它基本思想是把成百上千個分類準確率較低的樹模型組合起來,成為乙個準確率很高的模型。這個模型會不斷地迭代,每次迭代就生成一顆新的樹。對於如何在每一步生成合理的樹,大家提出了很多的方法,我們這裡簡要介紹由 friedman 提出的 gradient boosting machine :它在生成每一棵樹的時候採用梯度下降的思想,以之前生成的所有樹為基礎,向著最小化給定目標函式的方向多走一步。在合理的引數設定下,我們往往要生成一定數量的樹才能達到令人滿意的準確率。在資料集較大較複雜的時候,我們可能需要幾千次迭代運算,如果生成乙個樹模型需要幾秒鐘,那麼這麼多迭代的運算耗時將會是巨大的。

現在,我們希望能通過 xgboost 工具庫就能更好地解決這個問題。xgboost 的全稱是 extreme gradient boosting 。正如其名,它是 gradient boosting machine 的乙個 c++ 實現,作者為華盛頓大學研究機器學習的大牛陳天奇。xgboost 的最大特點在於,它能夠自動利用 cpu 的多執行緒進行並行,同時在演算法上加以改進提高了精度。它的**秀是 kaggle 的希格斯子訊號識別競賽,因為出眾的效率與較高的**準確度在比賽論壇中引起了參賽選手的廣泛關注,在 1700 多支隊伍的激烈競爭中占有一席之地。隨著它在 kaggle 社群知名度的提高,最近也有隊伍借助 xgboost 在比賽中奪得第一。

由於其高效的 c++ 實現,xgboost在效能上超過了最常用使用的 r 包 gbm 和 python 包 sklearn 。在 kaggle 的希格斯子競賽資料上,單執行緒 xgboost 比其他兩個包均要快出 50% ,在多執行緒上 xgboost更是有接近線性的效能提公升。由於其效能和使用便利性,xgboost 已經在 kaggle 競賽中被廣泛使用,並已經有隊伍成功借助其拿到了第一名。

kaggle 神器 xgboost,在 kaggle 的很多比賽中,我們可以看到很多 winner 喜歡用 xgboost,而且獲得非常好的表現,今天就來看看 xgboost 到底是什麼以及如何應用。

xgboost 所應用的演算法就是 gradient boosting decision tree( gbdt ),既可以用於分類也可以用於回歸問題中。

而 gradient boosting 是 boosting 的其中一種方法,所謂 boosting ,就是將弱分離器 fi(x) 組合起來形成強分類器 f(x) 的一種方法。

所以 boosting 有三個要素:

① 要優化的損失函式(a loss function to be optimized):例如分類問題中用 cross entropy ,回歸問題用 mean squared error 。

② 弱學習器做**(a weak learner to make predictions):例如決策樹。

③ 可加模型(an additive model):將多個弱學習器累加起來組成強學習器,進而使目標損失函式達到極小。

gradient boosting 就是通過加入新的弱學習器,來努力糾正前面所有弱學習器的殘差,最終這樣多個學習器相加在一起用來進行最終**,準確率就會比單獨的乙個要高。之所以稱為 gradient ,是因為在新增新模型時使用了梯度下降演算法來最小化的損失。

前面已經知道,xgboost 就是對 gradient boosting decision tree 的實現,但是一般來說,gradient boosting 的實現是比較慢的,因為每次都要先構造出乙個樹並新增到整個模型序列中。而 xgboost 的特點就是計算速度快,模型表現好,這兩點也正是這個專案的目標。

表現快是因為它具有這樣的設計:

① 並行化:訓練時可以用所有的 cpu 核心來並行化建樹。

注意:a). xgboost 的並行不是 tree 粒度的並行,xgboost 也是一次迭代完才能進行下一次迭代的(第 t 次迭代的代價函式裡包含了前面 t-1 次迭代的**值)。xgboost 的並行是在特徵粒度上的。我們知道,決策樹的學習最耗時的乙個步驟就是對特徵的值進行排序(因為要確定最佳分割點),xgboost 在訓練之前,預先對資料進行了排序,然後儲存為 block 結構,後面的迭代中重複地使用這個結構,大大減小計算量。這個 block 結構也使得並行成為了可能,在進行節點的**時,需要計算每個特徵的增益,最終選增益最大的那個特徵去做**,那麼各個特徵的增益計算就可以開多執行緒進行。

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

② 分布式計算:用分布式計算來訓練非常大的模型。

③ 核外計算:對於非常大的資料集還可以進行 out-of-core computing 。

④ 資料結構和演算法的快取優化:更好地利用硬體。

下圖就是 xgboost 與其它 gradient boosting 和 bagged decision trees 實現的效果比較,可以看出它比 r,python,spark,h2o 中的基準配置要更快。

另外乙個優點就是在**問題中模型表現非常好。

如果不考慮工程實現、解決問題上的一些差異,xgboost 與 gbdt 比較大的不同就是目標函式的定義。

注:紅色箭頭指向的 l 即為損失函式;紅色方框為正則項,包括 l1、l2 ;紅色圓圈為常數項。xgboost利用泰勒展開三項,做乙個近似,我們可以很清晰地看到,最終的目標函式只依賴於每個資料點的在誤差函式上的一階導數和二階導數。

① 傳統 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 可以自動學習出它的**方向。

入門教程

安裝教程

應用示例

最好的資源當然就是專案的 github 主頁

python機器 python機器學習

熱詞系列 打卡 mark一下,以後看 每天打卡學習 1 python 基礎 bv1lt4y1u7un 2 python 高階 bv1jz411b7dh 3 python 資料庫 bv1pg4y1a7a7 4 python gui與坦克大戰 bv1je411f72o 5 python numpy bv...

win10環境 python新增xgboost包

最近參加比賽,發現用這個包的很多,效果也不錯。所以想安裝下來使用下。但官網最新版本已經沒有這個資料夾了,所以自己總結了一下。1 準備 python安裝 我用的是anaconda安裝包 mingw 在 git bash中cd到想安裝的路徑 git clone recursive cd xgboost ...

python機器學習

在sklearn庫中的load itis包含著鳶尾花分類的所有資料 呼叫load iris函式載入資料 import mglearn import numpy as np from sklearn.datasets import load iris import pandas as pd from ...