我正在使用交叉验证训练模型,如下所示:
classifier = lgb.Booster(
params=params,
train_set=lgb_train_set,
)
result = lgb.cv(
init_model=classifier,
params=params,
train_set=lgb_train_set,
num_boost_round=1000,
early_stopping_rounds=20,
verbose_eval=50,
shuffle=True
)
我想继续训练模型多次运行第二个命令(可能有一个新的训练集或不同的参数),它会继续改进模型。
但是,当我尝试这一点时,很明显模型每次都是从头开始。
有没有不同的方法来做我想要的事情?
答案 0 :(得分:3)
要继续进行培训,您必须再次lgb.train
并确保包含参数init_model='model.txt'
。为确认您已正确完成,培训期间的信息反馈应从lgb.cv
继续。然后保存模型最佳迭代,如bst.save_model('model.txt', num_iteration=bst.best_iteration)
。
答案 1 :(得分:2)
似乎lightgbm不允许将模型实例作为init_model传递,因为它只需要文件名:
init_model (字符串或无,可选(默认=无)) - 用于继续培训的LightGBM模型或Booster实例的文件名。
答案 2 :(得分:2)
init_model
本身不起作用。我们必须为 keep_training_booster
方法设置 train
参数:
lgb_params = {
'keep_training_booster': True,
'objective': 'regression',
'verbosity': 100,
}
lgb.train(lgb_params, init_model= ...)
或者作为函数参数:
lgb.train(lgb_params, keep_training_booster=True, init_model= ...)
答案 3 :(得分:1)
可以使用lightgbm.train的 init_model 选项解决,该选项接受两个对象之一
代码说明:
import numpy as np
import lightgbm as lgb
data = np.random.rand(1000, 10) # 1000 entities, each contains 10 features
label = np.random.randint(2, size=1000) # binary target
train_data = lgb.Dataset(data, label=label, free_raw_data=False)
params = {}
#Initialize with 10 iterations
gbm_init = lgb.train(params, train_data, num_boost_round = 10)
print("Initial iter# %d" %gbm_init.current_iteration())
# Example of option #1 (pass a file):
gbm_init.save_model('model.txt')
gbm = lgb.train(params, train_data, num_boost_round = 10,
init_model='model.txt')
print("Option 1 current iter# %d" %gbm.current_iteration())
# Example of option #2 (pass a lightgbm Booster object):
gbm_2 = lgb.train(params, train_data, num_boost_round = 10,
init_model = gbm_init)
print("Option 2 current iter# %d" %gbm_2.current_iteration())
https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.train.html