xgboost安裝與原理


1、xgboost庫的安裝

先在網址https://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost 中下載whl文件,注意一定要下載跟自己當前安裝Python版本一致的whl文件

比如我是Python3.6,64位操作系統,所以要安裝xgboost-0.72-cp36-cp36m-win_amd64.whl。

然后將它放到conda文件夾下,用anaconda prompt切換到該路徑下,使用pip install xgboost-0.72-cp36-cp36m-win_amd64.whl安裝文件就可以了。

2、原理說明

說明:監督學習與非監督學習

監督學習是根據帶標簽的數據進行數據學習。所謂監督學習,就是兩步,一是定出模型確定參數,二是根據訓練數據找出最佳的參數值,所謂最佳,從應用角度看,就是最大程度地吸收了10萬條訓練數據中的知識。

如何尋找最佳參數?

確定目標函數,根據目標函數的值確定預測模型的好壞,但是存在的問題是:1)預測樣本中有錯誤值;2)樣本中可能含有極端值。比如說我們對60歲以上年紀的人的數據預測模型去預測6歲孩子的數據,結果自然是不具有參考性的。那么,如何使得參數最優呢?

那就是正則化。

所謂正則化就是對參數施加一定的控制,防止參數走向極端。以上面的例子來說,假如10萬條數據中,得癌症的病人都是60歲以上老人,沒得癌症的病人都是30歲以下年輕人,檢查結果中有一項是骨質密度,通常,老人骨質密度低,年輕人骨質密度高。那么我們學習到的模型很可能是這樣的,對骨質密度這項對應的參數θ_j設的非常大,其他的參數都非常小,簡單講,模型傾向於就用這一項檢查結果去判斷病人是否得癌症,因為這樣會讓目標函數最小。

常用的正則化就是L2正則,也就是所有參數的平方和。我們希望這個和盡可能小的同時,模型對訓練數據有盡可能好的預測。

最后,我們將L2正則項加到最初的目標函數上,就得出了最終的目標函數:
obj = ∑_i(sigmoid(∑_j θ_j*x_ij) - y_i)^2 + ∑_j(θ_j^2)

能使這個函數值最小的那組參數就是我們要找的最佳參數。這個obj包含的兩項分別稱為損失函數和正則項
這里的正則項,本質上是用來控制模型的復雜度。

Xgboost就是一個監督模型,可以用於分類和回歸,其結構就是一堆CART樹,即將每棵樹的預測值加到一起作為最終的預測值,可謂簡單粗暴。
CART樹與決策樹的區別:CART可以用於分類和回歸。https://blog.csdn.net/lzzdflg/article/details/78649925
CART是在給定輸入隨機變量X條件下輸出隨機變量Y的條件概率分布,與ID3和C4.5的決策樹所不同的是, ID3和C4.5生成的決策樹可以是多叉的,每個節點下的叉樹由該節點特征的取值種類而定,比如特征年齡分為(青年,中年,老年),那么改節點下可分為3叉。而CART為假設決策樹為二叉樹,內部結點特征取值為”是”和”否”。左分支取值為”是”,有分支取值為”否”。這樣的決策樹等價於遞歸地二分每一個特征,將輸入空間划分為有限個單元,並在這些單元上預測概率分布,也就是在輸入給定的條件下輸出條件概率分布。
通常目標函數包含兩部分:訓練誤差和正則化
obj(θ)=L(θ)+Ω(θ)obj(θ)=L(θ)+Ω(θ)

其中L是損失函數,度量模型預測與真實值的誤差。常用的損失函數:
預測問題的平方損失函數:
L(θ)=Σi(yiyi^)2L(θ)=Σi(yi−yi^)2

logistic 損失:
L(θ)=Σi[yiln(1+eyi^)+(1yi)ln(1+eyi^)]L(θ)=Σi[yiln(1+e−yi^)+(1−yi)ln(1+eyi^)]

ΩΩ是正則化項,度量模型的復雜度,避免過擬合,常用的正則化有L1 和L2正則化。

假設有兩顆回歸樹,則兩棵樹融合后的預測結果如上圖。
用公式表示為:

yi^=ΣKk=1fk(xi),fkFyi^=Σk=1Kfk(xi),fk∈F

其中, K 是樹的個數, fk(xi)fk(xi)是第k棵樹對於輸入 xixi 輸出的得分, fkfk是相應函數, FF 是相應函數空間。
則目標函數為:

obj(θ)=Σnil(yi,yi^)+ΣKk=1Ω(fk)obj(θ)=Σinl(yi,yi^)+Σk=1KΩ(fk)

函數ll描述yiyi , yi^yi^之間的距離。
常用的模型融合方法是Random Foreast和Boosting Tree,這兩種方法構造樹的方式不同。Tree Ensemble中,模型的參數是什么呢?其實就是指樹的結構和葉子節點上面分數的預測。如何求參數?定義目標函數,通過優化目標函數進行求解。

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可以自動學習出它的分裂方向。XGBoost對於確實值能預先學習一個默認的分裂方向
xgboost工具支持並行。boosting不是一種串行的結構嗎?怎么並行的?注意xgboost的並行不是tree粒度的並行,xgboost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數里包含了前面t-1次迭代的預測值)。xgboost的並行是在特征粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特征的值進行排序(因為要確定最佳分割點),xgboost在訓練之前,預先對數據進行了排序,然后保存為block結構,后面的迭代中重復地使用這個結構,大大減小計算量。這個block結構也使得並行成為了可能,在進行節點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行。
我:
可並行的近似直方圖算法。樹節點在進行分裂時,我們需要計算每個特征的每個分割點對應的增益,即用貪心法枚舉所有可能的分割點。當數據無法一次載入內存或者在分布式情況下,貪心算法效率就會變得很低,所以xgboost還提出了一種可並行的近似直方圖算法,用於高效地生成候選的分割點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM