xgboost参数

XGBoost中参数调优

本文参考xgboost官方文档以及python中xgboost参数设置而作。

使用语言:python

  • 采用python的XGBoost模块有一个sklearn包,XGBClassifier
    目的: 是为了自己在写一个调参库前能有一个细节理解。鉴于本人拙劣的思维,如有错误可以在评论区提出。

参数组成

  • 参数主要为3部分
    • General Parameters
    • Booster Parameters
    • Learning Task Parameters

General Parameters

  1. booster [default=gbtree]
    • 选择在每次迭代时的模型类型–gbtree、gblinear、dart
    • gbtree和dart使用基于树的模型,gblinear使用线性模型
    • 由于通常gbtree表现比gblinear好,故使用默认gbtree。
  2. silent[default=0]
    • 0代表打印运行信息,1表示不打印。由于打印信息可以观察运行情况,推荐0.
  3. nthread[默认为当前可获得的最大线程数]
    • 若希望在所有内核上,不输入值,若想限速,输入核心数量,推荐不输入全速跑。
  4. num_pbuffer and num_feature
    • 这两个放一起说,都是由xgboost自动设置。

Booster Parameters

在此仅说tree booster,因为它是最优的。

  1. eta[default=0.3]
    • 可以理解为学习速率
    • 缩小步伐和每个步骤的权重,防止过拟合
    • 范围[0,1] 典型值为[0.01,0.2]
  2. gamma[default=0, alias: min_split_loss]
    • 越大,算法越保守
    • 范围[0,∞]
  3. max_depth[default=6]
    • 最大化一个数的深度,增加它会使模型变得更复杂更易过拟合
    • 0表示无限制,范围[0,∞]
  4. min_child_weight[default=1]
    • 范围[0,∞]
  5. max_delta_step [default = 0]
    • 允许每棵树的最大步长。值为0,代表没有约束
    • 通常不需要设置,但数据不平衡时,可能有助逻辑回归
  6. subsample [default=1]
    • 用于训练的子样本比例。设为0.5意味着xgboost随机收集一半的数据实例来生长树,这可以防止过拟合。
    • 范围(0,1]
  7. colsample_bytree [default = 1]
    • 表示每棵树时的随机抽样列采样率
    • 范围(0,1]
  8. colsample_bylevel [default=1]
    • 每个分级的列的子采样比率
    • 范围:(0,1]
  9. lambda [default = 1]
  10. alpha [default = 0]
    • 在非常高的维度使用,以便算法实现时运行得更快
  11. scale_pos_weight [default = 1]
    • 在数据不平衡的情况下使用 有助于更快收敛
  12. tree_method,string [default =’auto’]
    • xgboost中使用的树构造算法
    • {‘auto’,’exact’,’approx’,’hist’,’gpu_exact’,’gpu_hist’}
    • 待施工
  13. updater,[default =’grow_colmaker,prune’]
  14. predictor, [default=’cpu_predictor’]
    * 新版xgboost支持gpu运算
    * ‘cpu_predictor’,cpu运算
    * ‘gpu_predictor’, 使用gpu运算,两方法结果相同,但gpu运算时间更短。

Learning Task Parameters

  1. objective[default = reg:linear]
    • 定义了需要最小化的损耗函数(常用值如下)
      • “reg:linear”– 线性回归
      • “reg:logistic”– 逻辑回归
      • “binary:logistic”– 二元分类的逻辑回归,输入概率
      • “multi:softmax”–多类分类,还需要设置num_class
      • “multi:softprob”– 和softmax近似,但输出一个ndata * nclass的向量
        2.eval_metric[默认为依据对象自动设置]
    • 验证数据的评估指标
    • 可以添加多个评估指标(参数对的列表,而不是映射)
    • 选择如下:
      • rmse
      • mae
      • logloss
      • error
      • merror
      • mlogloss
      • auc
      • ndcg
  2. seed[default = 0]
    • 随机数种子
    • 用于参数调整以及产生可以重现的结果

调参

  • 思路:网格调参
  • 逐步设置参数为最优。由于精度关系,一个参数可以做几次比较,需要可以再自行设置。
  • 下面部分为代码
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# -*- coding: utf-8 -*-
"""
@author: stan
"""

import pandas as pd
import numpy as np
import xgboost as xgb
from xgboost.sklearn import XGBClassifier,XGBRegressor
from sklearn import cross_validation, metrics #Additional scklearn functions
from sklearn.grid_search import GridSearchCV #Perforing grid search
from sklearn.utils import shuffle

#打乱train,划分训练验证集4:1
train = shuffle(train,random_state=42)
length = train.shape[0]
valid = train[:int(length*0.2)]
train = train[int(length*0.2):]
#设置target(label) IDcol
#该部分自行修改!
#target1 = 'target'
#IDcol = 'id'
#设置predictors
predictors = [x for x in train.columns if x not in [target1,IDcol]]
#有多个target 自行修改!

def modelfit(alg, dtrain, dvalid, predictors,useTrainCV=True, cv_folds=5, early_stopping_rounds=50):

if useTrainCV:
xgb_param = alg.get_xgb_params()
xgtrain = xgb.DMatrix(dtrain[predictors].values, label=dtrain[target1].values)
cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,
metrics='auc', early_stopping_rounds=early_stopping_rounds, show_stdv=True)
alg.set_params(n_estimators=cvresult.shape[0])
print("n_estimators: ",cvresult.shape[0])

alg.fit(dtrain[predictors], dtrain[target1],eval_metric='auc')
dtrain_predictions = alg.predict(dtrain[predictors])
dtrain_predprob = alg.predict_proba(dtrain[predictors])[:,1]
print("AUC Score (Train): %f" % metrics.roc_auc_score(dtrain[target1], dtrain_predprob))
dvalid_predictions = alg.predict(dvalid[predictors])
dvalid_predprob = alg.predict_proba(dvalid[predictors])[:,1]
print("AUC Score (Valid): %f" % metrics.roc_auc_score(dvalid[target1], dvalid_predprob))

# set xgb parameters and change
xgb1 = XGBClassifier(
learning_rate =0.3,
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)

modelfit(xgb1, train, valid, predictors)

# n_estimators has auto—changed
param_test1 = {
'max_depth':list(range(3,10,2)),
'min_child_weight':list(range(1,6,2))
}
gsearch1 = GridSearchCV(estimator= xgb1
,param_grid = param_test1, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch1.fit(train[predictors],train[target1])
#找出近似最优解
best_max_depth = gsearch1.best_params_["max_depth"]
best_min_child_weight = gsearch1.best_params_["min_child_weight"]
print gsearch1.best_params_
#比较左右同精度的得分
#max_depth
param_test2 = {
'max_depth':[best_max_depth-1,best_max_depth,best_max_depth+1]
}
gsearch2 = GridSearchCV(estimator = xgb1,
param_grid = param_test2, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch2.fit(train[predictors],train[target1])
best_max_depth = gsearch2.best_params_["max_depth"]
xgb1.set_params(max_depth=best_max_depth)
print gsearch2.best_params_
#min_child_weight
param_test2b = {
'min_child_weight':[best_min_child_weight-1,best_min_child_weight,best_min_child_weight+1]
}
gsearch2b = GridSearchCV(estimator = xgb1,
param_grid = param_test2b, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch2b.fit(train[predictors],train[target1])
best_min_child_weight = gsearch2b.best_params_["min_child_weight"]
xgb1.set_params(min_child_weight=best_min_child_weight)
print gsearch2b.best_params_
print "\n gsearch2 finished"
#设置 gamma
param_test3 = {
'gamma':[i/100.0 for i in range(0,5)]
}
gsearch3 = GridSearchCV(estimator = xgb1,
param_grid = param_test3, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch3.fit(train[predictors],train[target1])
xgb1.set_params(gamma=gsearch3.best_params_["gamma"])
print gsearch3.best_params_
print "\ngsearch3 finished"
#subsample and colsample_bytree 粗调
param_test4 = {
'subsample':[i/10.0 for i in range(5,10)],
'colsample_bytree':[i/10.0 for i in range(5,10)]
}
gsearch4 = GridSearchCV(estimator = xgb1,
param_grid = param_test4, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch4.fit(train[predictors],train[target1])
xgb1.set_params(colsample_bytree=gsearch4.best_params_["colsample_bytree"])
xgb1.set_params(subsample=gsearch4.best_params_["subsample"])
print gsearch4.best_params_
print "\n gsearch4 finished"
# Tuning Regularization Parameters
param_test6 = {
'reg_alpha':[1e-5, 1e-2, 0.1, 1, 100]
}
gsearch6 = GridSearchCV(estimator = xgb1,
param_grid = param_test6, scoring='roc_auc',n_jobs=2,iid=False, cv=5)
gsearch6.fit(train[predictors],train[target1])
print gsearch6.best_params_
xgb1.set_params(reg_alpha=gsearch6.best_params_["reg_alpha"])
print "over"

#xgb1参数为网格最优了