Нелинейная регрессия с потерями Keras не уменьшается: выбросы и / или проблема с форматом данных? - PullRequest
0 голосов
/ 30 августа 2018

У меня есть таблица данных, и два ее столбца создают график, который выглядит следующим образом. Обратите внимание, что ось Y находится в журнале.

Не против случайных кандзи. Это уже исправлено

Я подумал, что было бы неплохо показать это отношение с помощью нелинейной регрессии, созданной методом машинного обучения с использованием TF и ​​Keras. Код выглядит так:

def createModel():
    model = Sequential()
    model.add(Dense(50, activation='relu', input_dim=1))
    model.add(Dense(25, activation='relu', input_dim=1))
    model.add(Dense(1, activation='linear'))

    return model

model1 = createModel()
model1.compile(SGD (lr=0.0001),loss='mse')
print(model1.summary())

Taisha_Learn=model1.fit(Heisei_Learn["竣工年月"],Heisei_Learn["平成27年まで詰めた堆砂容量_Percent"],batch_size=50, epochs=1000, validation_split=(0.08), verbose=2)

predictions = model1.predict(Heisei_Learn["竣工年月"], verbose=1)
plt.plot(Heisei_Learn["竣工年月"],predictions)
# plt.legend([ 'Predictated Y'])
plt.show()

Модель выполняет ужасно. Потеря почти не уменьшается. Впоследствии это предсказание.

Абсолютно ужасный прогноз

Я уже поиграл с другими оптимизаторами (Adam, RMSprop), Learning Rates и Batch-Sizes, но без положительного эффекта. Я подумал, может ли это быть проблема с данными из-за выбросов. Я только что отфильтровал его для NaNs в соответствующем столбце.

Heisei = pd.read_excel("日本ダム/平成27.xlsx")
Heisei_Learn=Heisei.dropna(subset=['平成27年まで詰めた堆砂容量_Percent'])

Я действительно перепробовал много изменений, но обычно потеря выглядит примерно так:

Кошмарная потеря

Должен быть лучший способ получить реальную нелинейную регрессию из данных. Есть ли что-то о них, я должен изменить? Снова, пожалуйста, взгляните на график, размещенный в оригинальном вопросе. Меня это бесит ... - ...

Есть ли кто-нибудь порядочный, чтобы помочь кому-то глупому, как я?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018
  1. NN не производит удивления регрессии. Рассмотрите возможность преобразования вашей проблемы в задачу классификации (если возможно)
  2. Relu лучше заменить на LeakyReLU
  3. Самая большая проблема - это, вероятно, потеря, где «mse» вызывает огромные потери из-за выбросов. Попробуйте "Мэй". Но будьте готовы к средним результатам из-за первого пункта.
0 голосов
/ 30 августа 2018

Поскольку вы находитесь в настройке регрессии, активация выходного слоя должна быть линейной , и определенно не softmax (который обычно используется только для классификации); измените последний слой вашей модели на

model.add(Dense(1, activation='linear'))

или просто

model.add(Dense(1))

, поскольку активация по умолчанию (то есть, если вы ничего не указали) является линейной ( документы ).

Сделав это, начните экспериментировать с показателями скорости обучения LR около 0,001 ...

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