↑↑↑點擊上方藍字,回覆資料,10個G的驚喜
100天搞定機器學習|Day59 主成分分析(PCA)原理及使用詳解
XGBoost 是一種集大成的機器學習算法,可用於迴歸,分類和排序等各種問題,在機器學習大賽及工業領域被廣泛應用。成功案例包括:網頁文本分類、顧客行爲預測、情感挖掘、廣告點擊率預測、惡意軟件分類、物品分類、風險評估、大規模在線課程退學率預測。
XGBoost是初學者最值得深度理解的模型之一,它將決策樹、boosting、GBDT 等知識點串聯起來,強烈建議大家都手擼一波。本文我將從XGBoost淵源及優點、模型原理及優化推導、XGBoost模型參數解析、調參實例,XGBoost可視化等方面介紹XGBoost。提醒一下,XGBoost 是在 GBDT 基礎上的改進,閱讀本文需對 GBDT 有一定的瞭解,不熟悉的同學可以看一下前篇:100天搞定機器學習|Day58 機器學習入門:硬核拆解GBDT
XGBoost淵源及優勢
在數據建模中,經常採用Boosting方法,該方法將成百上千個分類準確率較低的樹模型組合起來,成爲一個準確率很高的預測模型。這個模型會不斷地迭代,每次迭代就生成一顆新的樹。但在數據集較複雜的時候,可能需要幾千次迭代運算,這將造成巨大的計算瓶頸。
針對這個問題,華盛頓大學的陳天奇博士開發的XGBoost(eXtreme Gradient Boosting)基於C++通過多線程實現了迴歸樹的並行構建,並在原有Gradient Boosting算法基礎上加以改進,從而極大地提升了模型訓練速度和預測精度。
XGBoost 主要優勢如下:
1、GBDT在優化時只用到一階導數信息,XGBoost同時用到了一階和二階導數,還支持自定義損失函數,前提是損失函數可一階和二階求導;
2、加入了正則項,用於控制模型的複雜度,防止過擬合;
3、借鑑了隨機森林的做法,支持列抽樣(隨機選擇特徵),不僅能降低過擬合,還能減少計算;
4、尋找最佳分割點時,實現了一種近似法,還考慮了稀疏數據集、缺失值的處理,大大提升算法的效率;
5、支持並行;
6、近似直方圖算法,用於高效地生成候選的分割點;
7、在算法實現時做了很多優化,大大提升了算法的效率,內存空間不夠時,利用了分塊、預取、壓縮、多線程協作的思想。
XGBoost模型原理及優化推導
XGBoost其實也是GBDT的一種,還是加性模型和前向優化算法。
加法模型就是說強分類器由一系列弱分類器線性相加而成。一般組合形式如下:
其中, 就是一個個的弱分類器, 是弱分類器學習到的最優參數, 就是弱學習在強分類器中所佔比重,P是所有 和 的組合。這些弱分類器線性相加組成強分類器。
前向分步就是說在訓練過程中,下一輪迭代產生的分類器是在上一輪的基礎上訓練得來的。也就是可以寫成這樣的形式:
XGBoost 的模型是什麼樣子的呢?
-
其中 K 是樹的棵數。 -
是迴歸樹, ,滿足 -
q表示每棵樹的結構,它會將一個訓練樣本實例映射到相對應的葉子索引上。 -
T是樹中的葉子數。 -
每個對應於一個獨立的樹結構q和葉子權重w。 -
是所有迴歸樹組成的函數空間。
與決策樹不同的是,每棵迴歸樹包含了在每個葉子上的一個連續分值,我們使用來表示第i個葉子上的分值。對於一個給定樣本實例,我們會使用樹上的決策規則(由q給定)來將它分類到葉子上,並通過將相應葉子上的分值(由w給定)做求和,計算最終的預測值。
XGBoost的學習
爲了在該模型中學到這些函數集合,我們會對下面的正則化目標函數做最小化:
其中:
是損失函數,常見的有 2 種:
平方損失函數:
邏輯迴歸損失函數:
: 正則化項,用於懲罰複雜模型,避免模型過分擬合訓練數據。常用的正則有L1正則與L2正則:
L1正則(lasso):
L2正則:
下一步就是對目標函數進行學習,每一次保留原來的模型不變,加入一個新的函數 到我們的模型中。
其中, 爲第i個實例在第t次迭代時的預測,我們需要添加樹 ,然後最小化下面的目標函數:
假設損失函數使用的是平方損失 ,則上式進一步寫爲:
現在,我們採用泰勒展開來定義一個近似的目標函數:
其中:
分別是loss function上的一階梯度和二階梯度。
忘記基礎知識的同學順便重溫一下泰勒公式吧
泰勒公式(Taylor’s Formula)是一個用函數在某點的信息描述其附近取值的公式。其初衷是用多項式來近似表示函數在某點周圍的情況。
函數 在 處的基本形式如下
還有另外一種常見的寫法, ,將 在 處進行泰勒展開,得:
現在,我們去掉常量,然後重新認識一下我們新的目標函數:
定義 是葉子 j 的實例集合。 將正則項帶入,展開目標函數:
看起來有點複雜,令: , ,上式簡化爲:
上式中 是相互獨立的, 是平方項。對於一個確定的結構 ,我們可以計算最優的權重 :
將 帶入上式,計算得到的loss最優解 :
可以作爲一個得分函數(scoring function)來衡量一棵樹結構 的質量。
我們有了一個方法來衡量一棵樹有多好,現在來看XGBoost優化的第二個問題:如何選擇哪個特徵和特徵值進行分裂,使最終我們的損失函數最小?
XGBoost特徵選擇和切分點選擇指標定義爲:
具體如何分裂?
XGBoost每一步選能使分裂後增益最大的分裂點進行分裂。而分裂點的選取之前是枚舉所有分割點,這稱爲完全貪婪算法(exact greedy algorithm),在所有特徵上,枚舉所有可能的劃分。
-
基於當前節點嘗試分裂決策樹,默認分數score=0,G和H爲當前需要分裂的節點的一階二階導數之和。 -
對特徵序號 k=1,2...K: -
將樣本按特徵k從小到大排列,依次取出第i個樣本,依次計算當前樣本放入左子樹後,左右子樹一階和二階導數和:
-
嘗試更新最大的分數:
-
基於最大score對應的劃分特徵和特徵值分裂子樹。 -
如果最大score爲0,則當前決策樹建立完畢,計算所有葉子區域的 , 得到弱學習器 ,更新強學習器 ,進入下一輪弱學習器迭代.如果最大score不是0,則繼續嘗試分裂決策樹。
當數據量十分龐大時,Exact Greedy 算法就會很慢,因此XGBoost引入了近似的算法,和Exact Greedy很類似,這裏就不再展開講了。
原理推導(精簡版)
下面是XGBoost原理推導的精簡版,方便同學們複習使用。
Xgboost@sklearn模型參數解析
XGBoost的實現有原生版本,同時也有Scikit-learn版本,兩者在使用上有一些微差異,這裏給出xgboost.sklearn 參數解釋。XGBoost使用key-value字典的方式存儲參數:
#部分重要參數
params = {
'booster': 'gbtree',
'objective': 'multi:softmax', # 多分類的問題
'num_class': 10, # 類別數,與 multisoftmax 並用
'gamma': 0.1, # 用於控制是否後剪枝的參數,越大越保守,一般0.1、0.2這樣子。
'max_depth': 12, # 構建樹的深度,越大越容易過擬合
'lambda': 2, # 控制模型複雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合。
'subsample': 0.7, # 隨機採樣訓練樣本
'colsample_bytree': 0.7, # 生成樹時進行的列採樣
'min_child_weight': 3,
'silent': 1, # 設置成1則沒有運行信息輸出,最好是設置爲0.
'eta': 0.007, # 如同學習率
'seed': 1000,
'nthread': 4, # cpu 線程數
}
篇幅原因,調參實例及XGBoost可視化且聽下回分解。
如有收穫,還請不吝給個在看、收藏、轉發
參考
https://www.cnblogs.com/pinard/p/10979808.html
https://www.biaodianfu.com/xgboost.html https://www.zybuluo.com/vivounicorn/note/446479 https://www.cnblogs.com/chenjieyouge/p/12026339.html
也可以加一下老胡的微信
圍觀朋友圈~~~
推薦閱讀
(點擊標題可跳轉閱讀)
麻省理工學院計算機課程【中文版】
【清華大學王東老師】現代機器學習技術導論.pdf
機器學習中令你事半功倍的pipeline處理機制
機器學習避坑指南:訓練集/測試集分佈一致性檢查
機器學習深度研究:特徵選擇中幾個重要的統計學概念
老鐵,三連支持一下,好嗎?↓↓↓
本文分享自微信公衆號 - 機器學習算法與Python實戰(tjxj666)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。