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

问题描述

问题背景

为了构建集成方法,我尝试将 KerasRegressor 模型与 ML 模型(例如 Lasso、Gradient Boost Regressor)结合使用。我使用 sklearn 的 VotingRegressor() 函数对模型进行分组。但是,当我在 KerasRegressor添加 VotingRegressor() 模型时,出现以下错误

ValueError:估计器 KerasRegressor 应该是一个回归器。

我是如何尝试解决问题的?

我通过错误在谷歌上搜索,我只找到了 this page 没有找到解决方案。此外,我试图理解 KerasRegressordocument。但是,我不知道为什么会出现错误,因为文档说它是 Keras 的 scikit-learn 回归器 API 的实现

那么,我的问题

为什么我会收到错误消息,我该如何解决

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

解决方法

从此 issue 中没有使用 keras 的解决方案,因为 sklearn 包装器未维护并将被删除

幸运的是 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',线性回归(copy_X=True,fit_intercept=True, n_jobs=None,normalize=False)),MLPRegressor(batch_size=None,build_fn=None,callbacks=None,epochs=20,hidden_​​layer_sizes=(100,损失=无,指标=无,模型=无,优化器='adam', random_state=None,run_eagerly=False,shuffle=True, validation_batch_size=无,validation_split=0.0,详细=0, warm_start=False))],n_jobs=无,权重=无)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...