XGBoost參數及代碼實戰

XGBoost參數解釋:https://blog.csdn.net/qq_40587575/article/details/82886782
XGBoost參數調優:Complete Guide to Parameter Tuning in XGBoost with codes in Python

XGBoost算法是一種高度複雜的算法,功能強大,足以處理各種數據不規則性。

本文最適合XGBoost的新手。在本文中,我們將學習有關XGBoost的一些信息。

XGBoost的優勢

1、正則化

標準GBM的實現沒有像XGBoost這樣的正則化步驟。正則化對減少過擬合也是有幫助的。

實際上,XGBoost以“正則化提升(regularized boosting)”技術而聞名。

2、並行處理

XGBoost實現了並行處理,並且與GBM相比,速度非常快。

XGBoost還支持在Hadoop上的實現。

3、高靈活性

XGBoost允許用戶定義自定義優化目標和評估標準。

這爲模型增加了一個全新的維度,所以我們的處理不會受到任何限制。

4、處理缺失值

XGBoost內置處理缺失值的規則。

用戶需要提供一個和其它樣本不同的值,然後把它作爲一個參數傳進去,以此來作爲缺失值的取值。XGBoost在不同節點遇到缺失值時採用不同的處理方法,並且會學習未來遇到缺失值時的處理方法。

5、剪枝

當分裂時遇到一個負損失時,GBM會停止分裂。因此GBM實際上是一個貪心算法。

XGBoost會一直分裂到指定的最大深度(max_depth),然後回過頭來剪枝。如果某個節點之後不再有正值,它會去除這個分裂。

這種做法的優點,當一個負損失(如-2)後面有個正損失(如+10)的時候,就顯現出來了。GBM會在-2處停下來,因爲它遇到了一個負值。但是XGBoost會繼續分裂,然後發現這兩個分裂綜合起來會得到+8,因此會保留這兩個分裂。

6、內置交叉驗證

XGBoost允許在每一輪boosting迭代中使用交叉驗證。因此,可以方便地獲得最優boosting迭代次數。

這與GBM不同,在GBM中,我們必須使用網格搜索,並且只能測試有限的值。

2、繼續現有模型

XGBoost可以在上一輪的結果上繼續訓練。這個特性在某些特定的應用上是一個巨大的優勢。

sklearn中的GBM的實現也有這個功能,兩種算法在這一點上是一致的。

XGBoost參數

儘管有兩種booster可供選擇,這裏只介紹tree booster,因爲它的表現遠遠勝過linear booster,所以linear booster很少用到。

XGBClassifier(max_depth, learning_rate, n_estimators, silent, 
			  objective, booster, n_jobs, nthread, gamma, 
			  min_child_weight, max_delta_step, subsample, 
			  colsample_bytree, colsample_bylevel, reg_alpha, 
			  reg_lambda, scale_pos_weight, base_score, 
			  random_state, seed, missing)
booster[默認gbtree]
選擇每次迭代的模型,有兩種選擇:

	gbtree:基於樹的模型

	gbliner:線性模型
objective[默認reg:linear]
迴歸任務
	reg:linear (默認)
	reg:logistic
	
二分類
	binary:logistic     概率 
	binary:logitraw   類別
	
多分類
	multi:softmax  num_class=n   返回類別
	multi:softprob   num_class=n  返回概率
	
rank:pairwise
gamma[默認0]
在節點分裂時,只有分裂後損失函數的值下降了,纔會分裂這個節點。
Gamma指定了節點分裂所需的最小損失函數下降值。

這個參數的值越大,算法越保守。
這個參數的值和損失函數息息相關,所以是需要調整的。
max_depth[默認6]
和GBM中的參數相同,這個值爲樹的最大深度。

這個值也是用來避免過擬合的。max_depth越大,模型會學到更具體更局部的樣本。

需要使用CV函數來進行調優。

典型值:3-10
reg_lambda[默認1]
權重的L2正則化項。(和Ridge regression類似)。

這個參數是用來控制XGBoost的正則化部分的。
reg_alpha[默認1]
權重的L1正則化項。(和Lasso regression類似)。

可以應用在很高維度的情況下,使得算法的速度更快。
silent[默認0]
當這個參數值爲1時,靜默模式開啓,不會輸出任何信息。

一般這個參數就保持默認的0,因爲這樣能幫我們更好地理解模型。
learning_rate[默認0.3]
學習率,控制每次迭代更新權重的步長,默認0.3,值越小,訓練越慢。

典型值爲 0.01-0.2 。
n_esitimators
決策樹的棵樹,即總共迭代的次數。
min_child_weight[默認1]
決定最小葉子節點樣本權重和。

和GBM的 min_child_leaf 參數類似,但不完全一樣。
XGBoost的這個參數是最小樣本權重的和,而GBM參數是最小樣本總數。

這個參數用於避免過擬合。當它的值較大時,可以避免模型學習到局部的特殊樣本。

但是如果這個值過高,會導致欠擬合。這個參數需要使用CV來調整。
subsample[默認1]
減小這個參數的值,算法會更加保守,避免過擬合。
但是,如果這個值設置得過小,它可能會導致欠擬合。

對於每棵樹,隨機採樣的比例———隨機選擇多少樣本建立決策樹。
float型,如:0.8 取 80 % 的樣本

典型值:0.5-1
scale_pos_weight[默認1]
正樣本的權重。

在二分類任務中,當正負樣本比例失衡時,設置正樣本的權重,模型效果更好。

例如,當正負樣本比例爲1:10時,scale_pos_weight=10。
random_state
隨機數的種子

設置它可以復現隨機數據的結果,也可以用於調整參數。
colsample_bytree[默認1]
和GBM裏面的max_features參數類似。
用來控制每棵隨機採樣的列數的佔比(每一列是一個特徵)。

典型值:0.5-1

colsample_bylevel[默認1]

用來控制樹的每一級的每一次分裂,對列數的採樣的佔比。

subsample參數和colsample_bytree參數可以起到相同的作用。

max_delta_step[默認0]

這參數限制每棵樹權重改變的最大步長。如果這個參數的值爲0,那就意味着沒有約束。
如果它被賦予了某個正值,那麼它會讓這個算法更加保守。

通常,這個參數不需要設置。
但是當各類別的樣本十分不平衡時,它對邏輯迴歸是很有幫助的。

這個參數一般用不到,但是你可以挖掘出來它更多的用處。

nthread[默認值爲最大可能的線程數]

這個參數用來進行多線程控制,應當輸入系統的核數。

如果你希望使用CPU全部的核,那就不要輸入這個參數,算法會自動檢測它。

max_leaf_nodes

樹上最大的節點或葉子的數量。

可以替代max_depth的作用。
因爲如果生成的是二叉樹,一個深度爲n的樹最多生成2 ^ n個葉子。

如果定義了這個參數,GBM會忽略max_depth參數。

XGBClassifier().fit() 參數

fit(self, X, y, sample_weight=None, eval_set=None, 
	eval_metric=None, early_stopping_rounds=None, verbose=True, 
	xgb_model=None, sample_weight_eval_set=None)
early_stopping_rounds
在驗證集上,當連續n次迭代,分數沒有提高後,提前終止訓練。

作用:防止overfitting。
sample_weight
樣本權重
eval_set
 list 型,如:eval_set = [(X_test, y_test)]。 
 
 設置自定義樣本,將使用列表的樣本作爲驗證集,當迭代幾次分數沒提高,則終止。
eval_metric
評估標準。使用方法: eval_metric = 'error' 

迴歸任務(默認rmse)
	rmse--均方根誤差
	mae--平均絕對誤差
	
分類任務(默認error)
	auc--roc曲線下面積
	error--錯誤率(二分類)
	merror--錯誤率(多分類)
	logloss--負對數似然函數(二分類)
	mlogloss--負對數似然函數(多分類)
early_stopping_rounds
int 型,當連續迭代幾次時,分數沒有提高後,提前終止訓練。
sample_weight_eval_set
list 型,每個特徵樣本作爲驗證集的權重。

代碼實現

代碼實現:https://www.cnblogs.com/wanglei5205/p/8579244.html

第一種方法:XGBClassifier

from sklearn import datasets
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
from xgboost import plot_importance
%matplotlib inline

digits = datasets.load_digits()
X = digits.data
y = digits.target

# 訓練測試集分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=666)

# 訓練數據
xgb = XGBClassifier(learning_rate=0.1,
                    n_estimators=1000,         # 樹的個數--1000棵樹建立xgboost
                    max_depth=6,               # 樹的深度
                    min_child_weight = 1,      # 葉子節點最小權重
                    gamma=0.,                  # 懲罰項中葉子結點個數前的參數
                    subsample=0.8,             # 隨機選擇80%樣本建立決策樹
                    colsample_btree=0.8,       # 隨機選擇80%特徵建立決策樹
                    objective='multi:softmax', # 指定損失函數
                    scale_pos_weight=1,        # 解決樣本個數不平衡的問題
                    random_state=666           # 隨機數
                    )
xgb.fit(X_train,
        y_train,
        eval_set = [(X_test,y_test)],
        eval_metric = "mlogloss",
        early_stopping_rounds = 10,
        verbose = True)

# 對測試集進行預測
y_predict = xgb.predict(X_test)

# 模型評估
accuracy = accuracy_score(y_test, y_predict)
print("accuarcy: %.2f%%" % (accuracy*100.0))

# 特徵重要性分析
fig,ax = plt.subplots(figsize=(15,15))
plot_importance(xgb,
                height=0.5,
                ax=ax,
                max_num_features=64)
plt.show()

accuarcy: 97.22%

第二種方法:xgboost

import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt

params = {
    'booster': 'gbtree',
    'objective': 'multi:softmax',
    'num_class': 10,
    'gamma': 0.1,
    'max_depth': 6,
    'lambda': 2,
    'subsample': 0.8,
    'colsample_bytree': 0.8,
    'min_child_weight': 1,
    'eta': 0.1,
    'seed': 666
}

plst = params.items()

dtrain = xgb.DMatrix(X_train, y_train)
num_rounds = 500
model = xgb.train(plst, dtrain, num_rounds)

# 對測試集進行預測
dtest = xgb.DMatrix(X_test)
y_predict = model.predict(dtest)

print("Accuracy: %.2f%% " % (accuracy_score(y_test, y_predict)*100.0))

# 特徵重要性分析
fig,ax = plt.subplots(figsize=(15,15))
plot_importance(model,
                height=0.5,
                ax=ax,
                max_num_features=64)

Accuracy: 97.50%

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章