- Вопрос или проблема
- Обучающие, валидационные и тестовые наборы данных
- Изменение формы данных
- Функции
- Извлечение значений ‘Close’
- Создание матриц
- Прогнозы, используя одну характеристику
- График прогнозов против фактических данных
- Ответ или решение
- Почему модель LSTM не предсказывает цены закрытия акций Apple
- 1. Сложности с предсказанием из-за левой асимметрии данных
- 2. Архитектура модели
- 3. Параметры обучения и гиперпараметрическая оптимизация
- 4. Обработка данных и функции
- Заключение
Вопрос или проблема
Я использую LSTM (долгая краткосрочная память) для прогнозирования цен закрытия акций Apple, используя данные о трех предыдущих днях. Моя проблема заключается в том, что модель недооценивает цены закрытия. Фотография конечного результата представлена в конце этого текста.
Прежде всего, у меня есть набор данных акций Apple с сильным левосторонним смещением, как видно на фотографии ниже. Я использовал модель LSTM для прогнозирования цен закрытия, используя данные о трех предыдущих днях и размер батча 10.
rec_obj <- recipe(Close ~ .,aapl) %>%
step_sqrt(Close) %>%
step_center(Close) %>%
step_scale(Close) %>%
prep()
aapl_normalized <- bake(rec_obj, aapl) #10372 наблюдений.
# сохраняем центры для денормализации позже
center_history <- rec_obj$steps[[2]]$means["Close"]
center_history
scale_history <- rec_obj$steps[[3]]$sds["Close"]
scale_history
c("center" = center_history, "scale" = scale_history)
Обучающие, валидационные и тестовые наборы данных
aapl_trn <- aapl_normalized[1:8500,]
aapl_val <- aapl_normalized[8501:9401,] #900
aapl_test <- aapl_normalized[9402:10372 ,] #970
Изменение формы данных
n_inputs <- 3 #число входов в RNN, например, 1-е использование первых 10 дней для прогнозирования 11-го
n_predictions <- 1
batch_size <- 10 #число батчей, которые вы передаете. чем больше, тем быстрее модель -- параметр
Функции
build_windowed_matrix <- function(data, timesteps) { #преобразует данные в окна 4+1) если у вас 14K строк, это создаст матрицу 14K x 5
t(sapply(1:(length(data) - timesteps + 1), function(x)
data[x:(x + timesteps - 1)]))
}
reshape_3D <- function(df){ #для получения размера 14kx5x1, так как это требуется keras. Если бы это было многомерное (n), это должно быть 14kx5xn!!!
dim(df) <- c(dim(df)[1], dim(df)[2], 1)
df
}
get_x <- function(mtx, n_inputs, batch_size){#для каждой строки получает x (всего 4)
mtx <- mtx[, 1:n_inputs]
mtx <- mtx[1:(nrow(mtx) %/% batch_size * batch_size), ]
reshape_3D(mtx)
}
get_y <- function(mtx, n_inputs, n_predictions, batch_size) {#для каждой строки получает y (5-й элемент) + помещает их в 3D
mtx <- mtx[, (n_inputs+1):(n_inputs+n_predictions), drop=FALSE]
mtx <- mtx[1:(nrow(mtx) %/% batch_size * batch_size), , drop=FALSE]
if(n_predictions==1){
dim(mtx) <- c(length(mtx)[1], 1)
}
reshape_3D(mtx)
}
Извлечение значений ‘Close’
Извлекаем значения закрытия и игнорируем даты
trn <- aapl_trn %>% select(Close) %>% pull() #в векторе
val <- aapl_val %>% select(Close) %>% pull()
test <- aapl_test %>% select(Close) %>% pull()
Создание матриц
на самом деле, используя функции, которые я определил выше
trn_mtx <- build_windowed_matrix(trn, n_inputs + n_predictions)
val_mtx <- build_windowed_matrix(val, n_inputs + n_predictions)
test_mtx <- build_windowed_matrix(test, n_inputs + n_predictions)
X_train <- get_x(trn_mtx, n_inputs, batch_size) #X_train_close
Y_train <- get_y(trn_mtx, n_inputs, n_predictions, batch_size)
X_val <- get_x(val_mtx, n_inputs, batch_size)
Y_val <- get_y(val_mtx, n_inputs, n_predictions, batch_size)
X_test <- get_x(test_mtx, n_inputs, batch_size)
Y_test <- get_y(test_mtx, n_inputs, n_predictions, batch_size) #Y_test это фактическое значение закрытия в тестовом наборе.
head(X_test)
head(Y_test)
Я использую модель LSTM ниже:
1.) Постройте первую модель (используйте только закрытие)
model <- keras_model_sequential()
model %>%
layer_lstm( #lstm с 32 единицами в каждой ячейке
units = 32,
batch_input_shape = c(batch_size, n_inputs, 1) #включена 1 признака
)
layer_lstm( #lstm с 32 единицами в каждой ячейке
units = 16,
batch_input_shape = c(batch_size, n_inputs, 1)
)
model %>%
layer_dense(units = 1)
model %>%
compile(
loss="mean_squared_error",
optimizer="sgd",
metrics = list("mean_squared_error")
) '''
```{r}
callbacks <- list(#критерий остановки зависит от того, учится ли сеть больше...остановить модель от обучения после 5 эпох, если нет обучения
callback_early_stopping(patience = 5)
)
history <- model %>% fit(
x = X_train,
y = Y_train,
validation_data = list(X_val, Y_val),
batch_size = batch_size,
epochs = 100,
callbacks = callbacks
)
Прогнозы, используя одну характеристику
pred_test <- model %>%
predict(X_test, batch_size = batch_size)
# денормализация до оригинального масштаба
pred_test <- (pred_test * scale_history + center_history) ^2 #денормализация
mse_test <- (pred_test - Y_test[,,1]) ^2 #Y_test это фактическое значение закрытия в тестовом наборе.
График прогнозов против фактических данных
ggplot(aapl[(9402 + n_inputs):(9401 + n_inputs + dim(pred_test)[1]),], aes(x = Date, y = Close, group = 1)) + geom_line() +
scale_x_discrete(breaks = levels(aapl$Date)[floor(seq(1, nlevels(aapl$Date),length.out = 5))]) +
geom_line(aes(y = pred_test), color = "blue") +
labs(x = "Дата", y = "Закрытое значение", title = "Акции Apple")
Как вы видите из графика, моя модель, кажется, действительно недооценивает значения. Как я могу это исправить? Я пробовал настройку гиперпараметров, но это не сработало. Это потому что мои данные были очень сильно левосторонне смещенными? Как мне подойти к этому?
С наилучшими пожеланиями
Я бы предложил сначала сгладить данные с помощью скользящей средней или какой-то другой техники. Кроме того, у вас есть 16 скрытых узлов в слое. Я бы предложил увеличить оба слоя до 64, при этом последний слой по желанию в конструкции модели.
У меня есть несколько вопросов и несколько предложений.
Сначала вопросы :
- Вы установили нелинейный слой между слоями?
- Каковы ваши параметры обучения? такие как функция потерь
Предложение:
- Я думаю, что вам нужно нормализовать данные цены закрытия для каждой партии данных.
Если вы ответите на мои вопросы, я смогу получить лучшее руководство.
Ответ или решение
Почему модель LSTM не предсказывает цены закрытия акций Apple
Использование модели LSTM (Long Short-Term Memory) для предсказания цен закрытия акций Apple может столкнуться с различными проблемами, особенно если данные имеют определенные особенности, такие как левая асимметрия. В вашем случае наблюдается недооценка предсказанных цен закрытия. Давайте разберем основные аспекты вашей проблемы и предложим возможные пути улучшения модели.
1. Сложности с предсказанием из-за левой асимметрии данных
Ваши данные о ценах закрытия акций Apple имеют сильно левую асимметрию. Это может привести к тому, что модель будет недооценивать высокие цены, что объясняет наблюдаемую вами недооценку. Варианты решения проблемы включают:
-
Преобразование данных: Вы используете квадратный корень для нормализации. Рассмотрите возможность использования других методов, таких как логарифмическое преобразование, которое может лучше справиться с асимметрией.
-
Масштабирование: Убедитесь, что вы правильно масштабируете ваши данные. Процесс нормализации должен включать не только среднее значение и стандартное отклонение, но и учитывать минимум и максимум, чтобы обеспечить более равномерное распределение данных.
2. Архитектура модели
Ваши текущие настройки LSTM могут быть недостаточно эффективными. Вот некоторые рекомендации:
-
Увеличение числа единиц в слоях LSTM: Вместо 32 и 16 единиц в слоях, попробуйте увеличить их до 64 или даже 128. Это может помочь модели лучше выявлять закономерности в ваших данных.
-
Добавление нелинейных слоев: Убедитесь, что между всеми слоями присутствуют нелинейные функции активации, такие как ReLU или tanh. Это поможет модели лучше обработать сложные зависимости в данных.
-
Регуляризация: Используйте регуляризацию (например, Dropout), чтобы уменьшить переобучение, если оно имеет место.
3. Параметры обучения и гиперпараметрическая оптимизация
Параметры обучения имеют важное значение для производительности модели:
-
Оптимизатор: Рассмотрите использование адаптивного оптимизатора, такого как Adam, вместо SGD, который может быть менее эффективным при работе с LSTM.
-
Функция потерь: Убедитесь, что функция потерь (например, MSE) корректно подходит для вашей задачи. Возможно, стоит рассмотреть использование комбинаций функций потерь или метрик, чтобы лучше оценивать результаты.
4. Обработка данных и функции
Ваши функции для подготовки данных выглядят хорошо, но:
-
Нормализация в батчах: Проверьте, чтобы нормализация происходила в каждом батче, а не на всех данных сразу. Это может помочь вашей модели лучше адаптироваться к динамически изменяющемуся рынку.
-
Применение скользящей средней: Рассмотрите возможность использования методов сглаживания, например, скользящей средней, чтобы уменьшить шум в данных.
Заключение
Существуют различные подходы к улучшению предсказательной способности модели LSTM для цен закрытия акций Apple. Оценивайте свою модель на каждом этапе, корректируя архитектуру, параметры обучения и методы обработки данных. Улучшение производительности модели потребует времени и экспериментирования, но с правильным подходом вы сможете снизить недооценку и повысить точность предсказаний.
Если у вас остались вопросы или требуется дополнительная помощь по конкретным аспектам реализации, не стесняйтесь задавать их. Успехов в вашей работе!