python机器学习库xgboost——xgboost算法(有分类和回归实例)
分享一個朋友的人工智能教程。零基礎!通俗易懂!風趣幽默!還帶黃段子!大家可以看看是否對自己有幫助:點擊打開
docker/kubernetes入門視頻教程
全棧工程師開發手冊 (作者:欒鵬)
python數據挖掘系列教程
安裝
xgboost目前還不能pip在線安裝,所以先在網址https://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost 中下載whl文件,然后參考https://blog.csdn.net/luanpeng825485697/article/details/77816740 進行離線安裝,就可以正常導入xgboost庫了。
更新:現在已經可以通過pip install xgboost在線安裝庫了。
xgboost簡介
xgboost一般和sklearn一起使用,但是由于sklearn中沒有集成xgboost,所以才需要單獨下載安裝。
xgboost是在GBDT的基礎上進行改進,使之更強大,適用于更大范圍。
XGBoost的優點
2.1 正則化
XGBoost在代價函數里加入了正則項,用于控制模型的復雜度。正則項里包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優于傳統GBDT的一個特性。
2.2 并行處理
XGBoost工具支持并行。Boosting不是一種串行的結構嗎?怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數里包含了前面t-1次迭代的預測值)。XGBoost的并行是在特征粒度上的。
我們知道,決策樹的學習最耗時的一個步驟就是對特征的值進行排序(因為要確定最佳分割點),XGBoost在訓練之前,預先對數據進行了排序,然后保存為block結構,后面的迭代中重復地使用這個結構,大大減小計算量。這個block結構也使得并行成為了可能,在進行節點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行。
2.3 靈活性
XGBoost支持用戶自定義目標函數和評估函數,只要目標函數二階可導就行。
2.4 缺失值處理
對于特征的值有缺失的樣本,xgboost可以自動學習出它的分裂方向
2.5 剪枝
XGBoost 先從頂到底建立所有可以建立的子樹,再從底到頂反向進行剪枝。比起GBM,這樣不容易陷入局部最優解。
2.6 內置交叉驗證
XGBoost允許在每一輪boosting迭代中使用交叉驗證。因此,可以方便地獲得最優boosting迭代次數。而GBM使用網格搜索,只能檢測有限個值。
XGBoost詳解
3.1 數據格式
XGBoost可以加載多種數據格式的訓練數據:
libsvm 格式的文本數據;
Numpy 的二維數組;
XGBoost 的二進制的緩存文件。加載的數據存儲在對象 DMatrix 中。
下面一一列舉:
加載libsvm格式的數據
?dtrain1 = xgb.DMatrix('train.svm.txt')
1
加載二進制的緩存文件
dtrain2 = xgb.DMatrix('train.svm.buffer')
1
加載numpy的數組
data = np.random.rand(5,10) # 5行10列數據集
label = np.random.randint(2, size=5) # 2分類目標值
dtrain = xgb.DMatrix( data, label=label) # 組成訓練集
1
2
3
將scipy.sparse格式的數據轉化為 DMatrix 格式
csr = scipy.sparse.csr_matrix( (dat, (row,col)) )
dtrain = xgb.DMatrix( csr )
1
2
將 DMatrix 格式的數據保存成XGBoost的二進制格式,在下次加載時可以提高加載速度,使用方式如下
?dtrain = xgb.DMatrix('train.svm.txt')
dtrain.save_binary("train.buffer")
1
2
可以用如下方式處理 DMatrix中的缺失值:
dtrain = xgb.DMatrix( data, label=label, missing = -999.0)
1
當需要給樣本設置權重時,可以用如下方式
w = np.random.rand(5,1)
dtrain = xgb.DMatrix( data, label=label, missing = -999.0, weight=w)
1
2
3.2 參數設置
XGBoost使用key-value字典的方式存儲參數:
params = {
? ? 'booster': 'gbtree',
? ? 'objective': 'multi:softmax', ?# 多分類的問題
? ? 'num_class': 10, ? ? ? ? ? ? ? # 類別數,與 multisoftmax 并用
? ? 'gamma': 0.1, ? ? ? ? ? ? ? ? ?# 用于控制是否后剪枝的參數,越大越保守,一般0.1、0.2這樣子。
? ? 'max_depth': 12, ? ? ? ? ? ? ? # 構建樹的深度,越大越容易過擬合
? ? 'lambda': 2, ? ? ? ? ? ? ? ? ? # 控制模型復雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合。
? ? 'subsample': 0.7, ? ? ? ? ? ? ?# 隨機采樣訓練樣本
? ? 'colsample_bytree': 0.7, ? ? ? # 生成樹時進行的列采樣
? ? 'min_child_weight': 3,
? ? 'silent': 1, ? ? ? ? ? ? ? ? ? # 設置成1則沒有運行信息輸出,最好是設置為0.
? ? 'eta': 0.007, ? ? ? ? ? ? ? ? ?# 如同學習率
? ? 'seed': 1000,
? ? 'nthread': 4, ? ? ? ? ? ? ? ? ?# cpu 線程數
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
3.3 訓練模型
有了參數列表和數據就可以訓練模型了
num_round = 10
bst = xgb.train( plst, dtrain, num_round, evallist )
1
2
3.4 模型預測
# X_test類型可以是二維List,也可以是numpy的數組
dtest = DMatrix(X_test)
ans = model.predict(dtest)
1
2
3
3.5 保存模型
在訓練完成之后可以將模型保存下來,也可以查看模型內部的結構
?bst.save_model('test.model')
1
導出模型和特征映射(Map)
你可以導出模型到txt文件并瀏覽模型的含義:
# 導出模型到文件
bst.dump_model('dump.raw.txt')
# 導出模型和特征映射
bst.dump_model('dump.raw.txt','featmap.txt')
1
2
3
4
3.6 加載模型
通過如下方式可以加載模型:
bst = xgb.Booster({'nthread':4}) # init model
bst.load_model("model.bin") ? ? ?# load data
1
2
XGBoost參數詳解
在運行XGboost之前,必須設置三種類型成熟:general parameters,booster parameters和task parameters:
通用參數 :該參數參數控制在提升(boosting)過程中使用哪種booster,常用的booster有樹模型(tree)和線性模型(linear model)。
Booster參數 :這取決于使用哪種booster。
學習目標參數 :控制學習的場景,例如在回歸問題中會使用不同的參數控制排序。
4.1 通用參數
booster [default=gbtree]:有兩中模型可以選擇gbtree和gblinear。gbtree使用基于樹的模型進行提升計算,gblinear使用線性模型進行提升計算。缺省值為gbtree
silent [default=0]:取0時表示打印出運行時信息,取1時表示以緘默方式運行,不打印運行時信息。缺省值為0
nthread:XGBoost運行時的線程數。缺省值是當前系統可以獲得的最大線程數
num_pbuffer:預測緩沖區大小,通常設置為訓練實例的數目。緩沖用于保存最后一步提升的預測結果,無需人為設置。
num_feature:Boosting過程中用到的特征維數,設置為特征個數。XGBoost會自動設置,無需人為設置。
4.2 tree booster參數
eta [default=0.3] :為了防止過擬合,更新過程中用到的收縮步長。在每次提升計算之后,算法會直接獲得新特征的權重。 eta通過縮減特征的權重使提升計算過程更加保守。缺省值為0.3
取值范圍為:[0,1]。典型值為0.01-0.2。
gamma [default=0] :在節點分裂時,只有分裂后損失函數的值下降了,才會分裂這個節點。Gamma指定了節點分裂所需的最小損失函數下降值。
這個參數的值越大,算法越保守。這個參數的值和損失函數息息相關,所以是需要調整的。
取值范圍為:[0,∞]
max_depth [default=6] :數的最大深度。缺省值為6 。取值范圍為:[1,∞]。需要使用CV函數來進行調優。典型值:3-10
min_child_weight [default=1] :孩子節點中最小的樣本權重和。如果一個葉子節點的樣本權重和小于min_child_weight則拆分過程結束。在現行回歸模型中,這個參數是指建立每個模型所需要的最小樣本數。這個參數用于避免過擬合。當它的值較大時,可以避免模型學習到局部的特殊樣本。
但是如果這個值過高,會導致欠擬合。這個參數需要使用CV來調整。取值范圍為:[0,∞]
max_delta_step [default=0] :我們允許每個樹的權重被估計的值。如果它的值被設置為0,意味著沒有約束;如果它被設置為一個正值,它能夠使得更新的步驟更加保守。通常這個參數是沒有必要的,但是如果在邏輯回歸中類極其不平衡這時候他有可能會起到幫助作用。把它范圍設置為1-10之間也許能控制更新。 取值范圍為:[0,∞]
subsample [default=1] :用于訓練模型的子樣本占整個樣本集合的比例。如果設置為0.5則意味著XGBoost將隨機的從整個樣本集合中隨機的抽取出50%的子樣本建立樹模型,這能夠防止過擬合。 取值范圍為:(0,1]
colsample_bytree [default=1] :在建立樹時對特征采樣的比例。缺省值為1 。取值范圍為:(0,1]
4.3 Linear Booster參數
lambda [default=0] :L2 正則的懲罰系數
alpha [default=0] :L1 正則的懲罰系數
lambda_bias :在偏置上的L2正則。缺省值為0(在L1上沒有偏置項的正則,因為L1時偏置不重要)
4.4 學習目標參數
objective [ default=reg:linear ] :定義學習任務及相應的學習目標,可選的目標函數如下:
“reg:linear” —— 線性回歸。
“reg:logistic”—— 邏輯回歸。
“binary:logistic”—— 二分類的邏輯回歸問題,輸出為概率。
“binary:logitraw”—— 二分類的邏輯回歸問題,輸出的結果為wTx。
“count:poisson”—— 計數問題的poisson回歸,輸出結果為poisson分布。在poisson回歸中,max_delta_step的缺省值為0.7。(used to safeguard optimization)
“multi:softmax” –讓XGBoost采用softmax目標函數處理多分類問題,同時需要設置參數num_class(類別個數)
“multi:softprob” –和softmax一樣,但是輸出的是ndata * nclass的向量,可以將該向量reshape成ndata行nclass列的矩陣。沒行數據表示樣本所屬于每個類別的概率。
“rank:pairwise” –set XGBoost to do ranking task by minimizing the pairwise loss
base_score [ default=0.5 ]
所有實例的初始化預測分數,全局偏置;
當有足夠的迭代次數時,改變這個值將不會有太大的影響。
eval_metric [ default according to objective ]
校驗數據所需要的評價指標,不同的目標函數將會有缺省的評價指標(rmse for regression, and error for classification, mean average precision for ranking)-
用戶可以添加多種評價指標,對于Python用戶要以list傳遞參數對給程序,而不是map參數list參數不會覆蓋’eval_metric’
可供的選擇如下:
rmse 均方根誤差(∑Ni=1?2N?????√\sqrt {\frac{\sum_{i=1}^N?^2}{N}}?
N
∑?
i=1
N
??? ?
???
2
?
??? ?
?
??? ?
?)
mae 平均絕對誤差(∑Ni=1∣?∣N\frac{\sum_{i=1}^N|?|}{N}?
N
∑?
i=1
N
??? ?
?∣?∣
??? ?
?)
logloss 負對數似然函數值
error 二分類錯誤率(閾值為0.5)
merror 多分類錯誤率
mlogloss 多分類logloss損失函數
auc 曲線下面積
seed [ default=0 ]
隨機數的種子。缺省值為0
xgboost 基本方法和默認參數
函數原型:
xgboost.train(params,dtrain,num_boost_round=10,evals=(),obj=None,feval=None,maximize=False,early_stopping_rounds=None,evals_result=None,verbose_eval=True,learning_rates=None,xgb_model=None) ?
1
params :這是一個字典,里面包含著訓練中的參數關鍵字和對應的值,形式是params = {‘booster’:’gbtree’, ’eta’:0.1}
dtrain :訓練的數據
num_boost_round :這是指提升迭代的個數
evals :這是一個列表,用于對訓練過程中進行評估列表中的元素。形式是evals = [(dtrain,’train’), (dval,’val’)]或者是evals = [ (dtrain,’train’)], 對于第一種情況,它使得我們可以在訓練過程中觀察驗證集的效果。
obj:自定義目的函數
feval:自定義評估函數
maximize: 是否對評估函數進行最大化
early_stopping_rounds: 早期停止次數 ,假設為100,驗證集的誤差迭代到一定程度在100次內不能再繼續降低,就停止迭代。這要求evals 里至少有一個元素,如果有多個,按最后一個去執行。返回的是最后的迭代次數(不是最好的)。如果early_stopping_rounds 存在,則模型會生成三個屬性,bst.best_score, bst.best_iteration, 和bst.best_ntree_limit
evals_result :字典,存儲在watchlist 中的元素的評估結果。
verbose_eval(可以輸入布爾型或數值型):也要求evals 里至少有 一個元素。如果為True, 則對evals中元素的評估結果會輸出在結果中;如果輸入數字,假設為5,則每隔5個迭代輸出一次。
learning_rates :每一次提升的學習率的列表,
xgb_model:在訓練之前用于加載的xgb model。
XGBoost實戰
XGBoost有兩大類接口:XGBoost原生接口 和 scikit-learn接口 ,并且XGBoost能夠實現 分類 和 回歸 兩種任務。因此,本章節分四個小塊來介紹!
5.1 基于XGBoost原生接口的分類
# ================基于XGBoost原生接口的分類=============
from sklearn.datasets import load_iris
import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score ? # 準確率
# 加載樣本數據集
iris = load_iris()
X,y = iris.data,iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234565) # 數據集分割
# 算法參數
params = {
? ? 'booster': 'gbtree',
? ? 'objective': 'multi:softmax',
? ? 'num_class': 3,
? ? 'gamma': 0.1,
? ? 'max_depth': 6,
? ? 'lambda': 2,
? ? 'subsample': 0.7,
? ? 'colsample_bytree': 0.7,
? ? 'min_child_weight': 3,
? ? 'silent': 1,
? ? 'eta': 0.1,
? ? 'seed': 1000,
? ? 'nthread': 4,
}
plst = params.items()
dtrain = xgb.DMatrix(X_train, y_train) # 生成數據集格式
num_rounds = 500
model = xgb.train(plst, dtrain, num_rounds) # xgboost模型訓練
# 對測試集進行預測
dtest = xgb.DMatrix(X_test)
y_pred = model.predict(dtest)
# 計算準確率
accuracy = accuracy_score(y_test,y_pred)
print("accuarcy: %.2f%%" % (accuracy*100.0))
# 顯示重要特征
plot_importance(model)
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
輸出預測正確率以及特征重要性:
Accuracy: 96.67 %
5.2 基于XGBoost原生接口的回歸
# ================基于XGBoost原生接口的回歸=============
import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
from sklearn.metrics import mean_squared_error
# 加載數據集
boston = load_boston()
X,y = boston.data,boston.target
# XGBoost訓練過程
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
params = {
? ? 'booster': 'gbtree',
? ? 'objective': 'reg:gamma',
? ? 'gamma': 0.1,
? ? 'max_depth': 5,
? ? 'lambda': 3,
? ? 'subsample': 0.7,
? ? 'colsample_bytree': 0.7,
? ? 'min_child_weight': 3,
? ? 'silent': 1,
? ? 'eta': 0.1,
? ? 'seed': 1000,
? ? 'nthread': 4,
}
dtrain = xgb.DMatrix(X_train, y_train)
num_rounds = 300
plst = params.items()
model = xgb.train(plst, dtrain, num_rounds)
# 對測試集進行預測
dtest = xgb.DMatrix(X_test)
ans = model.predict(dtest)
# 顯示重要特征
plot_importance(model)
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
重要特征(值越大,說明該特征越重要)顯示結果:
xgb使用sklearn接口(推薦)
XGBClassifier
from xgboost.sklearn import XGBClassifier
clf = XGBClassifier(
silent=0 ,#設置成1則沒有運行信息輸出,最好是設置為0.是否在運行升級時打印消息。
#nthread=4,# cpu 線程數 默認最大
learning_rate= 0.3, # 如同學習率
min_child_weight=1,?
# 這個參數默認是 1,是每個葉子里面 h 的和至少是多少,對正負樣本不均衡時的 0-1 分類而言
#,假設 h 在 0.01 附近,min_child_weight 為 1 意味著葉子節點中最少需要包含 100 個樣本。
#這個參數非常影響結果,控制葉子節點中二階導的和的最小值,該參數值越小,越容易 overfitting。
max_depth=6, # 構建樹的深度,越大越容易過擬合
gamma=0, ?# 樹的葉子節點上作進一步分區所需的最小損失減少,越大越保守,一般0.1、0.2這樣子。
subsample=1, # 隨機采樣訓練樣本 訓練實例的子采樣比
max_delta_step=0,#最大增量步長,我們允許每個樹的權重估計。
colsample_bytree=1, # 生成樹時進行的列采樣?
reg_lambda=1, ?# 控制模型復雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合。
#reg_alpha=0, # L1 正則項參數
#scale_pos_weight=1, #如果取值大于0的話,在類別樣本不平衡的情況下有助于快速收斂。平衡正負權重
#objective= 'multi:softmax', #多分類的問題 指定學習任務和相應的學習目標
#num_class=10, # 類別數,多分類與 multisoftmax 并用
n_estimators=100, #樹的個數
seed=1000 #隨機種子
#eval_metric= 'auc'
)
clf.fit(X_train,y_train,eval_metric='auc')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
5.3 基于Scikit-learn接口的分類
# ==============基于Scikit-learn接口的分類================
from sklearn.datasets import load_iris
import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加載樣本數據集
iris = load_iris()
X,y = iris.data,iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234565) # 數據集分割
# 訓練模型
model = xgb.XGBClassifier(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective='multi:softmax')
model.fit(X_train, y_train)
# 對測試集進行預測
y_pred = model.predict(X_test)
# 計算準確率
accuracy = accuracy_score(y_test,y_pred)
print("accuarcy: %.2f%%" % (accuracy*100.0))
# 顯示重要特征
plot_importance(model)
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
輸出結果:Accuracy: 96.67 %
基于Scikit-learn接口的回歸
# ================基于Scikit-learn接口的回歸================
import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
boston = load_boston()
X,y = boston.data,boston.target
# XGBoost訓練過程
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
model = xgb.XGBRegressor(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective='reg:gamma')
model.fit(X_train, y_train)
# 對測試集進行預測
ans = model.predict(X_test)
# 顯示重要特征
plot_importance(model)
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
參數調優的一般方法
我們會使用和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函數來確定最佳的決策樹數量。
第二步: max_depth 和 min_weight 參數調優
我們先對這兩個參數調優,是因為它們對最終結果有很大的影響。首先,我們先大范圍地粗調參數,然后再小范圍地微調。
注意:在這一節我會進行高負荷的柵格搜索(grid search),這個過程大約需要15-30分鐘甚至更久,具體取決于你系統的性能。你也可以根據自己系統的性能選擇不同的值。
第三步:gamma參數調優
第四步:調整subsample 和 colsample_bytree 參數
第五步:正則化參數調優。
第6步:降低學習速率
最后,我們使用較低的學習速率,以及使用更多的決策樹。我們可以用XGBoost中的CV函數來進行這一步工作。
————————————————
版權聲明:本文為CSDN博主「數據架構師」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/luanpeng825485697/article/details/79907149
總結
以上是生活随笔為你收集整理的python机器学习库xgboost——xgboost算法(有分类和回归实例)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ai改造家装饰在居然之家里面是卖家具软装
- 下一篇: 为什么说ASKO洗衣机是洗衣界的天花板?