Search code examples
machine-learningscikit-learnneural-networkregressionkeras

Keras - How to perform a prediction using KerasRegressor?


I am new to machine learning, and I am trying to handle Keras to perform regression tasks. I have implemented this code, based on this example.

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)

When I run the code I get this error:

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

How could I correctly 'insert' the model in KerasRegressor?


Solution

  • you have to fit the estimator again after cross_val_score to evaluate on the new data:

    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)
    

    Working Test version:

    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)