XGBoost引數調優
摘要:
轉載:http://blog.csdn.NET/han_xiaoyang/article/details/52665396
1. 簡介
如果你的預測模型表現得有些不盡如人意,那就用XGBoost吧。XGBoost演算法現在已經成為很多資料工程師的重要武器。它是一種十分精緻的演算法,可以處理各種不規則的資料。
構造一個使用XGBoost的模型十分簡單。但是,提高這個模型的表現就有些困難(至少我覺得十分糾結)。這個演算法使用了好幾個引數。所以為了提高模型的表現,引數的調整十分必要。在解決實際問題的時候,有些問題是很難回答的——你需要調整哪些引數?這些引數要調到什麼值,才能達到理想的輸出?
這篇文章最適合剛剛接觸XGBoost的人閱讀。在這篇文章中,我們會學到引數調優的技巧,以及XGboost相關的一些有用的知識。以及,我們會用
2. 你需要知道的
XGBoost(eXtreme Gradient Boosting)是Gradient Boosting演算法的一個優化的版本。因為我在前一篇文章,基於Python的Gradient Boosting演算法引數調整完全指南,裡面已經涵蓋了Gradient Boosting演算法的很多細節了。我強烈建議大家在讀本篇文章之前,把那篇文章好好讀一遍。它會幫助你對Boosting演算法有一個巨集觀的理解,同時也會對GBM的引數調整有更好的體會。
特別鳴謝:我個人十分感謝Mr Sudalai Rajkumar (aka SRK)大神的支援,目前他在AV Rank中位列第二。如果沒有他的幫助,就沒有這篇文章。在他的幫助下,我們才能給無數的資料科學家指點迷津。給他一個大大的贊!
3. 內容列表
1、XGBoost的優勢
2、理解XGBoost的引數
3、調參示例
4. XGBoost的優勢
XGBoost演算法可以給預測模型帶來能力的提升。當我對它的表現有更多瞭解的時候,當我對它的高準確率背後的原理有更多瞭解的時候,我發現它具有很多優勢:
4.1 正則化
- 標準GBM的實現沒有像XGBoost這樣的正則化步驟。正則化對減少過擬合也是有幫助的。
- 實際上,XGBoost以“正則化提升(regularized boosting)”技術而聞名。
4.2 並行處理
- XGBoost可以實現並行處理,相比GBM有了速度的飛躍。
- 不過,眾所周知,Boosting演算法是順序處理的,它怎麼可能並行呢?每一課樹的構造都依賴於前一棵樹,那具體是什麼讓我們能用多核處理器去構造一個樹呢?我希望你理解了這句話的意思。如果你希望瞭解更多,點選這個
- XGBoost 也支援Hadoop實現。
4.3 高度的靈活性
- XGBoost 允許使用者定義自定義優化目標和評價標準
- 它對模型增加了一個全新的維度,所以我們的處理不會受到任何限制。
4.4 缺失值處理
- XGBoost內建處理缺失值的規則。
- 使用者需要提供一個和其它樣本不同的值,然後把它作為一個引數傳進去,以此來作為缺失值的取值。XGBoost在不同節點遇到缺失值時採用不同的處理方法,並且會學習未來遇到缺失值時的處理方法。
4.5 剪枝
- 當分裂時遇到一個負損失時,GBM會停止分裂。因此GBM實際上是一個貪心演算法。
- XGBoost會一直分裂到指定的最大深度(max_depth),然後回過頭來剪枝。如果某個節點之後不再有正值,它會去除這個分裂。
- 這種做法的優點,當一個負損失(如-2)後面有個正損失(如+10)的時候,就顯現出來了。GBM會在-2處停下來,因為它遇到了一個負值。但是XGBoost會繼續分裂,然後發現這兩個分裂綜合起來會得到+8,因此會保留這兩個分裂。
4.6 內建交叉驗證
- XGBoost允許在每一輪boosting迭代中使用交叉驗證。因此,可以方便地獲得最優boosting迭代次數。
- 而GBM使用網格搜尋,只能檢測有限個值。
4.7、在已有的模型基礎上繼續
- XGBoost可以在上一輪的結果上繼續訓練。這個特性在某些特定的應用上是一個巨大的優勢。
- sklearn中的GBM的實現也有這個功能,兩種演算法在這一點上是一致的。
相信你已經對XGBoost強大的功能有了點概念。注意這是我自己總結出來的幾點,你如果有更多的想法,儘管在下面評論指出,我會更新這個列表的!
5. XGBoost的引數
XGBoost的作者把所有的引數分成了三類:
- 通用引數:巨集觀函式控制。
- Booster引數:控制每一步的booster(tree/regression)。
- 學習目標引數:控制訓練目標的表現。
在這裡我會類比GBM來講解,所以作為一種基礎知識,強烈推薦先閱讀這篇文章。
5.1 通用引數
這些引數用來控制XGBoost的巨集觀功能。
1、booster[預設gbtree]
- 選擇每次迭代的模型,有兩種選擇:
gbtree:基於樹的模型
gbliner:線性模型
2、silent[預設0]
- 當這個引數值為1時,靜默模式開啟,不會輸出任何資訊。
- 一般這個引數就保持預設的0,因為這樣能幫我們更好地理解模型。
3、nthread[預設值為最大可能的執行緒數]
- 這個引數用來進行多執行緒控制,應當輸入系統的核數。
- 如果你希望使用CPU全部的核,那就不要輸入這個引數,演算法會自動檢測它。
還有兩個引數,XGBoost會自動設定,目前你不用管它。接下來咱們一起看booster引數。
5.2 booster引數
儘管有兩種booster可供選擇,我這裡只介紹tree booster,因為它的表現遠遠勝過linear booster,所以linear booster很少用到。
1、eta[預設0.3]
- 和GBM中的 learning rate 引數類似。
- 通過減少每一步的權重,可以提高模型的魯棒性。
- 典型值為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_leaf_nodes
- 樹上最大的節點或葉子的數量。
- 可以替代max_depth的作用。因為如果生成的是二叉樹,一個深度為n的樹最多生成n2個葉子。
- 如果定義了這個引數,GBM會忽略max_depth引數。
5、gamma[預設0]
- 在節點分裂時,只有分裂後損失函式的值下降了,才會分裂這個節點。Gamma指定了節點分裂所需的最小損失函式下降值。
- 這個引數的值越大,演算法越保守。這個引數的值和損失函式息息相關,所以是需要調整的。
6、max_delta_step[預設0]
- 這引數限制每棵樹權重改變的最大步長。如果這個引數的值為0,那就意味著沒有約束。如果它被賦予了某個正值,那麼它會讓這個演算法更加保守。
- 通常,這個引數不需要設定。但是當各類別的樣本十分不平衡時,它對邏輯迴歸是很有幫助的。
- 這個引數一般用不到,但是你可以挖掘出來它更多的用處。
7、subsample[預設1]
- 和GBM中的subsample引數一模一樣。這個引數控制對於每棵樹,隨機取樣的比例。
- 減小這個引數的值,演算法會更加保守,避免過擬合。但是,如果這個值設定得過小,它可能會導致欠擬合。
- 典型值:0.5-1
8、colsample_bytree[預設1]
- 和GBM裡面的max_features引數類似。用來控制每棵隨機取樣的列數的佔比(每一列是一個特徵)。
- 典型值:0.5-1
9、colsample_bylevel[預設1]
- 用來控制樹的每一級的每一次分裂,對列數的取樣的佔比。
- 我個人一般不太用這個引數,因為subsample引數和colsample_bytree引數可以起到相同的作用。但是如果感興趣,可以挖掘這個引數更多的用處。
10、lambda[預設1]
- 權重的L2正則化項。(和Ridge regression類似)。
- 這個引數是用來控制XGBoost的正則化部分的。雖然大部分資料科學家很少用到這個引數,但是這個引數在減少過擬合上還是可以挖掘出更多用處的。
11、alpha[預設1]
- 權重的L1正則化項。(和Lasso regression類似)。
- 可以應用在很高維度的情況下,使得演算法的速度更快。
12、scale_pos_weight[預設1]
- 在各類別樣本十分不平衡時,把這個引數設定為一個正值,可以使演算法更快收斂。
5.3學習目標引數
這個引數用來控制理想的優化目標和每一步結果的度量方法。
1、objective[預設reg:linear]
- 這個引數定義需要被最小化的損失函式。最常用的值有:
- binary:logistic 二分類的邏輯迴歸,返回預測的概率(不是類別)。
- multi:softmax 使用softmax的多分類器,返回預測的類別(不是概率)。
- 在這種情況下,你還需要多設一個引數:num_class(類別數目)。
- multi:softprob 和multi:softmax引數一樣,但是返回的是每個資料屬於各個類別的概率。
2、eval_metric[預設值取決於objective引數的取值]
- 對於有效資料的度量方法。
- 對於迴歸問題,預設值是rmse,對於分類問題,預設值是error。
- 典型值有:
- rmse 均方根誤差(∑Ni=1ϵ2N−−−−−√)
- mae 平均絕對誤差(∑Ni=1|ϵ|N)
- logloss 負對數似然函式值
- error 二分類錯誤率(閾值為0.5)
- merror 多分類錯誤率
- mlogloss 多分類logloss損失函式
- auc 曲線下面積
3、seed(預設0)
- 隨機數的種子
- 設定它可以復現隨機資料的結果,也可以用於調整引數
如果你之前用的是Scikit-learn,你可能不太熟悉這些引數。但是有個好訊息,Python的XGBoost模組有一個sklearn包,XGBClassifier。這個包中的引數是按sklearn風格命名的。會改變的函式名是:
1、eta -> learning_rate
2、lambda -> reg_lambda
3、alpha -> reg_alpha
你肯定在疑惑為啥咱們沒有介紹和GBM中的n_estimators
類似的引數。XGBClassifier中確實有一個類似的引數,但是,是在標準XGBoost實現中呼叫擬合函式時,把它作為num_boosting_rounds
引數傳入。
XGBoost Guide 的一些部分是我強烈推薦大家閱讀的,通過它可以對程式碼和引數有一個更好的瞭解:
調參示例
我們從Data Hackathon 3.x AV版的hackathon中獲得資料集,和GBM 介紹文章中是一樣的。更多的細節可以參考competition page
資料集可以從這裡下載。我已經對這些資料進行了一些處理:
City
變數,因為類別太多,所以刪掉了一些類別。DOB
變數換算成年齡,並刪除了一些資料。- 增加了
EMI_Loan_Submitted_Missing
變數。如果EMI_Loan_Submitted
變數的資料缺失,則這個引數的值為1。否則為0。刪除了原先的EMI_Loan_Submitted
變數。 EmployerName
變數,因為類別太多,所以刪掉了一些類別。- 因為
Existing_EMI
變數只有111個值缺失,所以缺失值補充為中位數0。 - 增加了
Interest_Rate_Missing
變數。如果Interest_Rate
變數的資料缺失,則這個引數的值為1。否則為0。刪除了原先的Interest_Rate
變數。 - 刪除了
Lead_Creation_Date
,從直覺上這個特徵就對最終結果沒什麼幫助。 Loan_Amount_Applied, Loan_Tenure_Applied
兩個變數的缺項用中位數補足。- 增加了
Loan_Amount_Submitted_Missing
變數。如果Loan_Amount_Submitted
變數的資料缺失,則這個引數的值為1。否則為0。刪除了原先的Loan_Amount_Submitted
變數。 - 增加了
Loan_Tenure_Submitted_Missing
變數。如果Loan_Tenure_Submitted
變數的資料缺失,則這個引數的值為1。否則為0。刪除了原先的Loan_Tenure_Submitted
變數。 - 刪除了
LoggedIn
,Salary_Account
兩個變數 - 增加了
Processing_Fee_Missing
變數。如果Processing_Fee
變數的資料缺失,則這個引數的值為1。否則為0。刪除了原先的Processing_Fee
變數。 Source
前兩位不變,其它分成不同的類別。- 進行了離散化和獨熱編碼(一位有效編碼)。
如果你有原始資料,可以從資源庫裡面下載data_preparation
的Ipython notebook
檔案,然後自己過一遍這些步驟。
載入必要庫:
- import pandas as pd
- import numpy as np
- import xgboost as xgb
- from xgboost.sklearn import XGBClassifier
- from sklearn.model_selection import GridSearchCV,cross_val_score
- from sklearn import metrics
- import matplotlib.pylab as plt
讀取檔案
- train_df = pd.read_csv('train_modified.csv')
- train_y = train_df.pop('Disbursed').values
- test_df = pd.read_csv('test_modified.csv')
- train_df.drop('ID',axis=1,inplace=True)
- test_df.drop('ID',axis=1,inplace=True)
- train_X = train_df.values
然後評分函式未下:
- def modelMetrics(clf,train_x,train_y,isCv=True,cv_folds=5,early_stopping_rounds=50):
- if isCv:
- xgb_param = clf.get_xgb_params()
- xgtrain = xgb.DMatrix(train_x,label=train_y)
- cvresult = xgb.cv(xgb_param,xgtrain,num_boost_round=clf.get_params()['n_estimators'],nfold=cv_folds,
- metrics='auc',early_stopping_rounds=early_stopping_rounds)#是否顯示目前幾顆樹額
- clf.set_params(n_estimators=cvresult.shape[0])
- clf.fit(train_x,train_y,eval_metric='auc')
- #預測
- train_predictions = clf.predict(train_x)
- train_predprob = clf.predict_proba(train_x)[:,1]#1的概率
- #列印
- print("\nModel Report")
- print("Accuracy : %.4g" % metrics.accuracy_score(train_y, train_predictions))
- print("AUC Score (Train): %f" % metrics.roc_auc_score(train_y, train_predprob))
- feat_imp = pd.Series(clf.booster().get_fscore()).sort_values(ascending=False)
- feat_imp.plot(kind='bar',title='Feature importance')
- plt.ylabel('Feature Importance Score')
我們測試下:
Model Report Accuracy : 0.9854 AUC Score (Train): 0.851058
我們看下其中具體的cv結果
cvresult.shape[0]是其中我們用的樹的個數
cvresult的結果是一個DataFrame
6.1 引數調優的一般方法
我們會使用和GBM中相似的方法。需要進行如下步驟:
-
選擇較高的學習速率(learning rate)。一般情況下,學習速率的值為0.1。但是,對於不同的問題,理想的學習速率有時候會在0.05到0.3之間波動。選擇對應於此學習速率的理想決策樹數量。XGBoost有一個很有用的函式“cv”,這個函式可以在每一次迭代中使用交叉驗證,並返回理想的決策樹數量。
-
對於給定的學習速率和決策樹數量,進行決策樹特定引數調優(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在確定一棵樹的過程中,我們可以選擇不同的引數,待會兒我會舉例說明。
-
xgboost的正則化引數的調優。(lambda, alpha)。這些引數可以降低模型的複雜度,從而提高模型的表現。
-
降低學習速率,確定理想引數。
第一步:確定學習速率和tree_based 引數調優的估計器數目
為了確定boosting
引數,我們要先給其它引數一個初始值。咱們先按如下方法取值:
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函式來確定最佳的決策樹數量。前文中的函式可以完成這個工作。
- def tun_parameters(train_x,train_y):
- xgb1 = XGBClassifier(learning_rate=0.1,n_estimators=1000,max_depth=5,min_child_weight=1,gamma=0,subsample=0.8,
- colsample_bytree=0.8,objective= 'binary:logistic',nthread=4,scale_pos_weight=1,seed=27)
- modelMetrics(xgb1,train_x,train_y)
然後我們得到如下的結果:
是根據交叉驗證中迭代中
n_estimators: 112 Model Report Accuracy : 0.9854 AUC Score (Train): 0.891681
每一次迭代中使用交叉驗證,並返回理想的決策樹數量。這個值取決於系統的效能。
第二步: max_depth 和 min_child_weight 引數調優
- param_test1 = {
- 'max_depth':range(3,10,2),
- 'min_child_weight':range(1,6,2)
- }
- gsearch1 = GridSearchCV(estimator=XGBClassifier( learning_rate =0.1, n_estimators=140, max_depth=5,
- min_child_weight=1, gamma=0, subsample=0.8,colsample_bytree=0.8,
- objective= 'binary:logistic', nthread=4,scale_pos_weight=1, seed=27),
- param_grid=param_test1,scoring='roc_auc',iid=False,cv=5)
- gsearch1.fit(train_X,train_y)
- gsearch1.grid_scores_,gsearch1.best_params_,gsearch1.best_score_
我們看見min_child_weight已經在邊界處了所以我們還可以繼續調整,也可以在下個引數一起調節
我們得到max_depth的理想取值為4,min_child_weight的理想取值為6。同時,我們還能看到cv的得分有了小小一點提高。需要注意的一點是,隨著模型表現的提升,進一步提升的難度是指數級上升的,尤其是你的表現已經接近完美的時候。
我們能夠進一步看是否6比較好,
- param_test2b = {
- 'min_child_weight': [6, 8, 10, 12]
- }
- gsearch2b = GridSearchCV(estimator=XGBClassifier(learning_rate=0.1, n_estimators=140, max_depth=4,
- min_child_weight=2, gamma=0, subsample=0.8, colsample_bytree=0.8,
- objective='binary:logistic', nthread=4, scale_pos_weight=1,
- seed=27), param_grid=param_test2b, scoring='roc_auc', n_jobs=4,
- iid=False, cv=5)
- gsearch2b.fit(train_x, train_y)
- gsearch2b.grid_scores_, gsearch2b.best_params_, gsearch2b.best_score_
- modelMetrics(gsearch2b, train_x, train_y)
6確實是最佳的值了,不用再調節了。
然後我們擬合一下看下模型評分:
n_estimators: 140 Model Report Accuracy : 0.9854 AUC Score (Train): 0.875086
第三步:gamma引數調優
在已經調整好其它引數的基礎上,我們可以進行gamma引數的調優了。Gamma引數取值範圍可以很大,我這裡把取值範圍設定為5了。你其實也可以取更精確的gamma值。
- param_test3 = {
- 'gamma': [i / 10.0 for i in range(0, 5)]
- }
- gsearch3 = GridSearchCV(
- estimator=XGBClassifier(learning_rate=0.1, n_estimators=140, max_depth=4, min_child_weight=6, gamma=0,
- subsample=0.8, colsample_bytree=0.8, objective='binary:logistic', nthread=4,
- scale_pos_weight=1, seed=27), param_grid=param_test3, scoring='roc_auc', n_jobs=4,
- iid=False, cv=5)
- gsearch3.fit(train_x,train_y)
- gsearch3.grid_scores_, gsearch3.best_params_, gsearch3.best_score_
從這裡,可以看出,得分提高了。所以,最終得到的引數是:
xgb2 = XGBClassifier(
learning_rate =0.1,
n_estimators=1000,
max_depth=4,
min_child_weight=6,
gamma=0,
subsample=0.8,
colsample_bytree=0.8,
objective= 'binary:logistic',
nthread=4,
scale_pos_weight=1,
seed=27)
modelfit(xgb2, train, predictors)
第四步:調整subsample 和 colsample_bytree 引數
這兩個引數相當於每個樹的樣本和引數個數
- param_test4 = {
- 'subsample': [i / 10.0 for i in range(6, 10)],
- 'colsample_bytree': [i / 10.0 for i in range(6, 10)]
- }
- gsearch4 = GridSearchCV(
- estimator=XGBClassifier(learning_rate=0.1, n_estimators=177, max_depth=3, min_child_weight=4, gamma=0.1,
- subsample=0.8, colsample_bytree=0.8, objective='binary:logistic', nthread=4,
- scale_pos_weight=1, seed=27), param_grid=param_test4, scoring='roc_auc', n_jobs=4,
- iid=False, cv=5)
- gsearch4.fit(train_x, train_y)
- gsearch4.grid_scores_, gsearch4.best_params_, gsearch4.best_score_
([mean: 0.83836, std: 0.00840, params: {'subsample': 0.6, 'colsample_bytree': 0.6}, mean: 0.83720, std: 0.00976, params: {'subsample': 0.7, 'colsample_bytree': 0.6}, mean: 0.83787, std: 0.00758, params: {'subsample': 0.8, 'colsample_bytree': 0.6}, mean: 0.83776, std: 0.00762, params: {'subsample': 0.9, 'colsample_bytree': 0.6}, mean: 0.83923, std: 0.01005, params: {'subsample': 0.6, 'colsample_bytree': 0.7}, mean: 0.83800, std: 0.00853, params: {'subsample': 0.7, 'colsample_bytree': 0.7}, mean: 0.83819, std: 0.00779, params: {'subsample': 0.8, 'colsample_bytree': 0.7}, mean: 0.83925, std: 0.00906, params: {'subsample': 0.9, 'colsample_bytree': 0.7}, mean: 0.83977, std: 0.00831, params: {'subsample': 0.6, 'colsample_bytree': 0.8}, mean: 0.83867, std: 0.00870, params: {'subsample': 0.7, 'colsample_bytree': 0.8}, mean: 0.83879, std: 0.00797, params: {'subsample': 0.8, 'colsample_bytree': 0.8}, mean: 0.84144, std: 0.00854, params: {'subsample': 0.9, 'colsample_bytree': 0.8}, mean: 0.83878, std: 0.00760, params: {'subsample': 0.6, 'colsample_bytree': 0.9}, mean: 0.83922, std: 0.00823, params: {'subsample': 0.7, 'colsample_bytree': 0.9}, mean: 0.83912, std: 0.00765, params: {'subsample': 0.8, 'colsample_bytree': 0.9}, mean: 0.83926, std: 0.00843, params: {'subsample': 0.9, 'colsample_bytree': 0.9}], {'colsample_bytree': 0.8, 'subsample': 0.9}, 0.84143722014693034)
若我們再將精度增加的話,我們將步長調節到0.05
我們得到的理想取值還是原來的值。因此,最終的理想取值是:
- subsample: 0.8
- colsample_bytree: 0.8
第五步:正則化引數調優
下一步是應用正則化來降低過擬合。由於gamma函式提供了一種更加有效地降低過擬合的方法,大部分人很少會用到這個引數。但是我們在這裡也可以嘗試用一下這個引數。
- param_test6 = {
- 'reg_alpha':[1e-5, 1e-2, 0.1, 1, 100]
- }
- gsearch6 = GridSearchCV(estimator = XGBClassifier( learning_rate =0.1, n_estimators=177, max_depth=4, min_child_weight=6, gamma=0.1, subsample=0.8, colsample_bytree=0.8, objective= 'binary:logistic', nthread=4, scale_pos_weight=1,seed=27), param_grid = param_test6, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
- gsearch6.fit(train_X, train_y)
- gsearch6.grid_scores_, gsearch6.best_params_, gsearch6.best_score_
([mean: 0.83949, std: 0.00720, params: {'reg_alpha': 1e-05}, mean: 0.83940, std: 0.00607, params: {'reg_alpha': 0.01}, mean: 0.84005, std: 0.00638, params: {'reg_alpha': 0.1}, mean: 0.84062, std: 0.00775, params: {'reg_alpha': 1}, mean: 0.81217, std: 0.01559, params: {'reg_alpha': 100}], {'reg_alpha': 1}, 0.84062434371797357)
相比之前的結果,CV的得分甚至還降低了。但是我們之前使用的取值是十分粗糙的,我們在這裡選取一個比較靠近理想值(0.01)的取值,來看看是否有更好的表現。
- param_test7 = {
- 'reg_alpha': [0, 0.001, 0.005, 0.01, 0.05]
- }
- gsearch7 = GridSearchCV(
- estimator=XGBClassifier(learning_rate=0.1, n_estimators=177, max_depth=4, min_child_weight=6, gamma=0.1,
- subsample=0.8, colsample_bytree=0.8, objective='binary:logistic', nthread=4,
- scale_pos_weight=1, seed=27), param_grid=param_test7, scoring='roc_auc', n_jobs=4,
- iid=False, cv=5)
- gsearch7.fit(train_x, train_y)
- gsearch7.grid_scores_, gsearch7.best_params_, gsearch7.best_score_
調整精度以後
CV的得分提高了。現在,我們在模型中來使用正則化引數,來看看這個引數的影響。
xgb3 = XGBClassifier(
learning_rate =0.1,
n_estimators=1000,
max_depth=4,
min_child_weight=6,
gamma=0,
subsample=0.8,
colsample_bytree=0.8,
reg_alpha=0.005,
objective= 'binary:logistic',
nthread=4,
scale_pos_weight=1,
seed=27)
現在我們可以來看下reg_lambda引數調節:
([mean: 0.83996, std: 0.00597, params: {'reg_lambda': 1e-05}, mean: 0.84030, std: 0.00580, params: {'reg_lambda': 0.01}, mean: 0.83965, std: 0.00574, params: {'reg_lambda': 0.1}, mean: 0.84035, std: 0.00622, params: {'reg_lambda': 1}, mean: 0.83601, std: 0.00944, params: {'reg_lambda': 100}], {'reg_lambda': 1}, 0.84035395025572046)
- param_test8 = {
- 'reg_lambda': [1e-5, 1e-2, 0.1, 1, 100]
- }
- gsearch8 = GridSearchCV(
- estimator=XGBClassifier(learning_rate =0.1, n_estimators=177,max_depth=4,min_child_weight=6, gamma=0, subsample=0.8, colsample_bytree=0.8, reg_alpha=0.005,
- objective= 'binary:logistic',nthread=4, scale_pos_weight=1,seed=27), param_grid=param_test8, scoring='roc_auc', n_jobs=4,
- iid=False, cv=5)
- gsearch8.fit(train_X, train_y)
- gsearch8.grid_scores_, gsearch8.best_params_, gsearch8.best_score_
第6步:降低學習速率
最後,我們使用較低的學習速率,以及使用更多的決策樹。我們可以用XGBoost中的CV函式來進行這一步工作。
xgb4 = XGBClassifier( learning_rate =0.01, n_estimators=5000, max_depth=4, min_child_weight=6, gamma=0, subsample=0.8, colsample_bytree=0.8, reg_alpha=0.005, objective= 'binary:logistic', nthread=4, scale_pos_weight=1, seed=27)
我們看下最後的模型評分
至此,你可以看到模型的表現有了大幅提升,調整每個引數帶來的影響也更加清楚了。
在文章的末尾,我想分享兩個重要的思想:
1、僅僅靠引數的調整和模型的小幅優化,想要讓模型的表現有個大幅度提升是不可能的。GBM的最高得分是0.8487,XGBoost的最高得分是0.8494。確實是有一定的提升,但是沒有達到質的飛躍。
2、要想讓模型的表現有一個質的飛躍,需要依靠其他的手段,諸如,特徵工程(feature egineering) ,模型組合(ensemble of model),以及堆疊(stacking)等。
相關推薦
XGBoost引數調優完全指南碰到的小問題
其中有三個地方需要注意一下 首先是要對資料進行預處理 # -*- coding: utf-8 -*- """ Created on Wed Sep 19 14:16:42 2018 @author: Administrator """ #--*- coding:u
(轉)XGBoost引數調優完全指南
原文(英文)地址:https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/ 原文(翻譯)地址:https://www.2cto.com/kf/
XGBoost引數調優完全指南(附Python程式碼)
1. 簡介 如果你的預測模型表現得有些不盡如人意,那就用XGBoost吧。XGBoost演算法現在已經成為很多資料工程師的重要武器。它是一種十分精緻的演算法,可以處理各種不規則的資料。 構造一個使用XGBoost的模型十分簡單。但是,提高這個模型的表現就有些困難(至少
XGBoost引數調優
摘要: 轉載:http://blog.csdn.NET/han_xiaoyang/article/details/52665396 1. 簡介 如果你的預測模型表現得有些不盡如人意,那就用XGBoost吧。XGBoost演算法現在已經成為很多資料工程師的重要武器。它是一種十分精緻的演算法,可以處理各種
XGBoost模型的引數調優
XGBoost演算法在實際執行的過程中,可以通過以下要點進行引數調優: (1)新增正則項: 在模型引數中新增正則項,或加大正則項的懲罰力度,即通過調整加權引數,從而避免模型出現過擬合的情況。 (2)控制決策樹的層數: 通過葉子結點數目控制決策樹的層數,視乎樣本量大小決定,對於10萬以下 的樣
XGboost模型的優勢--引數作用--引數調優
最近接觸xgboost,但是對於這個模型框架我也是一知半解,每次用的時候,都是百度各種調參方法,因為用的是scala spark,各種配置檔案,不能對這個xgboost進行網格引數優化,因此只能手調引數,這是一個時間週期很長的事情。每次引數的作用啥的也記不住,這對我的工作產生
貝葉斯優化: 一種更好的超引數調優方式
簡介 本文受 淺析 Hinton 最近提出的 Capsule 計劃 啟發,希望以更通俗的方式推廣機器學習演算法,讓有數學基礎和程式設計能力的人能夠樂享其中。 目前人工智慧和深度學習越趨普及,大家可以使用開源的Scikit-learn、TensorFlow來實現機器學習模型,甚至參加Kaggl
Python sklearn包的使用示例以及引數調優示例
coding=utf-8 !/usr/bin/env python ””’ 【說明】 1.當前sklearn版本0.18 2.sklearn自帶的鳶尾花資料集樣例: (1)樣本特徵矩陣(型別:numpy.ndarray) [[ 6.7 3. 5.2 2.3] [ 6.3
Spark應用程式開發引數調優深入剖析-Spark商業調優實戰
本套系列部落格從真實商業環境抽取案例進行總結和分享,並給出Spark商業應用實戰指導,請持續關注本套部落格。版權宣告:本套Spark商業應用實戰歸作者(秦凱新)所有,禁止轉載,歡迎學習。 Spark商業應用實戰-Spark資料傾斜案例測試及調優準則深入剖析 Spark商業應用實戰-Spark資源
JAVA JVM引數調優、以及回收器
[轉]JVM系列三:JVM引數設定、分析 不管是YGC還是Full GC,GC過程中都會對導致程式執行中中斷,正確的選擇不同的GC策略,調整JVM、GC的引數,可以極大的減少由於GC工作,而導致的程式執行中斷方面的問題,進而適當的提高Java程式的工作效率。但是調整GC是以個極為複雜的過程,由於
Spark優化(十):資源引數調優
在開發完Spark作業之後,就該為作業配置合適的資源了。Spark的資源引數,基本都可以在spark-submit命令中作為引數設定。很多Spark初學者通常不知道該設定哪些必要的引數以及如何設定這些引數,最後就只能胡亂設定,甚至壓根兒不設定。 資源引數設定的不合理,可能會導致
Eureka 引數調優
常見問題 為什麼服務下線了,Eureka Server 介面返回的資訊還會存在。 為什麼服務上線了,Eureka Client 不能及時獲取到。 為什麼有時候會出現如下提示: EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE U
ALS演算法理解和引數調優
在上一篇博文中我們一起學習瞭如何用spark構建一套歌手推薦系統,在模型訓練的時候,我們用到的是ALS演算法,這篇博文我們就一起來學習一下ALS演算法的原理吧。ALS演算法全稱是Alternating Least Squares,從協同過濾的分類來說,這裡的ALS演算法是同時基於使用者和
keras引數調優
原文:https://machinelearningmastery.com/grid-search-hyperparameters-deep-learning-models-python-keras/ 本文主要想為大家介紹如何使用scikit-learn網格搜尋功能,並給出一套程式碼例項。你可以
高併發服務 系統引數調優相關
(*)系統引數 1、訊息佇列大小 和 可開啟檔案數 設定 /etc/sysctl.conf中增加以下配置 kernel.msgmni=1000 kernel.msgmax=81920 kernel.msgmnb=1638400 #fs.mqueue.msg_max=1000 #f
hive on spark 效能引數調優
select * from stg_bankcard_auth_apply where length(idcardno) >= 1 and length(idcardno) <> 32; --該表儲存檔案格式為txt格式,是原始檔直接load進來的,mapreduce執行不管任何s
CPU常用引數調優
CPU:時間片長,優先順序低; IO: 時間片短,優先順序高; 檢視CPU實時狀態命令: # top # w # vmstat 1 5 # uptime # sar -q (可以實時取樣也可以檢視過去CPU使用情況) 檢視CPU
HBase 核心元件協調及RegionServer JVM引數調優-OLAP商業環境實戰
本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。QQ郵箱地址:[email protected],如有任何商業交流,可隨時聯絡。 1 弱化的Master
機器學習實踐(八)—sklearn之交叉驗證與引數調優
一、交叉驗證與引數調優 交叉驗證(cross validation) 交叉驗證:將拿到的訓練資料,分為訓練集、驗證集和測試集。 訓練集:訓練集+驗證集 測試集:測試集
HBase LRUBlockCache與BucketCache二級快取機制原理剖析與引數調優-OLAP商業環境實戰
本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。QQ郵箱地址:[email protected],如有任何學術交流,可隨時聯絡。