XGboost,全稱Extrem Gradient boost,極度梯度提升,是陳天奇大牛在GBDT等傳統Boosting算法的基礎上重新優化形成的,是Kaggle競賽的必殺神器。
XGboost屬於集成學習的模型,在集成學習中主要有三個算法,Bagging,Boosting和Stacking,Bagging算法的優秀代表是RF(隨機森林),Boosting算法的優秀代表有
Adaboosing,GBDT和XGboost,Stacking算法貌似沒有什么優秀的代表,算是一種集成的思想,在Kaggle競賽中用的比較多。
先來說一說XGboost的優點,用過的人就知道,它哪里都是優點。
1.損失函數
機器學習中常用的損失函數主要有:指數損失,合頁損失,零一損失,交叉熵損失,平方損失等等,XGboost這方面有幾個好處,首先XGboost可以自定義損失函數,你可以選擇以上常用的損失函數,也可以根據實際問題的具體情況自定義損失函數,提供了極大的靈活性,對於解決實際問題非常有幫助;其次,在優化損失函數時,XGboost用泰勒公式對目標損失函數進行展開,二階求導,一方面更加准確,另一方面將損失函數本身和優化方法分離開,可以在事先不指定具體的損失函數的情況下進行目標函數的優化,具有極大的靈活性。
2.正則化
XGboost在目標損失函數后面加了一個自定義的正則化項,這個正則化項是自定義的樹的復雜度,正則項里包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和,這樣做有效的控制了模型的復雜度。
3.Shrinkage(縮減)
Shrinkage(縮減)相當於學習速率(xgboost中的eta)。xgboost在進行完一次迭代后,會將葉子節點的權重乘上該系數,主要是為了削弱每棵樹的影響,讓后面有更大的學習空間。實際應用中,一般把eta設置得小一點,然后迭代次數設置得大一點。
4.列采樣
xgboost借鑒了隨機森林的做法,支持列抽樣,不僅能降低過擬合,還能減少計算,這也是xgboost異於傳統gbdt的一個特性
5.支持並行計算
XGboost在訓練每一棵樹的時候,是迭代式訓練,是線性的,這是無法做到並行計算的,但是訓練一棵樹最費時間的是進行節點分裂時計算每個屬性的增益,以及每一個屬性的最佳切割點,XGboost在計算最佳分裂屬性和最佳切割點時可以調用CPU進行多線程的並行計算,極大的節約了時間,加速了訓練過程。
6.支持確實值的處理
對缺失值的處理,對於特征的值有缺失的樣本,xgboost可以自動學習出它的分裂方向
7.非貪心算法
XGboost在確定最佳切割點時,並沒有采用傳統的貪心算法遍歷每一個可能的分割點,而是先篩選出一個候選集和,然后在候選集合中確定最佳切割點。
。。。。。,當然還有別的,這里就不一一列舉了。
在使用工具方面,XGboost可以和sklearn結合使用,xgboost可以接收普通的numpy數組形式的特征矩陣,也可以接收libsvm形式的稀疏距陣的壓縮格式,當特征距陣比較稀疏時,后者更加節約內存空間。
對於libsvm格式的文件,sklearn工具調用如下:
from sklearn.datasets import load_svmlight_file
load_svmlight_file(my_workpath + 'agaricus.txt.train')
xgboost調用如下:xgb.Dmatrix(路勁)
模型可視化工具:xgb.to_graphviz(model,num_trees)(前提是系統安裝了graphviz軟件)
參數選擇和調優:k折交叉驗證和網格索搜:GridSearchCV
防止過擬合:earlystop,集成學習,正則化,交叉驗證,增強數據
bst.fit(X_train_part, y_train_part, early_stopping_rounds=100, eval_metric="error",
eval_set=eval_set, verbose=True),可以看到,隨着在訓練集上迭代次數的增多,所得模型在測試集 上的性能的變化,是否發生過擬合的情況。
data.isnull().sum():統計所有特征關鍵字非空的的數目
data['class'].unique():某一列特征有多少種取值
以下:根據特征重要性畫圖
from xgboost import plot_importance
plot_importance(model_XGB)
pyplot.show()
