Керас последовательной сети KFold GridSearch постоянный выход - PullRequest
0 голосов
/ 24 марта 2020

Я хочу обучить последовательную сеть (проблема регрессии). Когда я запускаю следующий код

#---------------------------------------
# Define x and y data
data = cleaned_df.values
X = data[:,1:184]
y = data[:,0]

#---------------------------------------
# MinMax Scaling for input data
scalar = StandardScaler()
scalar.fit(X)
X = scalar.transform(X)

y = y.reshape(-1,1)
y_scalar = StandardScaler()
y_scalar.fit(y)
y = y_scalar.transform(y)

#---------------------------------------
# Split data in train and validation set
X_train, X_validierung, y_train, y_validierung = train_test_split(X, y, test_size=0.2, random_state=2121)
y_scalar.inverse_transform(y_train)[:5]

#---------------------------------------
# Define model
def create_model():
    # create model
    model = Sequential()
    model.add(Dense(80, input_dim=X.shape[1], activation='relu'))
    model.add(Dense(80, activation='relu'))
    model.add(Dense(80, activation='relu'))
    model.add(Dense(80, activation='relu'))
    model.add(Dense(80, activation='relu'))
    model.add(Dense(80, activation='relu'))
    model.add(Dense(80, activation='relu'))
    model.add(Dense(80, activation='relu'))
    model.add(Dense(80, activation='relu'))
    model.add(Dense(1, activation='linear'))
    # Compile model
    model.compile(optimizer ='adam', loss = 'mean_squared_error',  metrics =[metrics.mae])
    return model

#---------------------------------------
# create and fit model to data
model = create_model()
model.fit(x=X_train, y=y_train, batch_size=10, verbose=0, epochs=100)

#---------------------------------------
# predict values
pred = model.predict(X_train)
pred = y_scalar.inverse_transform(pred)
pred[:5]

, я получаю вывод

array([[296920.12],
       [174944.62],
       [184529.23],
       [183980.64],
       [736344.8 ]], dtype=float32)

, который - для очень простой модели - довольно хорош. Исходные данные выглядят следующим образом:

array([[303477.],
       [181134.],
       [187500.],
       [190000.],
       [745000.]])

Теперь я хочу сделать резюме KFold со следующим кодом

... (above same steps as before)

#---------------------------------------
# Define model

def create_model(units):
    # create model
    model = Sequential()
    model.add(Dense(units, input_dim=X_train.shape[1]))
    model.add(Dense(units, activation='relu'))
    model.add(Dense(units, activation='relu'))
    model.add(Dense(units, activation='relu'))
    model.add(Dense(units, activation='relu'))
    model.add(Dense(units, activation='relu'))
    model.add(Dense(units, activation='relu'))
    model.add(Dense(units, activation='relu'))
    model.add(Dense(units, activation='relu'))
    model.add(Dense(1, activation='linear'))
    # Compile model
    model.compile(optimizer ='adam', loss = 'mean_squared_error',  metrics =[metrics.mae])
    return model


#---------------------------------------
# Define param for GridSearch
units = [80]
param_grid = dict(units=units)

#---------------------------------------
# Create model
model = KerasClassifier(build_fn=create_model, epochs=100, batch_size=10, verbose=0)
grid = GridSearchCV(estimator=model, param_grid=param_grid, cv=5, verbose=2, scoring='neg_mean_squared_error', n_jobs=6)

#---------------------------------------
# Fit data
grid_result = grid.fit(X_train, y_train)

, который генерирует мне следующий вывод

array([[58500.],
       [58500.],
       [58500.],
       [58500.],
       [58500.]])

Как видите, выход является постоянным значением для каждого входа.

1 Ответ

0 голосов
/ 24 марта 2020

Использование KerasRegressor вместо KerasClassifier помогло ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...