两种的底层都是一致的
import lightgbm as lgb
import lightgbm as lgb
zh_doc python包的相关介绍
LightGBM Python 模块能够使用以下几种方式来加载数据:
np 2D array形式:
data = np.random.rand(500, 10) # 500 个样本, 每一个包含 10 个特征
label = np.random.randint(2, size=500) # 二元目标变量, 0 和 1
train_data = lgb.Dataset(data, label=label)
还可以:指定 feature names(特征名称)和 categorical features(分类特征)、设置权重、分数等
【具体见文档zh_doc python包的相关介绍】
LightGBM 可以使用一个 pairs 的 list 或一个字典来设置参数. 例如:
Booster(提升器)参数:
param = {'num_leaves':31, 'num_trees':100, 'objective':'binary'}
param['metric'] = 'auc'
您还可以指定多个 eval 指标:
param['metric'] = ['auc', 'binary_logloss']
训练
param_list、train_dataset是必需的
num_round = 10
bst = lgb.train(param, train_data, num_round, valid_sets=[test_data])
LightGBM 也支持加权训练,它需要一个额外的 加权数据 。 它需要额外的 query 数据 用于排名任务。
支持交叉验证
num_round = 10
lgb.cv(param, train_data, num_round, nfold=5)
支持提前停止
valid_sets:至少有一个. 如果有多个,它们都会被使用(如果有一个验证集)。
该模型将开始训练, 直到验证得分停止提高为止. 验证错误需要至少每个 early_stopping_rounds 减少以继续训练.
如果提前停止, 模型将有 1 个额外的字段: bst.best_iteration. 请注意 train() 将从最后一次迭代中返回一个模型, 而不是最好的一个.
如果您指定多个评估指标, 则它们都会用于提前停止.
bst = lgb.train(param, train_data, num_round, valid_sets=valid_sets, early_stopping_rounds=10)
bst.save_model('model.txt', num_iteration=bst.best_iteration)
预测
# 7 个样本, 每一个包含 10 个特征
data = np.random.rand(7, 10)
ypred = bst.predict(data)
如果在训练过程中启用了提前停止, 可以用 bst.best_iteration 从最佳迭代中获得预测结果:
ypred = bst.predict(data, num_iteration=bst.best_iteration)
在训练完成后, 可以使用如下方式来存储模型:
bst.save_model('model.txt')
训练后的模型也可以转存为 JSON 的格式:
json_model = bst.dump_model()
以保存模型也可以使用如下的方式来加载.
bst = lgb.Booster(model_file='model.txt') #init model
[具体见文档zh_doc python包的相关介绍]
lightgbm.sklearn.LGBMClassifier()
同sklearn方式
fit函数包含了早停等
LightGBM 使用 leaf-wise 的树生长策略, 而很多其他流行的算法采用 depth-wise 的树生长策略. 与 depth-wise 的树生长策略相较, leaf-wise 算法可以收敛的更快. 但是, 如果参数选择不当的话, leaf-wise 算法有可能导致过拟合.
zh_doc 参数优化
num_leaves
控制树模型复杂度的主要参数。应让其小于2^(max_depth)
,因为depth
的概念在 leaf-wise 树中并没有多大作用,并不存在从leaves
到depth
的映射
min_data_in_leaf
用于处理过拟合,该值取决于训练样本数和num_leaves
,几百或几千即可。设置较大避免生成一个过深的树,可能导致欠拟合。
min_data_in_leaf
, default=20
, type=int, alias=min_data_per_leaf
, min_data
, min_child_samples
max_depth
显示限制树的深度
bagging_fraction
和 bagging_freq
参数来使用 bagging 方法feature_fraction
参数来使用特征的子抽样max_bin
save_binary
在未来的学习过程对数据加载进行加速max_bin
(学习速度可能变慢)learning_rate
和较大的 num_iterations
num_leaves
(可能导致过拟合)dart
max_bin
num_leaves
min_data_in_leaf
和 min_sum_hessian_in_leaf
bagging_fraction
和 bagging_freq
来使用 baggingfeature_fraction
来使用特征子抽样lambda_l1
, lambda_l2
和 min_gain_to_split
来使用正则max_depth
来避免生成过深的树LightGBM 调参方法(具体操作)
LightGBM 训练及调参
zh_doc 参数
可以查看参数的别名和说明,如果调参出现重名,就会报warning。如:
lambda_l1 is set=0, reg_alpha=0.0 will be ignored. Current value: lambda_l1=0
对于基于决策树的模型,调参的方法都是大同小异。一般都需要如下步骤:
other_params = {'num_leaves': 31, 'objective': None, 'learning_rate': 0.1, 'max_depth': -1, 'reg_alpha': 0.0,
'reg_lambda': 0.0, 'n_estimators': 100, 'boosting_type': 'gbdt', 'device': 'gpu',
'min_child_samples': 20, 'subsample': 1.0, 'subsample_freq': 0, 'colsample_bytree': 1.0,
'class_weight': None, 'importance_type': 'split',
'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_jobs': -1, 'random_state': None,
'subsample_for_bin': 200000, 'silent': True}
data_list_dict = get_data_np_dict(cell_name, feature_name, method_name)
# 第一次:max_depth、num_leaves
print("第一次")
cv_params = {'max_depth': [-1, 0, 3, 4, 5, 6, 7, 8], 'num_leaves': range(21, 200, 10)}
# cv_params = {'max_depth': range(3, 8, 4), 'num_leaves': range(5, 100, 45)}
best_params = lgb_grid_greedy(cv_params, other_params, '1')
other_params.update(best_params)
# 第二次
print("第二次")
cv_params = {'max_bin': range(5, 256, 10), 'min_child_samples': range(10, 201, 10)}
# cv_params = {'max_bin': range(5, 256, 100), 'min_child_samples': range(1, 102, 50)}
# cv_params = {'max_depth': [3, 4, ], 'min_child_weight': [1, 2, ]}
best_params = lgb_grid_greedy(cv_params, other_params, '2')
other_params.update(best_params)
# print(other_params)
# 第三次
print("第三次")
cv_params = {'colsample_bytree': [0.6, 0.7, 0.8, 0.9, 1.0],
'subsample': [0.6, 0.7, 0.8, 0.9, 1.0],
'subsample_freq': range(0, 81, 10)
}
# cv_params = {'colsample_bytree': [0.6, 0.7, ],
# 'subsample': [0.6, 0.7, ],
# 'subsample_freq': range(0, 81, 40)
# }
best_params = lgb_grid_greedy(cv_params, other_params, '3')
other_params.update(best_params)
# print(other_params)
# 第四次
print("第四次")
cv_params = {'reg_alpha': [1e-5, 1e-3, 1e-1, 0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0],
'reg_lambda': [1e-5, 1e-3, 1e-1, 0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0]
}
# cv_params = {'reg_alpha': [1e-5, 1e-3, ],
# 'reg_lambda': [1e-5, 1e-3, ]
# }
best_params = lgb_grid_greedy(cv_params, other_params, '4')
other_params.update(best_params)
# print(other_params)
# 第五次
print("第五次")
cv_params = {'min_split_gain': [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]}
# cv_params = {'min_split_gain': [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]}
best_params = lgb_grid_greedy(cv_params, other_params, '5')
other_params.update(best_params)
# print(other_params)
# 第六次
print("第六次")
cv_params = {'learning_rate': [0.001, 0.01, 0.05, 0.07, 0.1, 0.2, 0.5, 0.75, 1.0]}
# cv_params = {'learning_rate': [0.01, 0.05, ]}
best_params = lgb_grid_greedy(cv_params, other_params, '6')
other_params.update(best_params)
# print(other_params)