XGBoost(eXtreme Gradient Boosting)是GradientBoosting算法的一個優化的版本,針對傳統GBDT算法作了不少細節改進,包括損失函數、正則化、切分點查找算法優化等。html
xgboost可使用隨機抽取特徵,這個方法借鑑了隨機森林的建模特色,能夠防止過擬合。python
速度上有很好的優化,主要體如今如下方面:
一、現了分裂點尋找近似算法,先經過直方圖算法得到候選分割點的分佈狀況,而後根據候選分割點將連續的特徵信息映射到不一樣的buckets中,並統計彙總信息。
二、xgboost考慮了訓練數據爲稀疏值的狀況,能夠爲缺失值或者指定的值指定分支的默認方向,這能大大提高算法的效率。
三、正常狀況下Gradient Boosting算法都是順序執行,因此速度較慢,xgboost特徵列排序後以塊的形式存儲在內存中,在迭代中能夠重複使用,於是xgboost在處理每一個特徵列時能夠作到並行。git
總的來講,xgboost相對於GBDT在模型訓練速度以及在下降過擬合上很多的提高。算法
基於不一樣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正則化的模型建叫作Lasso迴歸,使用L2正則化的模型叫作Ridge迴歸(嶺迴歸)。
一般狀況下,L1正則化是在損失函數上加入一項α||w||1,L2正則化則是在損失函數上加入一項α||w||22
通常回歸分析中迴歸w表示特徵的係數,從上式能夠看到正則化項是對係數作了處理(限制)。L1正則化和L2正則化的說明以下:
L1正則化有助於生成一個稀疏權值矩陣(稀疏矩陣指的是不少元素爲0,只有少數元素是非零值的矩陣,即獲得的線性迴歸模型的大部分系數都是0. ),進而能夠用於特徵選擇。
一般機器學習中特徵數量不少,例如文本處理時,若是將一個詞組(term)做爲一個特徵,那麼特徵數量會達到上萬個(bigram)。在預測或分類時,那麼多特徵顯然難以選擇,可是若是代入這些特徵獲得的模型是一個稀疏模型,表示只有少數特徵對這個模型有貢獻,絕大部分特徵是沒有貢獻的,或者貢獻微小(由於它們前面的係數是0或者是很小的值,即便去掉對模型也沒有什麼影響),此時咱們就能夠只關注係數是非零值的特徵。這就是稀疏模型與特徵選擇的關係。
L2正則化能夠在擬合過程構造一個全部參數都比較小的模型。由於通常認爲參數值小的模型比較簡單,能適應不一樣的數據集,也在必定程度上避免了過擬合現象。能夠設想一下對於一個線性迴歸方程,若參數很大,那麼只要數據偏移一點點,就會對結果形成很大的影響;但若是參數足夠小,數據偏移得多一點也不會對結果形成什麼影響,專業一點的說法是抗擾動能力強。
xgboost的參數能夠分爲三類:通用參數,booster參數及目標參數。
一、通用參數
二、booster參數
三、目標參數
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 歸一化累積增益
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