XGBoost的参数介绍及调参
XGBoost参数解释
XGBoost的参数分为三大类:
通用参数
:根据需求宏观调控。Booster参数
:booster参数一般可以调控模型的效果和计算代价。我们所说的调参,很这是大程度上都是在调整booster参数。学习目标参数
:控制训练目标的表现。我们对于问题的划分主要体现在学习目标参数上。比如我们要做分类还是回归,做二分类还是多分类,这都是目标参数所提供的。
一、通用参数
booster
:我们有两种参数选择,gbtree和gblinear。gbtree是采用树的结构来运行数据,而gblinear是基于线性模型。silent
:静默模式,为1时模型运行不输出。nthread
: 使用线程数,一般我们设置成-1,使用所有线程。如果有需要,我们设置成多少就是用多少线程。
二、Booster参数
-
n_estimator
: 也作num_boosting_rounds
,这是生成的最大树的数目,也是最大的迭代次数。 -
learning_rate
: 有时也叫作eta
,系统默认值为0.3。学习率越大越快收敛,但是容易过拟合,索引我们一般设置为0.1. -
gamma
:系统默认为0,我们也常用0。
在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。gamma
指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。因为gamma
值越大的时候,损失函数下降更多才可以分裂节点。所以树生成的时候更不容易分裂节点。范围:[0,∞]
-
subsample
:系统默认为1。
这个参数控制对于每棵树,随机采样的比例。减小这个参数的值,算法会更加保守,避免过拟合。设置得过小可能会导致欠拟合。 典型值:0.5-1
,0.5
代表平均采样,防止过拟合。范围:(0,1]
,注意不可取0 -
colsample_bytree
:系统默认值为1。我们一般设置成0.8左右。用来控制每棵随机采样的列数的占比(类采样率)。 典型值:
0.5-1
.范围:(0,1]
。 -
colsample_bylevel
:默认为1,我们也设置为1.这个就相比于前一个更加细致了,它指的是每棵树每次节点分裂的时候列采样的比例。
-
max_depth
: 系统默认值为6我们常用3-10之间的数字。这个值为树的最大深度。这个值是用来控制过拟合的。max_depth越大,模型学习的更加具体。设置为0代表没有限制,范围:
[0,∞]
。 -
max_delta_step
:默认0,我们常用0.这个参数限制了每棵树权重改变的最大步长,如果这个参数的值为0,则意味着没有约束。如果他被赋予了某一个正值,则是这个算法更加保守。通常,这个参数我们不需要设置,但是当个类别的样本极不平衡的时候,这个参数对逻辑回归优化器是很有帮助的。
-
lambda
:也称reg_lambda
,默认值为0。权重的L1正则化项。可以减少过拟合。 -
alpha
:也称reg_alpha
默认为0。可以应用在高维度的情况下,使得算法更快。 -
scale_pos_weigh
t:默认为1
在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。通常可以将其设置为负样本的数目与正样本数目的比值。
二、学习目标函数
objective [objective = 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
的向量,其中的值是每个数据分为每个类的概率。
eval_metric [eval_metric=通过目标函数选择]
rmse
: 均方根误差mae
: 平均绝对值误差logloss
: negative log-likelihooderror
: 二分类错误率。其值通过错误分类数目与全部分类数目比值得到。对于预测,预测值大于0.5被认为是正类,其它归为负类。 error@t: 不同的划分阈值可以通过 ‘t’进行设置merror
: 多分类错误率,计算公式为 (wrong cases)/(all cases)mlogloss
: 多分类log损失auc
: 曲线下的面积
一般来说,我们都会使用xgboost.train(params, dtrain)
函数来训练我们的模型。这里的params
指的是booster
参数。
三、XGBoost调参
import xgboost as xgb
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import GridSearchCV
train_x, valid_x, train_y, valid_y = train_test_split(x_train, y_train, test_size=0.333, random_state=0) # 分训练集和验证集
# 这里不需要Dmatrix
parameters = {
'max_depth': [5, 10, 15, 20, 25],# 树的最大深度
'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15],# 学习率
'n_estimators': [500, 1000, 2000, 3000, 5000],# 最大迭代次数
'min_child_weight': [0, 2, 5, 10, 20],# 新分裂的节点样本权重停止分裂的最小阈值
'max_delta_step': [0, 0.2, 0.6, 1, 2],# 叶子输出的最大步长
'subsample': [0.6, 0.7, 0.8, 0.85, 0.95],# 样本采样率
'colsample_bytree': [0.5, 0.6, 0.7, 0.8, 0.9],# 列采样率
'reg_alpha': [0, 0.25, 0.5, 0.75, 1],# L2正则化
'reg_lambda': [0.2, 0.4, 0.6, 0.8, 1],# L1正则化
'scale_pos_weight': [0.2, 0.4, 0.6, 0.8, 1]# 样本不均衡时
}
xlf = xgb.XGBClassifier(max_depth=10,
learning_rate=0.01,
n_estimators=2000,
silent=True,
objective='binary:logistic',
nthread=-1,
gamma=0,
min_child_weight=1,
max_delta_step=0,
subsample=0.85,
colsample_bytree=0.7,
colsample_bylevel=1,
reg_alpha=0,
reg_lambda=1,
scale_pos_weight=1,
seed=1440,
missing=None)
# 有了gridsearch我们便不需要fit函数
gsearch = GridSearchCV(xlf, param_grid=parameters, scoring='accuracy', cv=3)
gsearch.fit(train_x, train_y)
print("Best score: %0.3f" % gsearch.best_score_)
print("Best parameters set:")
best_parameters = gsearch.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
print("\t%s: %r" % (param_name, best_parameters[param_name]))