機器學習——XGBoost


基礎概念

XGBoost(eXtreme Gradient Boosting)是GradientBoosting算法的一個優化的版本,針對傳統GBDT算法作了不少細節改進,包括損失函數、正則化、切分點查找算法優化等。html


xgboost的優化點

  • 相對於傳統的GBM,XGBoost增長了正則化步驟。正則化的做用是減小過擬合現象。
  • xgboost可使用隨機抽取特徵,這個方法借鑑了隨機森林的建模特色,能夠防止過擬合。python

  • 速度上有很好的優化,主要體如今如下方面:
    一、現了分裂點尋找近似算法,先經過直方圖算法得到候選分割點的分佈狀況,而後根據候選分割點將連續的特徵信息映射到不一樣的buckets中,並統計彙總信息。
    二、xgboost考慮了訓練數據爲稀疏值的狀況,能夠爲缺失值或者指定的值指定分支的默認方向,這能大大提高算法的效率。
    三、正常狀況下Gradient Boosting算法都是順序執行,因此速度較慢,xgboost特徵列排序後以塊的形式存儲在內存中,在迭代中能夠重複使用,於是xgboost在處理每一個特徵列時能夠作到並行。git

總的來講,xgboost相對於GBDT在模型訓練速度以及在下降過擬合上很多的提高。算法


XGBOOST原理

基於不一樣y的理解, 咱們能夠有不一樣的問題,如迴歸、分類、排序等。 咱們須要找到一種方法來找到最好的參數給定的訓練數據。 爲了達到這個目的,咱們須要定義一個 目標函數 , 用它來測量模型的性能。目標函數包含兩部分:損失函數+正則項

其中L爲損失函數,Ω是正則項,在預測數據時經常使用的損失函數好比均方根偏差:

另一個經常使用的損失函數是logistic損失函數:

其中,咱們是通關不斷優化,下降損失函數,來提升模型的性能,另外,正則項的主要做用是防止模型的過擬合現象。app



對於xgboost而言,它的目標函數能夠寫成:
dom

xgboost比傳統解決最優化問題經常使用的梯度迭代方法要跟難,它並非一次性訓練全部樹,而是採用一種加法策略,一次添加一個樹,所以步驟t的預測值y能夠寫:
機器學習

根據上面的推理過程,咱們能夠把目標函數寫成:
函數

若是考慮使用均方偏差做爲損失函數的,最終可使用的目標函數可寫成
性能

對以上目標函數進行二階泰勒展開,獲得如下公式:
學習

其中,gi和hi被定義爲:

最終的目標函數表示形式爲:

從中能夠看到,xgboost的最優化問題,將取決於目標函數過程當中gi和hi取值。


補充理解

補充理解部分主要是對上面提到的正則化和泰勒展開式作補充解釋


泰勒展開式

泰勒公式是一個用函數在某點的信息描述其附近取值的公式。若是函數足夠平滑的話,在已知函數在某一點的各階導數值的狀況之下,泰勒公式能夠用這些導數值作係數構建一個多項式來近似函數在這一點的鄰域中的值。泰勒公式還給出了這個多項式和實際的函數值之間的誤差。

在機器學習中,使用泰勒展開式的目的是經過泰勒展開式函數的局部近似特性來簡化複雜函數的表達。

例如:
函數y=x^3,當自變量有變化時,即 △x,自變量y會變化△y,帶入到函數裏面就有:

當△x —> 0時,上式的後兩項是△x的高階無窮小捨去的話上式就變成了

也就是說當自變量x足夠小的時候,也就是在某點的很小的鄰域內,Δy是能夠表示成Δx的線性函數的。線性函數計算起來,求導起來會很方便。
對於通常函數,當在某點很小領域內咱們也能夠寫成相似上面的這種自變量和因變量之間線性關係

變化一下形式Δy=f(x)-f(x0), Δx = x-x0在代入上式

這個就是在x0點鄰域內舍掉高階無窮小項之後獲得的局部線性近似公式了。爲了提升近似的精確度,因而把上面的一次近似多項式修正爲二次多項式。再進一步二次修正爲三次,一直下去就獲得n階泰勒多項式。

只作一次近似的公式以下:

近似的多項式和原始函數是經過同一點x0。

進行二次近似的公式以下:

近似的多項式和原始函數既過同一點,並且在同一點的導數相同,也就是多項式表達的函數在x0點的切線也相同。

最終n階泰勒展開公式:

展開越多近似程度越高。


L1正則化和L2正則化

L1正則化和L2正則化能夠看作是損失函數的懲罰項。所謂『懲罰』是指對損失函數中的某些參數作一些限制。對於線性迴歸模型,使用L1正則化的模型建叫作Lasso迴歸,使用L2正則化的模型叫作Ridge迴歸(嶺迴歸)。

一般狀況下,L1正則化是在損失函數上加入一項α||w||1,L2正則化則是在損失函數上加入一項α||w||22

通常回歸分析中迴歸w表示特徵的係數,從上式能夠看到正則化項是對係數作了處理(限制)。L1正則化和L2正則化的說明以下:

  • L1正則化是指權值向量w中各個元素的絕對值之和,一般表示爲||w||1,L1正則化能夠產生稀疏權值矩陣,即產生一個稀疏模型,能夠用於特徵選擇。
  • L2正則化是指權值向量w中各個元素的平方和而後再求平方根,一般表示爲||w||2,L2正則化能夠防止模型過擬合(overfitting);必定程度上,L1也能夠防止過擬合。


L1正則化的做用闡述

L1正則化有助於生成一個稀疏權值矩陣(稀疏矩陣指的是不少元素爲0,只有少數元素是非零值的矩陣,即獲得的線性迴歸模型的大部分系數都是0. ),進而能夠用於特徵選擇。

一般機器學習中特徵數量不少,例如文本處理時,若是將一個詞組(term)做爲一個特徵,那麼特徵數量會達到上萬個(bigram)。在預測或分類時,那麼多特徵顯然難以選擇,可是若是代入這些特徵獲得的模型是一個稀疏模型,表示只有少數特徵對這個模型有貢獻,絕大部分特徵是沒有貢獻的,或者貢獻微小(由於它們前面的係數是0或者是很小的值,即便去掉對模型也沒有什麼影響),此時咱們就能夠只關注係數是非零值的特徵。這就是稀疏模型與特徵選擇的關係。


L2正則化的做用闡述

L2正則化能夠在擬合過程構造一個全部參數都比較小的模型。由於通常認爲參數值小的模型比較簡單,能適應不一樣的數據集,也在必定程度上避免了過擬合現象。能夠設想一下對於一個線性迴歸方程,若參數很大,那麼只要數據偏移一點點,就會對結果形成很大的影響;但若是參數足夠小,數據偏移得多一點也不會對結果形成什麼影響,專業一點的說法是抗擾動能力強。


python中xgboost的使用

xgboost的參數能夠分爲三類:通用參數,booster參數及目標參數。


一、通用參數

  • booster:選擇基分類器,可選參數gbtree和gblinear,默認爲gbtree
  • silent:是否打印模型信息,0表示打印,1表示不打印,默認0
  • nthread:線程數選擇,默認爲最大可用線程數
  • num_pbuffer:預測緩衝區的大小,一般設置爲訓練實例的數量。緩衝區用於保存最後的預測結果提升一步
  • num_feature:boosting過程當中用到的特徵維數,通常xgboost會自動設置



二、booster參數

  • eta :學習步長,至關於其餘集合模型中的learning_rate,默認爲0.3,通常範圍0.01-0.2
  • gamma:最小損失函數值,默認爲0,對於一個節點的劃分只有在其loss function 獲得結果大於0的狀況下才進行
  • max_depth:樹的最大深度,默認爲6 ,用於控制過擬合
  • min_child_weight:子節點最小的樣本權重,默認爲1,用於控制過擬合
  • max_delta_step:每棵樹權重改變的最大步長,默認爲0,通常不設置
  • subsample:隨機採樣的比例,默認爲1,用戶控制過擬合
  • colsample_bytree:隨機抽取特徵比例,默認1,用戶控制過擬合
  • colsample_bylevel:每一個層級隨機抽取特徵比例,默認爲1
  • lambda:l2正則項參數,默認爲1
  • alpha:l1正則項參數,默認爲1
  • tree_method:樹的構造方法,默認爲auto
    auto 啓發式方法
    exact 精確貪婪算法
    approx 近似貪婪算法
    hist 垂直最優化貪婪算法
  • scale_pos_weight:類別處理不平衡處理,默認爲0,大於0的取值能夠處理類別不平衡的問題。幫助模型更快收斂
  • updater 更新樹的構建方法,
  • refresh_leaf 節點更新,默認爲true
  • process_type boosting處理方式選擇,默認爲default
  • max_leaves 樹的最大節點數增長,默認爲0



三、目標參數

  • objective:損失函數選擇,默認爲reg:linear,可選參數以下
    「reg:linear」 –線性迴歸。
    「reg:logistic」 –邏輯迴歸。
    「binary:logistic」 –二分類的邏輯迴歸問題,輸出爲機率。
    「binary:logitraw」 –二分類的邏輯迴歸問題,輸出的結果爲wTx。
    「count:poisson」 –計數問題的poisson迴歸,輸出結果爲poisson分佈。在poisson迴歸中,max_delta_step的缺省值爲0.7。(used to safeguard optimization)
    「multi:softmax」 –讓XGBoost採用softmax目標函數處理多分類問題,同時須要設置參數num_class(類別個數)
    「multi:softprob」 –和softmax同樣,可是輸出的是ndata * nclass的向量,能夠將該向量reshape成ndata行nclass列的矩陣。每行數據表示樣本所屬於每一個類別的機率。
    「rank:pairwise」 –經過最小化pairwise損失作排名任務

  • eval_metric:最優化損失函數的方法
    rmse 均方根偏差
    mae 平均絕對偏差
    logloss 負對數似然函數值
    error 二分類錯誤率
    merror 多分類錯誤率
    mlogloss 多分類logloss損失函數
    auc 曲線下面積排名估計
    ndcg 歸一化累積增益


python代碼實現

import xgboost as xgb
from sklearn.datasets import load_boston
import pandas as pd
from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score


boston = load_boston()
#查看波士頓數據集的keys
print(boston.keys())
boston_data=boston.data
target_var=boston.target
feature=boston.feature_names

boston_df=pd.DataFrame(boston_data,columns=boston.feature_names)
boston_df['tar_name']=target_var

#查看目標變量描述統計
print(boston_df['tar_name'].describe())
#把數據集轉變爲二分類數據
boston_df.loc[boston_df['tar_name']<=21,'tar_name']=0
boston_df.loc[boston_df['tar_name']>21,'tar_name']=1


x_train, x_test, y_train, y_test = train_test_split(boston_df[feature], boston_df['tar_name'], test_size=0.30, random_state=1)

train_data=xgb.DMatrix(x_train,label=y_train)
dtrain=xgb.DMatrix(x_train)
dtest=xgb.DMatrix(x_test)

params={'booster':'gbtree',
    'objective': 'binary:logistic',
    'eval_metric': 'auc',
    'max_depth':6,
    'subsample':0.75,
    'colsample_bytree':0.75,
    'eta': 0.03,}

watchlist = [(train_data,'train')]
bst=xgb.train(params,train_data,num_boost_round=100,evals=watchlist)


# 度量xgboost的準確性
y_train_pred = (bst.predict(dtrain)>=0.5)*1
y_test_pred =(bst.predict(dtest)>=0.5)*1
tree_train = accuracy_score(y_train, y_train_pred)
tree_test = accuracy_score(y_test, y_test_pred)
print('xgboost train/test accuracies %.3f/%.3f' % (tree_train, tree_test))

結果爲:xgboost train/test accuracies 0.980/0.868



參考資料:http://xgboost.readthedocs.io/en/latest/model.html

相關文章
相關標籤/搜索