Keras 如何在VotingRegression中添加带有ML模型的神经网络模型?

Keras 如何在VotingRegression中添加带有ML模型的神经网络模型?,keras,regression,valueerror,ensemble-learning,voting,Keras,Regression,Valueerror,Ensemble Learning,Voting,问题的背景 我试图使用Keras回归器模型和ML模型,例如Lasso,Gradient Boost回归器,以建立一个集成方法。我使用sklearn的VotingRegressor函数对模型进行分组。然而,当我在VotingRegressionor中添加KerasRegressionor模型时,我得到以下错误 ValueError:估计器Keras回归器应为回归器 我是如何试图解决这个问题的 我在谷歌上搜索的错误,我只找到了我没有找到解决方案的地方。此外,我还试图理解凯拉斯回归者的作用。但是,我不

问题的背景

我试图使用Keras回归器模型和ML模型,例如Lasso,Gradient Boost回归器,以建立一个集成方法。我使用sklearn的VotingRegressor函数对模型进行分组。然而,当我在VotingRegressionor中添加KerasRegressionor模型时,我得到以下错误

ValueError:估计器Keras回归器应为回归器

我是如何试图解决这个问题的

我在谷歌上搜索的错误,我只找到了我没有找到解决方案的地方。此外,我还试图理解凯拉斯回归者的作用。但是,我不知道为什么会出现错误,因为文档中说这是针对Keras的scikit learn regressor API的实现

那么,我的问题是

我为什么会出现错误?我能做些什么来解决它

任何帮助都将不胜感激:。谢谢

因此,没有使用keras作为sklearn包装器的解决方案不会被维护并将被删除

幸运的是,这个包解决了这个问题

我建议您阅读文档,但这里有一个使用子类的简单示例:

!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)
VotingRegressionRestimators=['lr', 线性回归系数X=True,拟合系数X=True, n_jobs=None,normalize=False, “MLPReg”, MLPRegressorbatch\u size=None,build\u fn=None,callbacks=None,epochs=20,hidden\u layer\u size=100,, 损失=无,指标=无,模型=无,优化器='adam', random_state=None,run_急切地=False,shuffle=True, 验证\批处理\大小=无,验证\拆分=0.0,详细=0, 热启动=假], n_作业=无,权重=无

因此,没有解决方案使用keras作为sklearn包装器,因此不会维护并将其删除

幸运的是,这个包解决了这个问题

我建议您阅读文档,但这里有一个使用子类的简单示例:

!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)
VotingRegressionRestimators=['lr', 线性回归系数X=True,拟合系数X=True, n_jobs=None,normalize=False, “MLPReg”, MLPRegressorbatch\u size=None,build\u fn=None,callbacks=None,epochs=20,hidden\u layer\u size=100,, 损失=无,指标=无,模型=无,优化器='adam', random_state=None,run_急切地=False,shuffle=True, 验证\批处理\大小=无,验证\拆分=0.0,详细=0, 热启动=假], n_作业=无,权重=无


我检查了github问题,发现只有第三方软件包作为解决方案谢谢你,Yefet。是的,我也这么认为。我检查了github问题,发现只有第三方软件包作为解决方案。谢谢你,是的。是的,我也这么认为。嗨,Yefet,非常感谢你。MLPREGESSOR的工作方式很有魅力。然而,我没有得到我的答案,为什么KerasRegressor不起作用KerasRegressionor不具有“\u estimator\u type”属性的问题解决了这一问题。您好,能否将Scikeras的文档链接更新为?谢谢@爱情密码完成了!同时也感谢你制作了这个软件包Hi Yefet,非常感谢。MLPREGESSOR的工作方式很有魅力。然而,我没有得到我的答案,为什么KerasRegressor不起作用KerasRegressionor不具有“\u estimator\u type”属性的问题解决了这一问题。您好,能否将Scikeras的文档链接更新为?谢谢@爱情密码完成了!同时也感谢你制作了这个软件包