参数设置
params = {'boosting_type':'gbdt',
'objective':'binary',
'random_state':42,
'num_leaves':31,
'max_depth':-1,
'learning_rate': 0.01,
'n_estimators':100,
'min_child_sample':200,
'min_child_weight':1e-3,
'linear_tree':False,
'bagging_freq':0,
'bagging_fraction': 0.50,
'feature_fraction':1.0,
'lambda_l1':0.0,
'lambda_l2': 2,
'max_bin':255,
'metric':['auc','binary_logloss'],
'feval':None
}
首先是必设参数:
boosting_type: 可选 ‘gbdt’:梯度提升树, ’dart‘:带dropout的gbdt, ’goss‘:较轻的gbdt, ’rf‘:随机森林。
gbdt是一种基于迭代的决策树算法,且公认的泛化能力较强的算法,因此被金融科技领域尤其构建风控模型常用的算法。gbdt 三个核心观点:回归树,gbdt累加所有树的结果作为输出,而不是一个树的结果;梯度迭代,gbdt的每棵树都是以之前的树的残差来更新目标值,这样才能使得所有树的值相加得到最终预测值; 缩减,gbdt每走一步都小心谨慎,绝不相信任何一棵残差树,而是不断的逼近结果来避免过拟合。
dart树则是处理gbdt存在过度专门化的问题,这就使得下一棵迭代树智慧影响UI少数实例的预测,从而提高性能。
goss树又叫基于梯度的单边采样。他以一个大的梯度保存所有数据,并对一个小梯度数据进行随机抽样,从而避免搜寻整个搜索空间,加快了收敛。
objective:默认值:regression,选项 regression,regression_l1,huber,fair,poisson,quantile,mape,gamma,tweedie,binary,multiclassmulticlassova,cross_entropy,cross_entropy_lambda,lambdarank,rank_xendcg。
n_estimators/num_iterations/num_boost_round:默认值= 100,类型=整数,num_iterations> = 0。提升迭代的次数。
learning_rate:默认值 0.1, 一般我设置为0.01,从一个较小的学习速率开始;
max_depth:默认-1,类型为整型。限制树模型的最大深度。当#data较小时,这用于处理过度拟合。树木仍在向叶生长。 <= 0表示没有限制;
bagging_freq:默认值 0,类型 int,别名:subsample_freq。0表示禁用bagging; k表示每k次迭代执行bagging。每进行到第k次迭代,LightGBM就会随机选择bagging_fraction * 100%的数据用于接下来的k次迭代
bagging_fraction 每次迭代时用的数据比例 用于加快训练速度和减小过拟合
feature_fraction:默认值:1.0,类型:双精度,别名:sub_feature,colsample_bytree,约束条件:0.0 <feature_fraction <= 1.0。如果feature_fraction小于1.0,LightGBM将在每次迭代(树)上随机选择特征子集。例如,如果将其设置为0.8,LightGBM将在训练每棵树之前选择80%的特征。
min_child_samples/min_data_in_leaf:默认值= 20,类型=整数,约束:min_data_in_leaf> = 0。一片叶子中的数据数量最少。可用于处理过度拟合
min_child_weight: 一个叶子上的最小hessian和。默认设置为0.001,一般设置为1。不建议调整,增大数值会得到较浅的树深。
linear_tree:默认false
lambda_l1: L1正则化权重项,增加此值将使模型更加保守。
lambda_l2: L2正则化权重项,增加此值将使模型更加保守。
max_bin:默认值 255,类型:整数,约束:max_bin> 1。可以存储特征值的最大箱数; 少量的箱数可能会降低训练的准确性,但可能会增加总体力量(应对过度拟合);LightGBM将根据max_bin自动压缩内存。例如,如果max_bin = 255,LightGBM将使用uint8_t作为特征值。
metric:用于指定评估指标,可以传递各种评估方法组成的list
fevel:自定义评估指标。
random_state:设置随机种子确保模型不发生改变。
总结部分参数常用设置与调节策略
boosting_type: 推荐使用’gbdt‘;
learning_rate: 推荐的候选值为:[0.01, 0.015, 0.025, 0.05, 0.1],一般先选一个较小的学习速率,再按情况逐步增大;
max_depth:推荐的数值为:[3, 5, 6, 7, 9, 12, 15, 17, 25];
num_leaves: 此参数的数值应该小于 2max_depth2^{max_depth}2max_depth;
feature_fraction / colsample_bytree:推荐的候选值为:[0.6, 0.7, 0.8, 0.9, 1];
bagging_fraction / subsample:推荐的候选值为:[0.6, 0.7, 0.8, 0.9, 1];
lambda_l1:推荐的候选值为:[0, 0.010.1, 1]
lambda_l2:推荐的候选值为:[0, 0.1, 0.5, 1]
按经验预先固定的参数
learning_rate
n_estimators
min_split_gain
min_child_sample
min_child_weight
需要算法调节的参数
max_depth
num_leaves
subsample
colsample_bytree
reg_alpha
reg_lambda
具体应该怎么设置还需大家多多尝试,总结自己的规律,目前为止我没有发现网上有人会给一个固定调参思路。
lgb中数据在使用前,需要经过Dataset处理。
train_X,train_y = train[use_features],train['y']
test_X,test_y = test[use_features],test['y']
oot_X,oot_y = oot[use_features],oot['y']
lgb_train = lgb.Dataset(train_X, train_y)
lgb_eval = lgb.Dataset(test_X, test_y, reference=None)
开始训练模型
gbm = lgb.train(params,
lgb_train,
num_boost_round=5000, # 也是n_estimators
valid_sets=[lgb_train, lgb_eval],
early_stopping_rounds=100,
verbose_eval=100,)
输出模型分
predict_train = gbm.predict(train_X)
predict_test = gbm.predict(test_X)
predict_oot = gbm.predict(oot_X)
评估模型
评估指标
def ks(preds,y):
get_ks = lambda preds,y: ks_2samp(preds[y==1], preds[y!=1]).statistic
ks=get_ks(preds,y)
return ks
def gini(preds,y):
roc_auc = roc_auc_score(y,preds)
gini=2*roc_auc-1
return gini
输出评估结果(gini,ks,auc)
ks
print(‘===============oot==================’)
print(“gini: ”,gini(predict_oot,oot_y))
print(‘ks: ’,ks(predict_oot,oot_y))
print(‘auc: ’,roc_auc_score(oot_y,predict_oot))
print(‘===============train==================’)
print(“gini: ”,gini(predict_train,train_y))
print(‘ks: ’,ks(predict_train,train_y))
print(‘auc: ’,roc_auc_score(train_y,predict_train))
print(‘===============test==================’)
print(“gini: ”,gini(predict_test,test_y))
print(‘ks: ’,ks(predict_test,test_y))
print(‘auc: ’,roc_auc_score(test_y,predict_test))
===============oot==================
gini: 0.891242280757335
ks: 0.7566781973671567
auc: 0.9456211403786675
===============train==================
gini: 0.9296916065564531
ks: 0.8197791423429954
auc: 0.9648458032782266
===============test==================
gini: 0.8949423005648665
ks: 0.7797995703832205
auc: 0.9474711502824332