Рецидивирующая нервная сеть, предсказывающая тот же ответ - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь предсказать, повысится ли цена акции на go вверх или вниз на следующий день. Я использую pandas DataFrame, который имеет 43 столбца, один из которых является значением y, значения y являются числами от 0 до 1, также мой DataFrame имеет 5016 строк, проиндексированных с числами. Я сделал модель с несколькими ячейками LSTM и несколькими плотными ячейками с функцией потерь biary_crossentropy, но когда я запускаю модель и пытаюсь распечатать прогнозы, все прогнозы совпадают:

[[0.56393844 ]

[0.56393844]

[0.56393844]

...

[0.56393844]

[0.56393844]

[0.56393844]]

Значения y не одинаковы. Значения Y:

0

1

0

1

1

Потери и точность также начинают совпадать:

Эпоха 7/10

4012/4012 [================== =============] - 20 с 5 мс / выборка - потеря: 0,7052 - cc: 0,5015 - val_loss:

0,6884 - val_a cc: 0,5488

Эпоха 8/10

4012/4012 [=============================] - 19 с 5 мс / выборка - потеря: 0,7054 - cc: 0,4980 - val_loss:

0,6907 - val_a cc: 0,5488

Эпоха 9/10

4012/4012 [==============================] - 18 с 5 мс / выборка - потеря: 0,7078 - cc: 0,4890 - val_loss :

0.6894 - val_a cc: 0.5488

Мой код выглядит так:

df = pd.read_csv("^AEX.csv")
df.index = pd.to_numeric(df.index, errors = 'coerce')
df = df.drop(['date'], axis = 1)
print(df.shape)
x = df.loc[:, df.columns != 'result']
y = df.loc[:, df.columns == 'result']

y = y.astype(int)

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, shuffle = False)
x_train = x_train.values.reshape(x_train.shape[0], 1, x_train.shape[1])
x_test = x_test.values.reshape(x_test.shape[0], 1, x_test.shape[1])

model = Sequential()

model.add(LSTM(42, input_shape = (1, 42), activation = 'relu', return_sequences = True))
model.add(Dropout(0.2))

model.add(LSTM(42, activation = 'relu'))
model.add(Dropout(0.2))

model.add(Dense(32, activation = 'relu'))
model.add(Dropout(0.2))

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

opt = tf.keras.optimizers.Adam(lr = 0.1, decay=1e-7)

model.compile(loss = 'binary_crossentropy', optimizer = opt, metrics = ['accuracy'])

model.fit(x_train, y_train, epochs = 10, batch_size = 1, validation_data = (x_test, y_test))

prediction = model.predict(x_test)
print(prediction)
print(x_test)
print(y_test)

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

1 Ответ

0 голосов
/ 08 апреля 2020

Поскольку вы используете «binary_crossentropy», это означает, что ваш ответ будет округлен до 0 или 1. Скорее всего, ваш LSTM обнаружил, что, если он все время прогнозирует 1 с, он получит общий балл выше 50%, что лучше чем гадание 50/50. Это очень распространенная проблема в ML в бинарных задачах. Причина, по которой вы получаете 0,56, заключается в том, что вы используете «точность» в качестве метри c, что является правильным / все догадки, и если вы прогнозируете, что все равны 1, каждый раз вы получите ту же точность.

Проблема заключается в вашей модели, которая может быть либо слишком простой, либо слишком сложной, либо иметь неправильные значения настройки. Попробуйте удалить один слой LSTM, экспериментируйте с размерами их узлов и т. Д. c, пока не получите неоднородный ответ.

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