XGBoost的参数一共分为三类:
Note: 我下面介绍的参数都是我觉得比较重要的, 完整参数请戳官方文档
booster
:我们有两种参数选择,gbtree
和gblinear
。gbtree是采用树的结构来运行数据,而gblinear是基于线性模型。silent
:静默模式,为1
时模型运行不输出。nthread
: 使用线程数,一般我们设置成-1
,使用所有线程。如果有需要,我们设置成多少就是用多少线程。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
。
权重的L2正则化项。(和Ridge regression类似)。这个参数是用来控制XGBoost的正则化部分的。这个参数在减少过拟合上很有帮助。
alpha
:也称reg_alpha
默认为0
,
权重的L1正则化项。(和Lasso regression类似)。 可以应用在很高维度的情况下,使得算法的速度更快。
scale_pos_weight
:默认为1
在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。通常可以将其设置为负样本的数目与正样本数目的比值。
objective [缺省值=reg:linear]
reg:linear
– 线性回归reg:logistic
– 逻辑回归binary:logistic
– 二分类逻辑回归,输出为概率binary:logitraw
– 二分类逻辑回归,输出的结果为wTxcount: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 [缺省值=通过目标函数选择]
rmse
: 均方根误差mae
: 平均绝对值误差logloss
: negative log-likelihooderror
: 二分类错误率。其值通过错误分类数目与全部分类数目比值得到。对于预测,预测值大于0.5被认为是正类,其它归为负类。 error@t: 不同的划分阈值可以通过 ‘t’进行设置merror
: 多分类错误率,计算公式为(wrong cases)/(all cases)mlogloss
: 多分类log损失auc
: 曲线下的面积ndcg
: Normalized Discounted Cumulative Gainmap
: 平均正确率一般来说,我们都会使用xgboost.train(params, dtrain)
函数来训练我们的模型。这里的params
指的是booster
参数。
import xgboost as xgb
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
train_data = pd.read_csv('train.csv') # 读取数据
y = train_data.pop('30').values # 用pop方式将训练数据中的标签值y取出来,作为训练目标,这里的‘30’是标签的列名
col = train_data.columns
x = train_data[col].values # 剩下的列作为训练数据
train_x, valid_x, train_y, valid_y = train_test_split(x, y, 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],
'reg_lambda': [0.2, 0.4, 0.6, 0.8, 1],
'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]))
我们都知道,XGBoost 一共有三类参数通用参数,学习目标参数,Booster参数,那么对于LightGBM,我们有核心参数,学习控制参数,IO参数,目标参数,度量参数,网络参数,GPU参数,模型参数,这里我常修改的便是核心参数,学习控制参数,度量参数等。更详细的请看LightGBM中文文档
boosting
:也称boost
,boosting_type
.默认是gbdt
。
LGB里面的boosting参数要比xgb多不少,我们有传统的gbdt
,也有rf
,dart
,doss
,最后两种不太深入理解,但是试过,还是gbdt的效果比较经典稳定
gbdt
, 传统的梯度提升决策树rf
, Random Forest (随机森林)dart
, Dropouts meet Multiple Additive Regression Treesgoss
, Gradient-based One-Side Sampling (基于梯度的单侧采样)num_thread
:也称作num_thread
,nthread
.指定线程的个数。
这里官方文档提到,数字设置成cpu内核数比线程数训练效更快(考虑到现在cpu大多超线程)。并行学习不应该设置成全部线程,这反而使得训练速度不佳。
application
:默认为regression
。,也称objective
, app
这里指的是任务目标
regression_l2
, L2 loss, alias=regression, mean_squared_error, mseregression_l1
, L1 loss, alias=mean_absolute_error, maehuber
, Huber lossfair
, Fair losspoisson
, Poisson regressionquantile
, Quantile regressionquantile_l2
, 类似于 quantile, 但是使用了 L2 lossmulticlass
, softmax 目标函数, 应该设置好 num_class
multiclassova
, One-vs-All 二分类目标函数, 应该设置好 num_class
xentropy
, 目标函数为 cross-entropy (同时有可选择的线性权重), alias=cross_entropyxentlambda
, 替代参数化的 cross-entropy, alias=cross_entropy_lambdalabel_gain
可以被用来设置 int 标签的增益 (权重)valid
:验证集选用,也称test
,valid_data
, test_data
.支持多验证集,以,
分割
learning_rate
:也称shrinkage_rate
,梯度下降的步长。默认设置成0.1,我们一般设置成0.05-0.2
之间
num_leaves
:也称num_leaf
,新版lgb将这个默认值改成31,这代表的是一棵树上的叶子数
num_iterations
:也称num_iteration
, num_tree
, num_trees,
num_round
, num_rounds
,num_boost_round
。迭代次数
device
:default=cpu, options=cpu, gpu
max_depth
-1
, type=int限制树模型的最大深度. 这可以在 #data
小的情况下防止过拟合. 树仍然可以通过 leaf-wise 生长.< 0
意味着没有限制.feature_fraction
:default=1.0, type=double, 0.0 < feature_fraction < 1.0, 也称sub_feature
, colsample_bytree
bagging_fraction
:default=1.0, type=double, 0.0 < bagging_fraction < 1.0, 也称sub_row
, subsample
bagging_freq
: default=0, type=int, 也称subsample_freq
lambda_l1
:默认为0,也称reg_alpha,表示的是L1正则化,double类型
lambda_l2
:默认为0,也称reg_lambda,表示的是L2正则化,double类型
cat_smooth
: default=10, type=double
min_data_in_leaf
, 默认为20。 也称min_data_per_leaf
, min_data
, min_child_samples
。
一个叶子上数据的最小数量。可以用来处理过拟合。
min_sum_hessian_in_leaf
, default=1e-3
, 也称min_sum_hessian_per_leaf
, min_sum_hessian
, min_hessian
, min_child_weight
。
min_data_in_leaf
, 可以用来处理过拟合.early_stopping_round
, 默认为0, type=int, 也称early_stopping_rounds
, early_stopping
。
如果一个验证集的度量在 early_stopping_round
循环中没有提升, 将停止训练、
min_split_gain
, 默认为0, type=double, 也称
min_gain_to_split`。执行切分的最小增益。
max_bin
:最大直方图数目,默认为255,工具箱的最大数特征值决定了容量 工具箱的最小数特征值可能会降低训练的准确性, 但是可能会增加一些一般的影响(处理过拟合,越大越容易过拟合)。
max_bin
自动压缩内存。 例如, 如果 maxbin=255, 那么 LightGBM 将使用 uint8t 的特性值。subsample_for_bin
bin_construct_sample_cnt
, 默认为200000, 也称subsample_for_bin
。用来构建直方图的数据的数量。metric
: default={l2 for regression}, {binary_logloss for binary classification}, {ndcg for lambdarank}, type=multi-enum, options=l1, l2, ndcg, auc, binary_logloss, binary_error …
l1
, absolute loss, alias=mean_absolute_error, mael2
, square loss, alias=mean_squared_error, msel2_root
, root square loss, alias=root_mean_squared_error, rmsequantile
, Quantile regressionhuber
, Huber lossfair
, Fair losspoisson
, Poisson regressionndcg
, NDCGmap
, MAPauc
, AUCbinary_logloss
, log lossbinary_error
, 样本: 0 的正确分类, 1 错误分类multi_logloss
, mulit-class 损失日志分类multi_error
, error rate for mulit-class 出错率分类xentropy
, cross-entropy (与可选的线性权重), alias=cross_entropyxentlambda
, “intensity-weighted” 交叉熵, alias=cross_entropy_lambdakldiv
, Kullback-Leibler divergence, alias=kullback_leibler总的来说,我还是觉得LightGBM比XGBoost用法上差距不大。参数也有很多重叠的地方。很多XGBoost的核心原理放在LightGBM上同样适用。 同样的,Lgb也是有train()函数和LGBClassifier()与LGBRegressor()函数。后两个主要是为了更加贴合sklearn的用法,这一点和XGBoost一样。
mport pandas as pd
import lightgbm as lgb
from sklearn.grid_search import GridSearchCV # Perforing grid search
from sklearn.model_selection import train_test_split
train_data = pd.read_csv('train.csv') # 读取数据
y = train_data.pop('30').values # 用pop方式将训练数据中的标签值y取出来,作为训练目标,这里的‘30’是标签的列名
col = train_data.columns
x = train_data[col].values # 剩下的列作为训练数据
train_x, valid_x, train_y, valid_y = train_test_split(x, y, test_size=0.333, random_state=0) # 分训练集和验证集
train = lgb.Dataset(train_x, train_y)
valid = lgb.Dataset(valid_x, valid_y, reference=train)
parameters = {
'max_depth': [15, 20, 25, 30, 35],
'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15],
'feature_fraction': [0.6, 0.7, 0.8, 0.9, 0.95],
'bagging_fraction': [0.6, 0.7, 0.8, 0.9, 0.95],
'bagging_freq': [2, 4, 5, 6, 8],
'lambda_l1': [0, 0.1, 0.4, 0.5, 0.6],
'lambda_l2': [0, 10, 15, 35, 40],
'cat_smooth': [1, 10, 15, 20, 35]
}
gbm = lgb.LGBMClassifier(boosting_type='gbdt',
objective = 'binary',
metric = 'auc',
verbose = 0,
learning_rate = 0.01,
num_leaves = 35,
feature_fraction=0.8,
bagging_fraction= 0.9,
bagging_freq= 8,
lambda_l1= 0.6,
lambda_l2= 0)
# 有了gridsearch我们便不需要fit函数
gsearch = GridSearchCV(gbm, 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]))
max_bin
num_leaves
min_data_in_leaf
和 min_sum_hessian_in_leaf
bagging_fraction
和 bagging_freq
来使用 baggingfeature_fraction
<1来使用特征抽样lambda_l1
, lambda_l2
和 min_gain_to_split
来使用正则max_depth
来避免生成过深的树XGBoost | LightGBM | 范围 | |
---|---|---|---|
叶子数 | num_leaves,默认为 | num_leaves | range(35,65,5) |
树深 | max_depth,默认为6 | max_depth | range(3,10,2) |
样本抽样 | subsample | bagging_fraction,subsample | [i/10.0 for i in range(6,10)] |
特征抽样 | colsample_bytree | feature_fraction,colsample_bytree | [i/10.0 for i in range(6,10)] |
L1正则化 | alpha,reg_alpha | lambda_l2,reg_alpha | [1e-5, 1e-2, 0.1, 1, 2,2.5,3] |
L2正则化 | lambda,reg_lambda | lambda_l1,reg_lambda | [1e-5, 1e-2, 0.1, 1, 2,2.5,3] |
1、当GridSearch遇上XGBoost 一段代码解决调参问题
2、LightGBM核心解析与调参
3、 LightGBM 中文文档
4、 LightGBM英文文档
5、 【集成学习】lightgbm调参案例