需要提前安裝的庫:
簡介
如果您的預測模型不太令人滿意,請使用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_