python xgboost用法_XGBoost类库使用小结
在XGBoost算法原理小結(jié)中,我們討論了XGBoost的算法原理,這一片我們討論如何使用XGBoost的Python類庫(kù),以及一些重要參數(shù)的意義和調(diào)參思路。
1. XGBoost類庫(kù)概述
XGBoost除了支持Python外,也支持R,Java等語(yǔ)言。本文關(guān)注于Python的XGBoost類庫(kù),安裝使用"pip install xgboost"即可,目前使用的是XGBoost的0.90版本。XGBoost類庫(kù)除了支持決策樹(shù)作為弱學(xué)習(xí)器外,還支持線性分類器,以及帶DropOut的決策樹(shù)DART,不過(guò)通常情況下,我們使用默認(rèn)的決策樹(shù)弱學(xué)習(xí)器即可,本文也只會(huì)討論使用默認(rèn)決策樹(shù)弱學(xué)習(xí)器的XGBoost。
XGBoost有2種Python接口風(fēng)格。一種是XGBoost自帶的原生Python API接口,另一種是sklearn風(fēng)格的API接口,兩者的實(shí)現(xiàn)是基本一樣的,僅僅有細(xì)微的API使用的不同,主要體現(xiàn)在參數(shù)命名上,以及數(shù)據(jù)集的初始化上面。
2. XGBoost類庫(kù)的基本使用方式
完整示例參見(jiàn)我的Github代碼。
2.1 使用原生Python API接口
XGBoost的類庫(kù)的2種接口風(fēng)格,我們先來(lái)看看原生Python API接口如何使用。
原生XGBoost需要先把數(shù)據(jù)集按輸入特征部分,輸出部分分開(kāi),然后放到一個(gè)DMatrix數(shù)據(jù)結(jié)構(gòu)里面,這個(gè)DMatrix我們不需要關(guān)心里面的細(xì)節(jié),使用我們的訓(xùn)練集X和y初始化即可。
importpandas as pdimportnumpy as npimportxgboost as xgbimportmatplotlib.pylab as plt%matplotlib inlinefrom sklearn.model_selection importGridSearchCVfrom sklearn.model_selection import train_test_split
from sklearn.datasets.samples_generator importmake_classification#X為樣本特征,y為樣本類別輸出, 共10000個(gè)樣本,每個(gè)樣本20個(gè)特征,輸出有2個(gè)類別,沒(méi)有冗余特征,每個(gè)類別一個(gè)簇
X, y = make_classification(n_samples=10000, n_features=20, n_redundant=0,
n_clusters_per_class=1, n_classes=2, flip_y=0.1)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
dtrain =xgb.DMatrix(X_train,y_train)
dtest= xgb.DMatrix(X_test,y_test)
上面的代碼中,我們隨機(jī)初始化了一個(gè)二分類的數(shù)據(jù)集,然后分成了訓(xùn)練集和驗(yàn)證集。使用訓(xùn)練集和驗(yàn)證集分別初始化了一個(gè)DMatrix,有了DMatrix,就可以做訓(xùn)練和預(yù)測(cè)了。簡(jiǎn)單的示例代碼如下:
param = {'max_depth':5, 'eta':0.5, 'verbosity':1, 'objective':'binary:logistic'}
raw_model= xgb.train(param, dtrain, num_boost_round=20)
from sklearn.metrics importaccuracy_score
pred_train_raw=raw_model.predict(dtrain)for i inrange(len(pred_train_raw)):if pred_train_raw[i] > 0.5:
pred_train_raw[i]=1
else:
pred_train_raw[i]=0print (accuracy_score(dtrain.get_label(), pred_train_raw))
訓(xùn)練集的準(zhǔn)確率我這里輸出是0.9664。再看看驗(yàn)證集的表現(xiàn):
pred_test_raw =raw_model.predict(dtest)for i inrange(len(pred_test_raw)):if pred_test_raw[i] > 0.5:
pred_test_raw[i]=1
else:
pred_test_raw[i]=0print (accuracy_score(dtest.get_label(), pred_test_raw))
驗(yàn)證集的準(zhǔn)確率我這里的輸出是0.9408,已經(jīng)很高了。
不過(guò)對(duì)于我這樣用慣sklearn風(fēng)格API的,還是不太喜歡原生Python API接口,既然有sklearn的wrapper,那么就盡量使用sklearn風(fēng)格的接口吧。
2.2?使用sklearn風(fēng)格接口,使用原生參數(shù)
對(duì)于sklearn風(fēng)格的接口,主要有2個(gè)類可以使用,一個(gè)是分類用的XGBClassifier,另一個(gè)是回歸用的XGBRegressor。在使用這2個(gè)類的使用,對(duì)于算法的參數(shù)輸入也有2種方式,第一種就是仍然使用和原始API一樣的參數(shù)命名集合,另一種是使用sklearn風(fēng)格的參數(shù)命名。我們這里先看看如何使用和原始API一樣的參數(shù)命名集合。
其實(shí)就是使用XGBClassifier/XGBRegressor的**kwargs參數(shù),把上面原生參數(shù)的params集合放進(jìn)去,代碼如下:
sklearn_model_raw = xgb.XGBClassifier(**param)
sklearn_model_raw.fit(X_train, y_train, early_stopping_rounds=10, eval_metric="error",
eval_set=[(X_test, y_test)])
里面的param其實(shí)就是2.1節(jié)里面定義的:
param = {'max_depth':5, 'eta':0.5, 'verbosity':1, 'objective':'binary:logistic'}
使用sklearn風(fēng)格的接口,卻使用原始的參數(shù)名定義,感覺(jué)還是有點(diǎn)怪,所以我一般還是習(xí)慣使用另一種風(fēng)格接口,sklearn風(fēng)格的參數(shù)命名。
2.3?使用sklearn風(fēng)格接口,使用sklearn風(fēng)格參數(shù)
使用sklearn風(fēng)格的接口,并使用sklearn風(fēng)格的參數(shù),是我推薦的方式,主要是這樣做和GBDT之類的sklearn庫(kù)使用起來(lái)沒(méi)有什么兩樣了,也可以使用sklearn的網(wǎng)格搜索。
不過(guò)這樣做的話,參數(shù)定義命名和2.1與2.2節(jié)就有些不同了。具體的參數(shù)意義我們后面講,我們看看分類的算法初始化,訓(xùn)練與調(diào)用的簡(jiǎn)單過(guò)程:
sklearn_model_new = xgb.XGBClassifier(max_depth=5,learning_rate= 0.5, verbosity=1, objective='binary:logistic',random_state=1)
可以看到,參數(shù)定義直接放在了XGBClassifier的類參數(shù)里,和sklearn類似。大家可以看到之前兩節(jié)我們定義的步長(zhǎng)eta,這里變成了另一個(gè)名字learning_rate。
在初始化后,訓(xùn)練和預(yù)測(cè)的方法就和2.2節(jié)沒(méi)有區(qū)別了。
sklearn_model_new.fit(X_train, y_train, early_stopping_rounds=10, eval_metric="error",
eval_set=[(X_test, y_test)])
3. XGBoost類庫(kù)參數(shù)
在第二節(jié)我們已經(jīng)嘗試使用XGBoost類庫(kù)了,但是對(duì)于XGBoost的類庫(kù)參數(shù)并沒(méi)有過(guò)多討論。這里我們就詳細(xì)討論下,主要以2.3節(jié)的sklearn風(fēng)格參數(shù)為主來(lái)進(jìn)行討論。這些參數(shù)我會(huì)和之前講的scikit-learn 梯度提升樹(shù)(GBDT)調(diào)參小結(jié)中的參數(shù)定義對(duì)應(yīng),這樣如果大家對(duì)GBDT的調(diào)參很熟悉了,那么XGBoost的調(diào)參也就掌握90%了。
XGBoost的類庫(kù)參數(shù)主要包括boosting框架參數(shù),弱學(xué)習(xí)器參數(shù)以及其他參數(shù)。
3.1? XGBoost框架參數(shù)
對(duì)于XGBoost的框架參數(shù),最重要的是3個(gè)參數(shù):?booster,n_estimators和objectve。
1) booster決定了XGBoost使用的弱學(xué)習(xí)器類型,可以是默認(rèn)的gbtree, 也就是CART決策樹(shù),還可以是線性弱學(xué)習(xí)器gblinear以及DART。一般來(lái)說(shuō),我們使用gbtree就可以了,不需要調(diào)參。
2) n_estimators則是非常重要的要調(diào)的參數(shù),它關(guān)系到我們XGBoost模型的復(fù)雜度,因?yàn)樗砹宋覀儧Q策樹(shù)弱學(xué)習(xí)器的個(gè)數(shù)。這個(gè)參數(shù)對(duì)應(yīng)sklearn GBDT的n_estimators。n_estimators太小,容易欠擬合,n_estimators太大,模型會(huì)過(guò)于復(fù)雜,一般需要調(diào)參選擇一個(gè)適中的數(shù)值。
3) objective代表了我們要解決的問(wèn)題是分類還是回歸,或其他問(wèn)題,以及對(duì)應(yīng)的損失函數(shù)。具體可以取的值很多,一般我們只關(guān)心在分類和回歸的時(shí)候使用的參數(shù)。
在回歸問(wèn)題objective一般使用reg:squarederror ,即MSE均方誤差。二分類問(wèn)題一般使用binary:logistic, 多分類問(wèn)題一般使用multi:softmax。
3.2? XGBoost 弱學(xué)習(xí)器參數(shù)
這里我們只討論使用gbtree默認(rèn)弱學(xué)習(xí)器的參數(shù)。? 要調(diào)參的參數(shù)主要是決策樹(shù)的相關(guān)參數(shù)如下:
1)? ?max_depth: 控制樹(shù)結(jié)構(gòu)的深度,數(shù)據(jù)少或者特征少的時(shí)候可以不管這個(gè)值。如果模型樣本量多,特征也多的情況下,需要限制這個(gè)最大深度,具體的取值一般要網(wǎng)格搜索調(diào)參。這個(gè)參數(shù)對(duì)應(yīng)sklearn GBDT的max_depth。
2)?min_child_weight: 最小的子節(jié)點(diǎn)權(quán)重閾值,如果某個(gè)樹(shù)節(jié)點(diǎn)的權(quán)重小于這個(gè)閾值,則不會(huì)再分裂子樹(shù),即這個(gè)樹(shù)節(jié)點(diǎn)就是葉子節(jié)點(diǎn)。這里樹(shù)節(jié)點(diǎn)的權(quán)重使用的是該節(jié)點(diǎn)所有樣本的二階導(dǎo)數(shù)的和,即XGBoost原理篇里面的$H_{tj}$:$$H_{tj} =? \sum\limits_{x_i \in R_{tj}}h_{ti}$$
這個(gè)值需要網(wǎng)格搜索尋找最優(yōu)值,在sklearn GBDT里面,沒(méi)有完全對(duì)應(yīng)的參數(shù),不過(guò)min_samples_split從另一個(gè)角度起到了閾值限制。
3)?gamma: XGBoost的決策樹(shù)分裂所帶來(lái)的損失減小閾值。也就是我們?cè)趪L試樹(shù)結(jié)構(gòu)分裂時(shí),會(huì)嘗試最大數(shù)下式:$$?\max \frac{1}{2}\frac{G_L^2}{H_L + \lambda} + \frac{1}{2}\frac{G_R^2}{H_R+\lambda}? - \frac{1}{2}\frac{(G_L+G_R)^2}{H_L+H_R+ \lambda} - \gamma$$
這個(gè)最大化后的值需要大于我們的gamma,才能繼續(xù)分裂子樹(shù)。這個(gè)值也需要網(wǎng)格搜索尋找最優(yōu)值。
4)?subsample: 子采樣參數(shù),這個(gè)也是不放回抽樣,和sklearn GBDT的subsample作用一樣。選擇小于1的比例可以減少方差,即防止過(guò)擬合,但是會(huì)增加樣本擬合的偏差,因此取值不能太低。初期可以取值1,如果發(fā)現(xiàn)過(guò)擬合后可以網(wǎng)格搜索調(diào)參找一個(gè)相對(duì)小一些的值。
5)?colsample_bytree/colsample_bylevel/colsample_bynode: 這三個(gè)參數(shù)都是用于特征采樣的,默認(rèn)都是不做采樣,即使用所有的特征建立決策樹(shù)。colsample_bytree控制整棵樹(shù)的特征采樣比例,colsample_bylevel控制某一層的特征采樣比例,而colsample_bynode控制某一個(gè)樹(shù)節(jié)點(diǎn)的特征采樣比例。比如我們一共64個(gè)特征,則假設(shè)colsample_bytree,colsample_bylevel和colsample_bynode都是0.5,則某一個(gè)樹(shù)節(jié)點(diǎn)分裂時(shí)會(huì)隨機(jī)采樣8個(gè)特征來(lái)嘗試分裂子樹(shù)。
6)?reg_alpha/reg_lambda: 這2個(gè)是XGBoost的正則化參數(shù)。reg_alpha是L1正則化系數(shù),reg_lambda是L2正則化系數(shù),在原理篇里我們討論了XGBoost的正則化損失項(xiàng)部分:$$\Omega(h_t) = \gamma J + \frac{\lambda}{2}\sum\limits_{j=1}^Jw_{tj}^2$$
上面這些參數(shù)都是需要調(diào)參的,不過(guò)一般先調(diào)max_depth,min_child_weight和gamma。如果發(fā)現(xiàn)有過(guò)擬合的情況下,再嘗試調(diào)后面幾個(gè)參數(shù)。
3.3? XGBoost 其他參數(shù)
XGBoost還有一些其他的參數(shù)需要注意,主要是learning_rate。
learning_rate控制每個(gè)弱學(xué)習(xí)器的權(quán)重縮減系數(shù),和sklearn GBDT的learning_rate類似,較小的learning_rate意味著我們需要更多的弱學(xué)習(xí)器的迭代次數(shù)。通常我們用步長(zhǎng)和迭代最大次數(shù)一起來(lái)決定算法的擬合效果。所以這兩個(gè)參數(shù)n_estimators和learning_rate要一起調(diào)參才有效果。當(dāng)然也可以先固定一個(gè)learning_rate?,然后調(diào)完n_estimators,再調(diào)完其他所有參數(shù)后,最后再來(lái)調(diào)learning_rate和n_estimators。
此外,n_jobs控制算法的并發(fā)線程數(shù),?scale_pos_weight用于類別不平衡的時(shí)候,負(fù)例和正例的比例。類似于sklearn中的class_weight。importance_type則可以查詢各個(gè)特征的重要性程度。可以選擇“gain”, “weight”, “cover”, “total_gain” 或者 “total_cover”。最后可以通過(guò)調(diào)用booster的get_score方法獲取對(duì)應(yīng)的特征權(quán)重。“weight”通過(guò)特征被選中作為分裂特征的計(jì)數(shù)來(lái)計(jì)算重要性,“gain”和“total_gain”則通過(guò)分別計(jì)算特征被選中做分裂特征時(shí)帶來(lái)的平均增益和總增益來(lái)計(jì)算重要性。“cover”和 “total_cover”通過(guò)計(jì)算特征被選中做分裂時(shí)的平均樣本覆蓋度和總體樣本覆蓋度來(lái)來(lái)計(jì)算重要性。
4. XGBoost網(wǎng)格搜索調(diào)參
XGBoost可以和sklearn的網(wǎng)格搜索類GridSeachCV結(jié)合使用來(lái)調(diào)參,使用時(shí)和普通sklearn分類回歸算法沒(méi)有區(qū)別。具體的流程的一個(gè)示例如下:
gsCv =GridSearchCV(sklearn_model_new,
{'max_depth': [4,5,6],'n_estimators': [5,10,20]})
gsCv.fit(X_train,y_train)
print(gsCv.best_score_)print(gsCv.best_params_)
我這里的輸出是:
0.9533333333333334
{'max_depth': 4, 'n_estimators': 10}
接著嘗試在上面搜索的基礎(chǔ)上調(diào)learning_rate :
sklearn_model_new2 = xgb.XGBClassifier(max_depth=4,n_estimators=10,verbosity=1, objective='binary:logistic',random_state=1)
gsCv2=GridSearchCV(sklearn_model_new2,
{'learning_rate': [0.3,0.5,0.7]})
gsCv2.fit(X_train,y_train)
print(gsCv2.best_score_)print(gsCv2.best_params_)
我這里的輸出是:
0.9516
{'learning_rate ': 0.3}
當(dāng)然實(shí)際情況這里需要繼續(xù)調(diào)參,這里假設(shè)我們已經(jīng)調(diào)參完畢,我們嘗試用驗(yàn)證集看看效果:
sklearn_model_new2 = xgb.XGBClassifier(max_depth=4,learning_rate= 0.3, verbosity=1, objective='binary:logistic',n_estimators=10)
sklearn_model_new2.fit(X_train, y_train, early_stopping_rounds=10, eval_metric="error",
eval_set=[(X_test, y_test)])
最后的輸出是:
[9]validation_0-error:0.0588
也就是驗(yàn)證集的準(zhǔn)確率是94.12%。
我們可以通過(guò)驗(yàn)證集的準(zhǔn)確率來(lái)判斷我們前面網(wǎng)格搜索調(diào)參是否起到了效果。實(shí)際處理的時(shí)候需要反復(fù)搜索參數(shù)并驗(yàn)證。
以上就是XGBoost的類庫(kù)使用總結(jié)了,希望可以幫到要用XGBoost解決實(shí)際問(wèn)題的朋友們。
(歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處。歡迎溝通交流: liujianping-ok@163.com)
總結(jié)
以上是生活随笔為你收集整理的python xgboost用法_XGBoost类库使用小结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 现手是什么意思股票
- 下一篇: js localdate上一个月_mom