【问题标题】:Keras - How to perform a prediction using KerasRegressor?Keras - 如何使用 KerasRegressor 执行预测?
【发布时间】:2017-10-23 06:42:13
【问题描述】:

我是机器学习的新手,我正在尝试使用 Keras 来执行回归任务。我已经根据this 示例实现了这段代码。

X = df[['full_sq','floor','build_year','num_room','sub_area_2','sub_area_3','state_2.0','state_3.0','state_4.0']]
y = df['price_doc']

X = np.asarray(X)
y = np.asarray(y)

X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=.2)
def baseline_model():
    model = Sequential()
    model.add(Dense(13, input_dim=9, kernel_initializer='normal', 
        activation='relu'))
    model.add(Dense(1, kernel_initializer='normal'))
    model.compile(loss='mean_squared_error', optimizer='adam')
    return model

estimator = KerasRegressor(build_fn=baseline_model, nb_epoch=100, batch_size=100, verbose=False)
kfold = KFold(n_splits=10, random_state=seed)
results = cross_val_score(estimator, X_train, Y_train, cv=kfold)
print("Results: %.2f (%.2f) MSE" % (results.mean(), results.std()))

prediction = estimator.predict(X_test)
accuracy_score(Y_test, prediction)

运行代码时出现此错误:

AttributeError: 'KerasRegressor' object has no attribute 'model'

如何在 KerasRegressor 中正确“插入”模型?

【问题讨论】:

  • 你能发布完整的堆栈跟踪吗?
  • 你在哪里拟合估计器?
  • @AbhishekThakur cross_val_score 适合并为估算器评分。
  • @VivekKumar 是的,但要predict 在另一个数据上,他需要再次fit 模型。对于这一行prediction = estimator.predict(X_test)
  • @Simone 请添加错误的完整堆栈跟踪,以便我们了解此错误发生在哪一行。在此之前,我们无法提供帮助。

标签: machine-learning scikit-learn neural-network regression keras


【解决方案1】:

你可以直接使用模型本身来代替 kerasRegressor。 这两个代码的 sn-ps 给出了完全相同的结果:

estimator = KerasRegressor(build_fn=baseline_model)
estimator.fit(X, y, nb_epoch=100, batch_size=100, verbose=False, shuffle=False)
prediction = estimator.predict(X)


model = baseline_model()
model.fit(X, y, nb_epoch=100, batch_size=100, verbose=False, shuffle=False)
prediction = model.predict(X)

请注意,kerasRegressor 和模型的 fit() 函数的 shuffle 参数必须为 False。此外,为了获得固定的初始状态并获得可重现的结果,您需要在脚本的开头添加以下代码行:

session = K.get_session()
init_op = tf.group(tf.tables_initializer(),tf.global_variables_initializer(), tf.local_variables_initializer())
session.run(init_op)
np.random.seed(1)
tf.set_random_seed(1)

【讨论】:

    【解决方案2】:

    为了评估您的系统性能,您可以计算如下所示的误差。 您也不需要调用 KFold 和 cross_val_score。

    import numpy as np
    from sklearn import datasets, linear_model
    from sklearn.model_selection import cross_val_score, KFold
    from keras.models import Sequential
    from sklearn.metrics import accuracy_score
    from keras.layers import Dense
    from keras.wrappers.scikit_learn import KerasRegressor
    seed = 1
    
    diabetes = datasets.load_diabetes()
    X = diabetes.data[:150]
    y = diabetes.target[:150]
    
    def baseline_model():
        model = Sequential()
        model.add(Dense(10, input_dim=10, activation='relu'))
        model.add(Dense(1))
        model.compile(loss='mean_squared_error', optimizer='adam')
        return model
    
    
    estimator = KerasRegressor(build_fn=baseline_model, nb_epoch=100, batch_size=100, verbose=False)
    estimator.fit(X, y)
    prediction = estimator.predict(X)
    
    train_error =  np.abs(y - prediction)
    mean_error = np.mean(train_error)
    min_error = np.min(train_error)
    max_error = np.max(train_error)
    std_error = np.std(train_error)
    

    【讨论】:

      【解决方案3】:

      您必须在 cross_val_score 之后再次拟合估算器以评估新数据:

      estimator = KerasRegressor(build_fn=baseline_model, nb_epoch=100, batch_size=100, verbose=False)
      kfold = KFold(n_splits=10, random_state=seed)
      results = cross_val_score(estimator, X_train, Y_train, cv=kfold)
      print("Results: %.2f (%.2f) MSE" % (results.mean(), results.std()))
      
      estimator.fit(X, y)
      prediction = estimator.predict(X_test)
      accuracy_score(Y_test, prediction)
      

      工作测试版本:

      from sklearn import datasets, linear_model
      from sklearn.model_selection import cross_val_score, KFold
      from keras.models import Sequential
      from sklearn.metrics import accuracy_score
      from keras.layers import Dense
      from keras.wrappers.scikit_learn import KerasRegressor
      seed = 1
      
      diabetes = datasets.load_diabetes()
      X = diabetes.data[:150]
      y = diabetes.target[:150]
      
      def baseline_model():
          model = Sequential()
          model.add(Dense(10, input_dim=10, activation='relu'))
          model.add(Dense(1))
          model.compile(loss='mean_squared_error', optimizer='adam')
          return model
      
      
      estimator = KerasRegressor(build_fn=baseline_model, nb_epoch=100, batch_size=100, verbose=False)
      kfold = KFold(n_splits=10, random_state=seed)
      results = cross_val_score(estimator, X, y, cv=kfold)
      print("Results: %.2f (%.2f) MSE" % (results.mean(), results.std()))
      
      estimator.fit(X, y)
      prediction = estimator.predict(X)
      accuracy_score(y, prediction)
      

      【讨论】:

      • accuracy_score() 对回归任务无效。
      • 当然不会,我只是将其保留在那里以使其类似于 OP 的问题。 :)
      • @Simone 如果答案解决了您的问题,请考虑接受。
      • @Abhishek Thakur,我不太明白为什么训练后需要 estimator.fit(X,y),这个命令是再训练模型还是什么?谢谢!
      • @AbhishekThakur 应该在 x_train 和 y_train 上调用 estimator.fit(X, y) 吗?否则,estimator.predict(X) 将使用 X 作为在拟合过程中容易看到的数据。
      猜你喜欢
      • 2020-10-30
      • 2019-06-07
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      相关资源
      最近更新 更多