【问题标题】:How to add a neural network model with ML models in VotingRegressor?如何在 VotingRegressor 中添加带有 ML 模型的神经网络模型?
【发布时间】:2021-07-06 13:00:56
【问题描述】:

问题的背景

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

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

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

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

那么,我的问题

我为什么会收到错误,我可以做些什么来解决它?

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

【问题讨论】:

  • 我检查了 github 问题,发现只有 3rd 方包作为解决方案
  • 谢谢叶菲特。是的,我也这么认为。

标签: keras regression valueerror ensemble-learning voting


【解决方案1】:

从此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(估算器=[('lr', 线性回归(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,), 损失=无,指标=无,模型=无,优化器='adam', random_state=None,run_eagerly=False,shuffle=True, validation_batch_size=无,validation_split=0.0,详细=0, warm_start=False))], n_jobs=None, weights=None)

【讨论】:

  • 嗨 Yefet,非常感谢。 MLPRegressor 就像一个魅力。但是,我不明白为什么 KerasRegressor 不起作用? :)
  • 它在 KerasRegressor 没有 '_estimator_type' 属性的问题中无法正常工作
  • 嗨,您能否将 Scikeras 的文档链接更新为 adriangb.com/scikeras/stable ?谢谢!
  • @LoveToCode 完成!也谢谢你创建这个包
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
相关资源
最近更新 更多