Плохие результаты проверки с использованием LSTM Keras - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь предсказать движение фондового рынка (1 = положительное, 0 = отрицательное) дня T, используя выборки T-time_steps. Я попытался time_steps = 20, 50, 100, 300 и следующие результаты похожи.

У меня есть следующий кадр данных:

                Open       High        Low      Close      Volume  sentiment  Movement
Date
2009-01-02  51.349998  54.529999  51.070000  54.360001   7296400.0   0.084348       1.0
2009-01-05  55.730000  55.740002  53.029999  54.060001   9509800.0   0.104813       0.0
2009-01-06  54.549999  58.220001  53.750000  57.360001  11080100.0   0.185938       1.0
2009-01-07  56.290001  56.950001  55.349998  56.200001   7942700.0   0.047494       0.0
2009-01-08  54.990002  57.320000  54.580002  57.160000   6577900.0  -0.027938       1.0

Следующий кадр данных такой же, как указано выше с использованием MinMaxScaler (feature_range = (0, 1)) для нормализации данных.

                Open      High       Low     Close    Volume  sentiment  Movement
Date
2009-01-02  0.001402  0.002215  0.001750  0.002973  0.110116   0.591978       1.0
2009-01-05  0.003604  0.002819  0.002748  0.002823  0.148730   0.625025       0.0
2009-01-06  0.003011  0.004059  0.003114  0.004480  0.176124   0.756025       1.0
2009-01-07  0.003885  0.003424  0.003928  0.003897  0.121391   0.532468       0.0
2009-01-08  0.003232  0.003609  0.003536  0.004380  0.097581   0.410660       1.0
Train: 2263 samples
Test: 252 samples

TIME_STEPS = 300

def create_dataset(X, y, time_steps=1):
    Xs, ys = [], []
    for i in range(len(X) - time_steps):
        v = X.iloc[i:(i + time_steps)].values
        Xs.append(v)
        ys.append(y.iloc[i + time_steps])
    return np.array(Xs), np.array(ys)


X_train, y_train = create_dataset(train, train.Movement, TIME_STEPS)
X_test, y_test = create_dataset(test, test.Movement, TIME_STEPS)

Я создал небольшую модель LSTM с использованием кера, как указано выше:

model = Sequential()
model.add(LSTM(50, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dense(1, activation='sigmoid'))

optimizer = optimizers.RMSprop()
monitor = EarlyStopping(monitor='val_loss', min_delta=1e-2, patience=25)
model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
history = model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1, verbose=1,shuffle=False)

model.summary()

Результаты кажутся чтобы показать некоторую подгонку к набору обучающих данных, я уже пытался добавить отсева, добавить больше слоев, увеличить / уменьшить количество нейронов ... С увеличением эпох точность обучения может достигать 90% без каких-либо проблем, кроме проверки остается прежним (тоже прогноз).

Потери - MSE

Точность

Не могу понять, что такое проблема ...

1 Ответ

0 голосов
/ 11 января 2020

Когда вы сталкиваетесь с перегрузкой, это может быть вызвано одной из следующих проблем:

  1. небольшое количество образцов
  2. размер проблемы велик (вы можете подумать об этом как большое количество параметров)

Что вы можете сделать, чтобы решить эту проблему?

небольшое количество образцов:

  1. получите больше данных!
  2. аугментации данных (это более актуально для компьютерного зрения)

размер проблемы велик:

используйте менее сложную модель (с меньшим количеством параметров) dropout усложняют модель - например, добавляют шум к данным ...

Это основные способы ...

В вашем случае вы используете LSTM, который, вероятно, требует много данных. И вы используете небольшой набор данных с низким разнесением (выборки похожи друг на друга, потому что вы берете 300 временных меток назад).

Я бы начал с более простой модели (classi c классификатор машинного обучения) и добавил бы функции прокрутки (используя pandas rolling - mean, std, et c ...) с различными windows размер.

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