xgboost算法原理與實戰

xgboost算法原理與實戰

   之前一直有聽說GBM,GBDT(Gradient Boost Decision Tree)漸進梯度決策樹GBRT(Gradient Boost RegressionTree)漸進梯度迴歸樹是GBDT的一種,因爲GBDT核心是累加所有樹的結果作爲最終結果,而分類樹的結果是沒法累加的,所以GBDT中的樹都是迴歸樹,不是分類樹。
   XGBoost(eXtreme Gradient Boosting)是工業界逐漸風靡的基於GradientBoosting算法的一個優化的版本,可以給預測模型帶來能力的提升。

   迴歸樹的分裂結點對於平方損失函數,擬合的就是殘差;對於一般損失函數(梯度下降),擬合的就是殘差的近似值,分裂結點劃分時枚舉所有特徵的值,選取劃分點。 最後預測的結果是每棵樹的預測結果相加。
   xgboost算法的步驟和GB基本相同,都是首先初始化爲一個常數,gb是根據一階導數ri,xgboost是根據一階導數gi和二階導數hi,迭代生成基學習器,相加更新學習器。

xgboost的優化:

  1. 在尋找最佳分割點時,考慮傳統的枚舉每個特徵的所有可能分割點的貪心法效率太低,xgboost實現了一種近似的算法。大致的思想是根據百分位法列舉幾個可能成爲分割點的候選者,然後從候選者中根據上面求分割點的公式計算找出最佳的分割點。
  2. xgboost考慮了訓練數據爲稀疏值的情況,可以爲缺失值或者指定的值指定分支的默認方向,這能大大提升算法的效率,paper提到50倍.
  3. 特徵列排序後以塊的形式存儲在內存中,在迭代中可以重複使用;雖然boosting算法迭代必須串行,但是在處理每個特徵列時可以做到並行。
  4. 按照特徵列方式存儲能優化尋找最佳的分割點,但是當以行計算梯度數據時會導致內存的不連續訪問,嚴重時會導致cache miss,降低算法效率。paper中提到,可先將數據收集到線程內部的buffer,然後再計算,提高算法的效率。
  5. xgboost 還考慮了當數據量比較大,內存不夠時怎麼有效的使用磁盤,主要是結合多線程、數據壓縮、分片的方法,儘可能的提高算法的效率。

xgboost的優勢:

1、正則化

  • 標準GBM的實現沒有像XGBoost這樣的正則化步驟。正則化對減少過擬合也是有幫助的。
    實際上,XGBoost以“正則化提升(regularized boosting)”技術而聞名。

2、並行處理

  • XGBoost可以實現並行處理,相比GBM有了速度的飛躍,LightGBM也是微軟最新推出的一個速度提升的算法。 XGBoost也支持Hadoop實現。

3、高度的靈活性

  • XGBoost 允許用戶定義自定義優化目標和評價標準 。

4、缺失值處理

  • XGBoost內置處理缺失值的規則。用戶需要提供一個和其它樣本不同的值,然後把它作爲一個參數傳進去,以此來作爲缺失值的取值。XGBoost在不同節點遇到缺失值時採用不同的處理方法,並且會學習未來遇到缺失值時的處理方法。

5、剪枝

  • 當分裂時遇到一個負損失時,GBM會停止分裂。因此GBM實際上是一個貪心算法。XGBoost會一直分裂到指定的最大深度(max_depth),然後回過頭來剪枝。如果某個節點之後不再有正值,它會去除這個分裂。
    這種做法的優點,當一個負損失(如-2)後面有個正損失(如+10)的時候,就顯現出來了。GBM會在-2處停下來,因爲它遇到了一個負值。但是XGBoost會繼續分裂,然後發現這兩個分裂綜合起來會得到+8,因此會保留這兩個分裂。

6、內置交叉驗證

  • XGBoost允許在每一輪boosting迭代中使用交叉驗證。因此,可以方便地獲得最優boosting迭代次數。
    而GBM使用網格搜索,只能檢測有限個值。

7、在已有的模型基礎上繼續

  • XGBoost可以在上一輪的結果上繼續訓練。
    sklearn中的GBM的實現也有這個功能,兩種算法在這一點上是一致的。

xgboost在kaggle上的實戰:

Kaggle是一個數據分析的競賽平臺,企業或者研究者可以將數據、問題描述、期望的指標發佈到Kaggle上,以競賽的形式向廣大的數據科學家徵集解決方案,類似於KDD-CUP(國際知識發現和數據挖掘競賽)。Kaggle上的參賽者將數據下載下來,分析數據,然後運用機器學習、數據挖掘等知識,建立算法模型,解決問題得出結果,最後將結果提交。
kaggle最近剛被google收購,感覺一大批Google賽題即將到達戰場。kaggle上的很多預測模型都是基於xgboost,而且往往預測結果非常理想。下面是用法:

xgb_params = {
‘eta’: 0.05,
‘max_depth’: 5,
‘subsample’: 0.7,
‘colsample_bytree’: 0.7,
‘objective’: ‘reg:linear’,
‘eval_metric’: ‘rmse’,
‘silent’: 1
}

//xgboost加載數據爲DMatrix對象
dtrain = xgb.DMatrix(x_train, y_train)
dtest = xgb.DMatrix(x_test)

//xgboost交叉驗證並輸出rmse
cv_output = xgb.cv(xgb_params, dtrain, num_boost_round=100, early_stopping_rounds=20,
verbose_eval=50, show_stdv=False)
cv_output[[‘train-rmse-mean’, ‘test-rmse-mean’]].plot()
這裏寫圖片描述
//xgboost訓練模型
num_boost_rounds = len(cv_output)
model = xgb.train(dict(xgb_params, silent=0), dtrain, num_boost_round= num_boost_rounds)

//xgboost參數設置

  • params 這是一個字典,裏面包含着訓練中的參數關鍵字和對應的值,形式是params =
    {‘booster’:’gbtree’,’eta’:0.1}
  • dtrain 訓練的數據
  • num_boost_round 這是指提升迭代的個數
  • evals 這是一個列表形式是evals = [(dtrain,’train’),(dval,’val’)]或者是evals =
    [(dtrain,’train’)],對於第一種情況,它使得我們可以在訓練過程中觀察驗證集的效果
  • obj,自定義目的函數
  • feval,自定義評估函數
  • maximize ,是否對評估函數進行最大化
  • early_stopping_rounds,早期停止次數假設爲100,驗證集的誤差迭代到一定程度在100次內不能再繼續降低,就停止迭代
  • verbose_eval ,如果爲True,則evals中元素的評估結果會輸出在結果中;如果輸入數字,假設爲5,則每隔5個迭代輸出一次。
  • learning_rates 每一次提升的學習率
  • xgb_model ,在訓練之前用於加載的xgb model

//顯示xgboost模型中比較重要的幾個feature
featureImportance = model.get_fscore()
features = pd.DataFrame()
features[‘features’] = featureImportance.keys()
features[‘importance’] = featureImportance.values()
features.sort_values(by=[‘importance’],ascending=False,inplace=True)
fig,ax= plt.subplots()
fig.set_size_inches(20,10)
plt.xticks(rotation=60)
sn.barplot(data=features.head(30),x=”features”,y=”importance”,ax=ax,orient=”v”)
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章