如何在 VotingRegressor 中添加带有 ML 模型的神经网络模型?
How to add a neural network model with ML models in VotingRegressor?
问题背景
我试图将 KerasRegressor
模型与 ML 模型(例如 Lasso、Gradient Boost Regressor)结合使用以构建集成方法。我使用 sklearn 的 VotingRegressor()
函数对模型进行分组。但是,当我在 VotingRegressor()
中添加 KerasRegressor
模型时,出现以下错误。
ValueError: The estimator KerasRegressor should be a regressor.
我是如何尝试解决问题的?
我根据错误在 google 上搜索,我只找到了 KerasRegressor
的 this page where I do not find the solution. Moreover, I tried to understand the document。但是,我不知道为什么我会收到错误,因为文档说 它是针对 Keras.
的 scikit-learn 回归器 API 的实现
那么,我的问题
为什么我会收到错误消息,我该如何解决?
任何帮助将不胜感激:)。谢谢!
从这个issue没有使用keras的解决方案,因为sklearn wrapper没有维护,将被删除
幸运的是scikeras包解决了这个问题。
我建议您阅读文档或 tutorials 但这里有一个使用子类化的简单示例:
!pip install scikeras
import scikeras
from tensorflow import keras
from sklearn.datasets import make_regression
from sklearn.ensemble import VotingRegressor
from sklearn.linear_model import LinearRegression
class MLPRegressor(KerasRegressor):
def __init__(
self,
hidden_layer_sizes=(100, ),
optimizer="adam",
optimizer__learning_rate=0.001,
epochs=10,
verbose=0,
**kwargs,
):
super().__init__(**kwargs)
self.hidden_layer_sizes = hidden_layer_sizes
self.optimizer = optimizer
self.epochs = epochs
self.verbose = verbose
def _keras_build_fn(self, compile_kwargs):
model = keras.Sequential()
inp = keras.layers.Input(shape=(self.n_features_in_))
model.add(inp)
for hidden_layer_size in self.hidden_layer_sizes:
layer = keras.layers.Dense(hidden_layer_size, activation="relu")
model.add(layer)
out = keras.layers.Dense(1)
model.add(out)
model.compile(loss="mse", optimizer=compile_kwargs["optimizer"])
return model
# simple linear regression
r1 = LinearRegression()
# keras model wrapper
r2= MLPRegressor(epochs=20)
X = (y/2).reshape(-1, 1)
y = np.arange(100)
#defining votting classifier
vr = VotingRegressor([('lr', r1), ('MLPReg', r2)])
vr.fit(X,y)
VotingRegressor(estimators=[('lr',
LinearRegression(copy_X=True, fit_intercept=True,
n_jobs=None, normalize=False)),
('MLPReg',
MLPRegressor(batch_size=None, build_fn=None, callbacks=None, epochs=20, hidden_layer_sizes=(100,),
loss=None, metrics=None, model=None, optimizer='adam',
random_state=None, run_eagerly=False, shuffle=True,
validation_batch_size=None, validation_split=0.0, verbose=0,
warm_start=False))],
n_jobs=None, weights=None)
问题背景
我试图将 KerasRegressor
模型与 ML 模型(例如 Lasso、Gradient Boost Regressor)结合使用以构建集成方法。我使用 sklearn 的 VotingRegressor()
函数对模型进行分组。但是,当我在 VotingRegressor()
中添加 KerasRegressor
模型时,出现以下错误。
ValueError: The estimator KerasRegressor should be a regressor.
我是如何尝试解决问题的?
我根据错误在 google 上搜索,我只找到了 KerasRegressor
的 this page where I do not find the solution. Moreover, I tried to understand the document。但是,我不知道为什么我会收到错误,因为文档说 它是针对 Keras.
那么,我的问题
为什么我会收到错误消息,我该如何解决?
任何帮助将不胜感激:)。谢谢!
从这个issue没有使用keras的解决方案,因为sklearn wrapper没有维护,将被删除
幸运的是scikeras包解决了这个问题。
我建议您阅读文档或 tutorials 但这里有一个使用子类化的简单示例:
!pip install scikeras
import scikeras
from tensorflow import keras
from sklearn.datasets import make_regression
from sklearn.ensemble import VotingRegressor
from sklearn.linear_model import LinearRegression
class MLPRegressor(KerasRegressor):
def __init__(
self,
hidden_layer_sizes=(100, ),
optimizer="adam",
optimizer__learning_rate=0.001,
epochs=10,
verbose=0,
**kwargs,
):
super().__init__(**kwargs)
self.hidden_layer_sizes = hidden_layer_sizes
self.optimizer = optimizer
self.epochs = epochs
self.verbose = verbose
def _keras_build_fn(self, compile_kwargs):
model = keras.Sequential()
inp = keras.layers.Input(shape=(self.n_features_in_))
model.add(inp)
for hidden_layer_size in self.hidden_layer_sizes:
layer = keras.layers.Dense(hidden_layer_size, activation="relu")
model.add(layer)
out = keras.layers.Dense(1)
model.add(out)
model.compile(loss="mse", optimizer=compile_kwargs["optimizer"])
return model
# simple linear regression
r1 = LinearRegression()
# keras model wrapper
r2= MLPRegressor(epochs=20)
X = (y/2).reshape(-1, 1)
y = np.arange(100)
#defining votting classifier
vr = VotingRegressor([('lr', r1), ('MLPReg', r2)])
vr.fit(X,y)
VotingRegressor(estimators=[('lr', LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)), ('MLPReg', MLPRegressor(batch_size=None, build_fn=None, callbacks=None, epochs=20, hidden_layer_sizes=(100,), loss=None, metrics=None, model=None, optimizer='adam', random_state=None, run_eagerly=False, shuffle=True, validation_batch_size=None, validation_split=0.0, verbose=0, warm_start=False))], n_jobs=None, weights=None)