當前位置:股票大全官網 - 財經新聞 - 如何優化XGBoost模型的參數

如何優化XGBoost模型的參數

XGBoost參數調優完全指南(帶Python代碼)註:本文提供的代碼與運行結果之間存在壹些差異。您可以在這裏下載完整的代碼以供參考。另外,當我自己按照教程學習時,我發現我的庫無法分析字符串類型的特征,所以我只使用了其中的壹部分,並且具體值與文章中的值不同,這可以幫助我理解文章。因此您實際上可以稍微修改代碼,並且不必完全按照教程進行操作~ 0。

需要提前安裝的庫:

簡介

如果您的預測模型不太令人滿意,請使用XGBoost。XGBoost算法現在已經成為許多數據工程師的重要武器。它是壹種非常精細的算法,可以處理各種不規則數據。

使用XGBoost構建模型非常簡單。但是,很難提高該模型的性能(至少我感到非常糾結)。該算法使用幾個參數。因此,為了提高模型的性能,有必要對參數進行調整。在解決實際問題時,有些問題很難回答——需要調整哪些參數?這些參數應該調整到什麽值才能實現理想的輸出?

這篇文章最適合剛接觸XGBoost的人。在本文中,我們將學習參數調優的技巧以及壹些與XGboost相關的有用知識。並且,我們將使用Python在數據集上實踐該算法。

妳需要知道的是

XG boost(極限梯度增強)是梯度增強算法的優化版本。

特別感謝:我個人感謝蘇達萊·拉傑庫馬爾先生(又名SRK)的支持。目前,他在AV排行榜上排名第二。沒有他的幫助,就沒有這篇文章。在他的幫助下,我們可以指導無數數據科學家。給他壹個大大的贊!

內容列表

1和XGBoost的優勢

2.了解XGBoost的參數。

3.調整參數(包括示例)

1和XGBoost的優勢

XGBoost算法可以提高預測模型的能力。當我對它的性能和高精度背後的原理有了更多了解後,我發現它有很多優點:

1,正則化

標準GBM的實現沒有像XGBoost那樣的正則化步驟。正則化也有助於減少過擬合。事實上,XGBoost以其正則化的助推技術而聞名。

2.並行處理

XGBoost可以實現並行處理,比GBM更快。然而,眾所周知,Boosting算法是順序處理的。怎麽可能平行?每個課程樹的構建都依賴於前壹個樹,那麽到底是什麽允許我們用多核處理器構建壹個樹呢?我希望妳理解這句話的意思。?XGBoost還支持Hadoop實現。

3、高度的靈活性

XGBoost允許用戶定義自定義優化目標和評估標準?它為模型增加了壹個全新的維度,因此我們的加工不會受到限制。

4、缺失值處理

XGBoost具有處理缺失值的內置規則。用戶需要提供壹個不同於其他樣本的值,然後將其作為參數傳入以獲取缺少的值。XGBoost在不同節點遇到缺失值時采用不同的處理方法,並將在未來學習遇到缺失值時的處理方法。

5.修剪

GBM在拆分過程中遇到負損失時將停止拆分。所以GBM實際上是壹個貪婪的算法。XGBoost將分割到指定的最大深度(max_depth),然後返回並修剪。如果在壹個節點後沒有正值,它將移除拆分。當負損失(如-2)之後是正損失(如+10)時,這種方法的優勢就顯現出來了。GBM將在-2處停止,因為它遇到了負值。但是XGBoost會繼續拆分,然後發現這兩個拆分的組合會得到+8,所以這兩個拆分會被保留。

6.內置交叉驗證

XGBoost允許在每次提升叠代中使用交叉驗證。因此,可以方便地獲得最佳的提升叠代次數。然而,GBM使用網格搜索,只能檢測有限數量的值。

7.在現有模式的基礎上繼續。

XGBoost可以根據上壹輪的結果繼續訓練。這壹特性在某些特定應用中具有很大優勢。sklearn中GBM的實現也有這個功能,在這壹點上兩個算法是壹致的。

我相信您對XGBoost的強大功能有所了解。註意,這些是我自己的觀點。如果妳有更多的想法,請隨時在下面評論,我會更新這個列表!

2.XGBoost的參數

XGBoost的作者將所有參數分為三類:

1,通用參數:宏功能控制。

2.助推器參數:控制每壹步的助推器(樹/回歸)。

3.學習目標參數:控制培訓目標的績效。

這裏我將通過與GBM的類比來解釋它,因此作為壹個基礎知識。

常規參數

這些參數用於控制XGBoost的宏功能。

1,booster【默認gbtree】

選擇每次叠代的模型,有兩個選項:

Gbtree:基於樹的模型

Gbliner:線性模型

2.靜默【默認為0】

當該參數的值為1時,靜音模式打開,不會輸出任何信息。通常,該參數保持默認值0,因為它可以幫助我們更好地理解模型。

3.Nhread【默認值是可能的最大線程數】

該參數用於多線程控制,應輸入系統的核心數。如果您想使用所有的CPU內核,請不要輸入此參數,算法會自動檢測到它。

還有另外兩個參數,XGBoost會自動設置,所以目前您不必擔心它。接下來,讓我們看看助推器的參數。

升壓參數

雖然有兩種助推器可供選擇,但我在這裏只介紹樹型助推器,因為它的性能遠遠優於線性助推器,所以線性助推器很少使用。

1,eta【默認為0.3】

類似於GBM中的學習率參數。通過降低每壹步的權重,可以提高模型的魯棒性。典型值為0.01-0.2。

2.min_child_weight【默認值為1】

確定最小葉節點樣本權重和。它類似於GBM的min_child_leaf參數,但不完全相同。XGBoost的這個參數是最小樣本權重的總和,GBM參數是最小樣本數。該參數用於避免過度擬合。當其值較大時,可以避免模型學習局部特殊樣本。但如果該值過高,則會導致欠擬合。該參數需要通過CV進行調整。

3.max_depth【默認為6】

與GBM中的參數相同,該值是樹的最大深度。該值也用於避免過度擬合。max_depth越大,模型學習的特定和局部樣本就越多。您需要使用CV函數進行調諧。典型值:3-10

4、最大葉節點數

壹棵樹上節點或葉子的最大數量。它可以代替max_depth。因為如果生成二叉樹,最多生成壹棵深度為n的樹。

氮氣

壹片樹葉。如果定義了該參數,GBM將忽略max_depth參數。

5,伽瑪【默認值為0】

當節點被分割時,只有當分割後損失函數值減小時,節點才會被分割。Gamma指定節點分裂所需的最小損失函數下降。該參數的值越大,算法越保守。該參數的值與損失函數密切相關,因此需要進行調整。

6.最大增量步長【默認值為0】

此參數限制每次樹權重變化的最大步長。如果該參數的值為0,則意味著沒有約束。如果給它壹個正值,它將使算法更加保守。通常,不需要設置該參數。但是,當各種類別的樣本非常不平衡時,它對邏輯回歸非常有幫助。這個參數通常不被使用,但是妳可以把它挖掘出來以供更多的使用。

7.子樣本【默認1】

它與GBM中的子樣本參數完全相同。此參數控制每棵樹的隨機采樣比例。降低該參數的值將使算法更加保守,並避免過度擬合。但是,如果該值設置得太小,可能會導致擬合不足。典型值:0.5-1

8.colsample_bytree【默認值為1】

類似於GBM中的max_features參數。用於控制每棵樹隨機采樣列的比例(每列是壹個特征)。典型值:0.5-1

9.colsample_bylevel【默認值1】

用於控制樹的每個級別的每次拆分的列數的采樣率。我個人通常不使用該參數,因為subsample參數和colsample_bytree參數可以起到相同的作用。但是如果您感興趣,您會發現這個參數更有用。

10,lambda【默認為1】

L2正則化加權項。(類似嶺回歸)。該參數用於控制XGBoost的正則化部分。盡管大多數數據科學家很少使用該參數,但它仍可用於減少過擬合。

11,alpha【默認為1】

L1權正則項。(類似於套索回歸)。它可以應用在非常高的維數的情況下,使算法更快。

12,scale_pos_weight【默認為1】

當每個類別的樣本非常不平衡時,將此參數設置為正值可以使算法更快地收斂。

學習目標參數

該參數用於控制理想的優化目標和每壹步結果的測量方法。

1,目標【默認區域:線性】

該參數定義了需要最小化的損失函數。最常用的值是:

二元:邏輯二元邏輯回歸,返回預測概率(非類別)。Multi:softmax使用softmax的多分類器返回預測的類別(而不是概率)。

在這種情況下,您需要再設置壹個參數:num_class(類別數)。multi:softprob參數與multi:softmax參數相同,但它返回每個數據屬於每個類別的概率。

2.eval_metric【默認值取決於目標參數的值】

有效數據的測量方法。對於回歸問題,默認值為rmse,對於分類問題,默認值為error。典型值包括:

Rmse均方根誤差(

∑Ni=1?2N√

平均絕對誤差(

∑Ni=1|?|N

)logloss負對數似然函數值誤差二分類錯誤率(閾值為0.5)merror多分類錯誤率mlogloss多分類logloss函數auc曲線面積

3.種子(默認為0)

隨機數的種子設置可以再現隨機數據的結果,也可以用於調整參數。

如果您以前使用過Scikit-learn,您可能不熟悉這些參數。但好消息是python的XGBoost模塊有壹個sklearn包XGBClassifier。這個包中的參數以sklearn風格命名。將更改的函數名稱是:

1、eta-》;學習率

2、λ-& gt;reg _λ

3、阿爾法-》。註冊阿爾法

妳壹定想知道為什麽我們沒有在GBM中引入類似於‘n _ estimators’的參數。XGBClassifier確實有壹個類似的參數,但在標準XGBoost實現中調用fitting函數時,它作為“num_boosting_rounds”參數傳入。

調整參數(包括示例)

我對這些數據做了壹些處理:

城市變量,因為類別太多,所以有些類別被刪除了。DOB變量被轉換為年齡,壹些數據被刪除。添加了EMI_Loan_Submitted_Missing變量。如果EMI_Loan_Submitted變量的數據缺失,則該參數的值為1。否則為0。已刪除原始EMI_Loan_Submitted變量。EmployerName變量,因為類別太多,所以有些類別已被刪除。因為Existing_EMI變量僅缺少111個值,所以缺少的值用中間值0進行補充。添加了利率缺失變量。如果Interest_Rate變量的數據缺失,則該參數的值為1。否則為0。刪除了原始利率變量。Lead_Creation_Date已刪除,直觀上對最終結果沒有幫助。loan _ amount _ applied和loan _ duration _ applied的缺失項由中位數補充。添加了Loan_Amount_Submitted_Missing變量。如果Loan_Amount_Submitted變量的數據缺失,則該參數的值為1。否則為0。刪除了原始貸款金額提交變量。添加了Loan _ tension _ Submitted _ Missing變量。如果loan _ tenue _ submitted變量的數據缺失,則該參數的值為1。否則為0。刪除了原始Loan _ tension _ Submitted變量。刪除LoggedIn、Salary_Account並添加Processing_Fee_Missing變量。如果Processing_Fee變量的數據丟失,則該參數的值為1。否則為0。刪除了原始Processing_Fee變量。Source的前兩位保持不變,其他位分為不同的類別。進行量化和單次編碼(壹位有效編碼)。

如果您有原始數據,可以從資源庫下載data_preparation的Ipython notebook文件,然後自己完成這些步驟。

首先,導入必要的庫,然後加載數據。

#導入庫:

進口熊貓作為pd

將numpy作為np導入

將xgboost作為xgb導入

從xgboost.sklearn導入XGBClassifier

從sklearn導入cross_validation、metrics?#附加scklearn功能

從sklearn.grid_search導入GridSearchCV?#執行網格搜索

將matplotlib.pylab作為plt導入

%matplotlib內聯

從matplotlib.pylab導入rcParams

RC params【‘figure . fig size‘】= 12,4

train = PD . read _ CSV(‘train _ modified . CSV‘)

目標=“已支付”

ID col =‘ID‘

請註意,我導入了兩種XGBoost:

xgb-直接引用xgboost。接下來,我們將使用“cv”功能。xgb classifier-是xgboost的sklearn包。這個包允許我們像GBM壹樣使用網格搜索和並行處理。

在開始之前,我們定義壹個函數,它可以幫助我們構建XGBoost模型並進行交叉驗證。好消息是您可以直接使用以下功能,並且您以後也可以在自己的模型中使用它。

def模型擬合(alg,dtrain,predictors,useTrainCV=True,cv_folds=5,early_stopping_rounds=50):

如果使用TrainCV:

xgb_param = alg.get_xgb_params()

xgtrain = xgb。d矩陣。值,label = dtrain【target】。價值觀)

cv result = xgb . cv(xgb _ param,xgtrain,num _ boost _ round = alg . get _ params()【‘n _ estimates‘】,nfold=cv_folds,

metrics =‘AUC‘,early _ stopping _ rounds = early _ stopping _ rounds,show_progress=False)

alg . set _ params(n _ estimates = cv result . shape【0】)

#根據數據擬合算法

alg . fit(dt rain【預測值】,dt rain【‘已支付‘】,eval _ metric =‘AUC‘)

#預測訓練集:

dtrain _ predictions = alg . predict(dtrain【預測值】)

dt rain _ pred prob = alg . predict _ proba(dt rain【預測值】)【:,1】

#打印模型報告:

打印“\ n模型報告”

print“Accuracy:%。4g“% metrics。Accuracy _ score(dtrain【‘disapped‘】。值,dtrain_predictions)

打印“AUC得分(訓練):% f“% metrics . roc _ AUC _ Score(dt rain【‘disapped‘】,dtrain_predprob)

feat_imp = pd。系列(alg.booster)。get_fscore())。sort_values(升序=False)

feat _ imp . plot(kind =‘bar‘,title =‘Feature Importances‘)

plt.ylabel(“特征重要性分數”)

該函數與GBM中使用的函數略有不同。然而,本文的重點是解釋重要的概念,而不是編寫代碼。如果妳有什麽不明白的地方,請在下面評論,沒有壓力。註意,xgboost的sklearn包沒有“feature_importance”的度量,但get_fscore()函數具有相同的功能。

參數調整的壹般方法。

我們將使用類似於GBM中的方法。需要執行以下步驟:

1.選擇較高的學習率。壹般來說,學習率的值為0.1。但是,對於不同的問題,理想的學習率有時會在0.05到0.3之間波動。選擇與該學習率相對應的理想決策樹的數量。XGBoost有壹個非常有用的函數“cv”,它可以在每次叠代中使用交叉驗證並返回理想的決策樹數量。

2.對於給定的學習速率和決策樹的數量,決策樹特定參數被優化(max _ depth、min _ child _ weight、gamma、子樣本、colsample _ by tree)。在確定壹棵樹的過程中,我們可以選擇不同的參數,後面我會舉壹個例子。

3.XG Boost正則化參數的優化。(λ,α)。這些參數可以降低模型的復雜度,從而提高模型的性能。

4.降低學習速率,確定理想參數。

讓我們壹步壹步詳細地進行這些操作。

步驟1:確定學習速率和用於調整基於樹的參數的估計器的數量。

為了確定升壓參數,我們應該首先給其他參數壹個初始值。讓我們取值如下:

1,max_depth = 5:該參數的值最好在3-10之間。我選擇的起始值為5,但您也可以選擇其他值。起始值為4-6是壹個不錯的選擇。

2.min_child_weight = 1:這裏選擇了壹個相對較小的值,因為這是壹個極不平衡的分類問題。因此,某些葉節點下的值會更小。

3.gamma = 0:起始值也可以從其他較小的值中選擇,範圍從0.1到0.2。稍後也將調整該參數。

4.subsample,colsample_bytree = 0.8:這是最常見的初始值。典型值範圍從0.5到0.9。

5.scale_pos_weight = 1:這個值是因為類別非常不平衡。

請註意,上面這些參數的值只是初步估計值,需要在以後進行調整。這裏,學習率被設置為默認值0.1。然後使用xgboost中的cv函數來確定決策樹的最佳數量。前壹篇文章中的函數可以完成這項工作。

#選擇除target & amp伊德科爾斯

預測值=【x for x in train . columns if x not in【target,IDcol】】

xgb1 = XGBClassifier(

learning_rate =0.1,

n_estimators=1000,

max_depth=5,

min_child_weight=1,

伽馬=0,

子樣本=0.8,

colsample_bytree=0.8,

objective =‘binary:logistics‘,

nthread=4,

scale_pos_weight=1,

種子=27)

模型擬合(xgb1,訓練,預測值)

從輸出結果可以看出,當學習率為0.1時,決策樹的理想數量為140。這個數字對您來說可能很高,但它也取決於您的系統的性能。

註意:在AUC(測試)中,可以看到測試集的AUC值。但是如果您在自己的系統上運行這些命令,則不會出現該值。因為數據不公開。此處提供的值僅供參考。生成此值的代碼部分已被刪除。& lt??“/KF/ware/VC/“target =“_ blank“class =“key link“& gt;vcd 4 ncjvymxvy 2 tx dw 90 ZT 4 ncjxomsbpzd 0 =“Step 2-max depth-and-min weight-Parameter Tuning“》Step 2:調整max_depth和min_weight參數。

我們首先調整這兩個參數,因為它們對最終結果有很大影響。首先,我們在大範圍內粗略調整參數,然後在小範圍內進行微調。

註意:在本節中,我將進行高負載網格搜索,這將花費大約15-30分鐘甚至更長時間,具體取決於您的系統性能。您還可以根據系統的性能選擇不同的值。

param_test1 = {

max _ depth:範圍(3,10,2),

“min_child_weight”:範圍(1,6,2)

}

gsearch 1 = GridSearchCV(estimator = xgb classifier(learning _ rate = 0.1,n_estimators=140,max_depth=5,

min_child_weight=1,gamma=0,子樣本=0.8,colsample_bytree=0.8,

objective =‘binary:logistic‘,nthread=4,scale_pos_weight=1,seed=27),

param_grid = param_test1,scoring =‘roc _ AUC‘,n_jobs=4,iid=False,cv=5)

gsearch1.fit(訓練【預測值】,訓練【目標】)

gsearch1.grid_scores_,gsearch1.best_params_,gsearch1.best_score_