web-dev-qa-db-fra.com

Keras - Comment effectuer une prédiction à l'aide de KerasRegressor?

Je suis novice en apprentissage automatique et j'essaie de gérer Keras pour effectuer des tâches de régression. J'ai implémenté ce code, basé sur 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)

Quand je lance le code, j'obtiens cette erreur:

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

Comment pourrais-je correctement "insérer" le modèle dans KerasRegressor? 

7
Simone

vous devez réajuster l'estimateur après cross_val_score pour évaluer les nouvelles données:

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)

Version de test de travail:

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)
13
Abhishek Thakur

Pour évaluer les performances de votre système, vous pouvez calculer l’erreur comme suit. Vous n’avez pas non plus besoin d’appeler KFold et 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
Noosh

Au lieu de kerasRegressor, vous pouvez directement utiliser le modèle lui-même. Ces deux extraits du code donnent exactement le même résultat:

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)

Notez que l'argument shuffle de la fonction fit () pour kerasRegressor et pour model doit être False. De plus, pour avoir l'état initial fixe et obtenir des résultats reproductibles, vous devez ajouter ces lignes de code au début de votre script:

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)
1
Noosh