在 sklearn 堆叠中使用时的 LightGBM 拟合参数



我正在使用 lightgbm 和 sklearnstacking方法,但我遇到了一个问题:

如何在函数LGBMRegressor.fit设置一些参数?

这是我现在的代码:

from sklearn.datasets import load_diabetes
from sklearn.linear_model import RidgeCV
from sklearn.svm import LinearSVR
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import StackingRegressor
from lightgbm import LGBMRegressor
X, y = load_diabetes(return_X_y=True)
estimators = [
('lr', RidgeCV()),
('svr', LinearSVR(random_state=42)),
('lgb', LGBMRegressor())
]
reg = StackingRegressor(
estimators=estimators,
final_estimator=RandomForestRegressor(n_estimators=10,
random_state=42)
)
reg.fit(X,Y)

但是我想在LGBMRegressor.fit中设置num_boost_roundearly_stopping_rounds,当我使用StackingRegressor.fit时,我如何实现这一目标

※注意事项 : 不使用堆叠方法,我可以用

lgb = LGBMRegressor()
lgb.fit(X,Y, num_boost_round=20000, early_stopping_rounds=1000)

我认为问题不在于您无法在适合中指定num_boost_roundearly_stopping_round。根据文档,这些参数不受官方支持,但如果使用它们,则会将它们放入实例化调用中。

lgb = LGBMRegressor(num_boost_round=20000, early_stopping_rounds=1000)

我认为问题是,如果您尝试使用early_stopping,则必须将评估集放入fit()调用中,这绝对不受支持(至少在当前版本中不受支持(。

你仍然可以得到你想要的东西,你只需要将你的模型包装到一个支持 API 的类中,本质上是将这些参数移动到对象实例化:

import lightgbm as ltb
class MyWrappedLGBR:
def __init__(self, fit_parameters: dict):
self.fit_parameters = fit_parameters
def fit(self, X, y):
my_data_set = ltb.Dataset(data = X, label=y)
ltb.train(params=self.fit_parameters, train_set=my_data_set)
def predict(self, X):
return self.model.predict(X)

并将估算器创建为:

my_params = {
'num_boost_round': 20000,
'early_stopping_rounds': 1000,
'valid_sets': your_validation_set
}
my_lgb = MyWrappedLGBR(my_params)

然后,当StackingRegressor调用fitpredict时,它将按照您想要的方式运行。

如果你真的想坚持使用 sklearn API,并且愿意冒着遇到意外行为的风险,你也可以在该 API 的脉络中创建一个包装类:

class MySKLWrappedLGBR:
def __init__(self, my_model, fit_parameters: dict):
self.model = my_model
self.fit_parameters = fit_parameters
def fit(self, X, y):
self.model.fit(X, y, **self.fit_parameters)
def predict(self, X):
return self.model.predict(X)

那么像这样的东西*可能会起作用:

lgb = LGBMRegressor(num_boost_round=20000, early_stopping_rounds=1000)
my_eval_params = {
'valid_sets': your_validation_set
}
my_wrapped_lgb = MySKLWrappedLGBR(lgb, my_eval_params)

但同样,Sklearn API 中没有正式支持这些功能,因此最好使用使用数据集 API 的早期包装类。

最新更新