Есть несколько проблем, как с вашими вопросами, так и с вашим кодом ...
Для начала, в общем, мы не можем сказать, что потеря MSE значения X является низкой или высокой.В отличие от точности в задачах классификации, которая по определению в [0, 1]
, потеря не ограничена подобным образом, поэтому нет общего способа сказать, что конкретное значение является низким или высоким, как вы подразумеваете здесь (это всегда зависит от конкретной проблемы).
Пояснив это, давайте перейдем к вашему коду.
Сначала , судя по вашему loss='mean_squared_error'
, может показаться, чтовы находитесь в режиме регрессии, в которой точность не имеет смысла;см. Какая функция определяет точность в Керасе, если потеря представляет собой среднеквадратическую ошибку (MSE)? .Вы не поделились тем, какую именно проблему вы пытаетесь решить, но если это действительно регрессионная проблема (т. Е. Предсказание некоторого числового значения), вам следует избавиться от metrics=['accuracy']
в вашей компиляции модели и, возможно, изменить свой последний слой.на одну единицу, то есть model.add(Dense(1))
.
Второй , поскольку ваш код в настоящее время таков, вы фактически не помещаете независимые модели с нуля в каждый из ваших сгибов CV (что является самой сущностью CV);в Keras model.fit
работает совокупно , то есть он не «сбрасывает» модель при каждом вызове, но продолжает подгонку из предыдущего вызова.Именно поэтому, если вы видите scores
, очевидно, что модель значительно лучше в более поздних сгибах (что уже дает подсказку для улучшения: добавьте больше эпох).Чтобы соответствовать независимым моделям, как вы должны сделать для правильного резюме, вы должны переместить create_model()
внутрь for
петли.
Третий , ваше использование np.mean()
здесь снова бессмысленно, так как вы усредняете и потерю , и точность (т.е. яблоки с апельсинами) вместе;тот факт, что из 5 значений потерь между 54 и 94 вы получите «среднее» из 38, уже должен был предупредить вас, что вы пытаетесь что-то сделать не так.Правда в том, что если вы отклоните метрику точности, как указывалось выше, у вас не будет этой проблемы здесь.
В общем, вот как кажется, что ваш код должен быть в принципе (но, опять же, я имеюНи малейшего представления о конкретной проблеме, которую вы пытаетесь решить, поэтому некоторые детали могут отличаться):
def create_model():
model = Sequential()
# Adding the input layer
model.add(Dense(26,activation='relu',input_shape=(n_cols,)))
# Adding the hidden layer
model.add(Dense(60,activation='relu'))
model.add(Dense(60,activation='relu'))
model.add(Dense(60,activation='relu'))
# Adding the output layer
model.add(Dense(1)) # change to 1 unit
# Compiling the RNN
model.compile(optimizer='adam', loss='mean_squared_error') # dismiss accuracy
return model
kf = KFold(n_splits = 5, shuffle = True)
scores = []
for i in range(5):
result = next(kf.split(data_input), None)
input_train = data_input[result[0]]
input_test = data_input[result[1]]
output_train = data_output[result[0]]
output_test = data_output[result[1]]
# Fitting the RNN to the Training set
model = create_model() # move create_model here
model.fit(input_train, output_train, epochs=10000, batch_size=200 ,verbose=2) # increase the epochs
predictions = model.predict(input_test)
scores.append(model.evaluate(input_test, output_test))
print('Loss from each Iteration: ', scores)
print('Average K-Fold Loss :' , np.mean(scores))