web-dev-qa-db-de.com

Keras - Wie führt man eine Vorhersage mit KerasRegressor durch?

Ich bin ein Neuling im Bereich des maschinellen Lernens und versuche, mit Keras zu arbeiten, um Regressionsaufgaben auszuführen. Ich habe diesen Code basierend auf this example implementiert.

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)

Beim Ausführen des Codes erhalte ich folgende Fehlermeldung:

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

Wie kann ich das Modell korrekt in KerasRegressor "einfügen"? 

7
Simone

sie müssen den Schätzer nach cross_val_score erneut einpassen, um die neuen Daten auszuwerten:

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)

Funktionierende Testversion:

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

Zur Bewertung Ihrer Systemleistung können Sie den Fehler wie folgt berechnen. Sie müssen auch nicht KFold und cross_val_score aufrufen.

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

Anstelle von KerasRegressor können Sie das Modell selbst direkt verwenden. Diese beiden Codeausschnitte liefern exakt dieselben Ergebnisse:

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)

Bitte beachten Sie, dass das Shuffle-Argument der Funktion fit () für KerasRegressor und das Modell False sein muss. Damit Sie einen festen Anfangsstatus haben und reproduzierbare Ergebnisse erzielen können, müssen Sie diese Codezeilen am Anfang Ihres Skripts hinzufügen:

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