2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Keras в R, прогнозирование временного ряда
Сообщение10.05.2018, 19:37 
Аватара пользователя


26/03/13
326
Russia
Строю глубокую нейронную сеть в R при помощи пакета Keras для прогнозирования индекса Nasdaq (QQQ), код выглядит следующим образом:

Код:
require(xts)
require(keras)
# require(PerformanceAnalytics)
# require(xlsx)
#############################################################
# Data preparation
data = read.csv(file = "QQQ.csv", header = TRUE, dec = ".", sep = ";")

# prices
dates = unlist(lapply(X = data[1], FUN = as.character))
dates = as.Date(x = dates, format = "%Y-%m-%d")

prices = unlist(data["close"]) / unlist(data["factor"])
prices = na.omit(xts(x = prices, order.by = dates))

returns = na.omit(Return.calculate(prices = prices, method = "discrete"))

# plots
plot.xts(x = prices)

input_data = xts()
for(i in 1:4){
 
  input_data = merge.xts(lag(x = prices, k = i), input_data)
 
}

input_data = na.omit(input_data)

train_data = input_data["2017::2018-03"]
train_targets = prices["2017::2018-03"]

train_data = as.matrix(train_data)
# train_targets = as.matrix(train_targets)

validation_data = input_data["2018-04"]
validation_targets = prices["2018-04"]

# min-max normalization
train_data = (train_data - min(train_data)) / (max(train_data) - min(train_data))
train_targets = (train_targets - min(train_targets)) / (max(train_targets) - min(train_targets))

#############################################################
# Create and train a multi-layer perceptron
validation_split = 0.05
model = keras_model_sequential() %>%
 
    layer_dense(units = 40, input_shape = dim(train_data)[2]) %>%
    layer_dense(units = 40) %>% 
    layer_dense(units = 1)

model %>% compile(optimizer = "sgd", loss = "mse", metrics = "mae")

history = model %>% fit(x = train_data, y = train_targets, epochs = 80, batch_size = 32, validation_split = validation_split)

plot(history)

prediction = predict(object = model, x = validation_data)

validation = cbind(validation_targets, prediction)
colnames(validation) = c("validation_targets","prediction")


Данные можно взять здесь https://yadi.sk/i/hNYGolpr3VgE8K

В
Код:
model = keras_model_sequential()
как видно три слоя: два скрытых по 40 нейронов в каждом и в выходном 1 нейрон, по умолчанию функция активации линейная. На вход подаётся 4 лага цены, которые нормализуются при помощи метода minmax.

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

Изображение

Код:
> validation
              validation_targets   prediction
2018-04-02             155.51   163.6304
2018-04-03             157.26   160.0974
2018-04-04             159.74   159.2506
2018-04-05             160.65   159.6367
2018-04-06             156.63   157.2645
2018-04-09             157.73   159.6480
2018-04-10             161.21   161.1535
2018-04-11             160.28   160.2764
2018-04-12             162.21   158.3315
2018-04-13             161.37   159.9654
2018-04-16             162.60   162.2367
2018-04-17             166.10   162.0686
2018-04-18             166.44   162.9221
2018-04-19             164.91   163.0517
2018-04-20             162.30   165.1697
2018-04-23             161.89   167.6941
2018-04-24             158.46   167.2182
2018-04-25             158.65   165.5770
2018-04-26             161.99   163.3669
2018-04-27             162.09   161.7258
2018-04-30             160.94   159.7851


Если хотя бы в первом слое поставить функцию активации softmax:

Код:
model = keras_model_sequential() %>%
 
    layer_dense(units = 40, activation = "softmax",input_shape = dim(train_data)[2]) %>%
    layer_dense(units = 40) %>% 
    layer_dense(units = 1)


то получается просто дичь:

Код:
validation
              validation_targets    prediction
2018-04-02             155.51  0.5135824
2018-04-03             157.26  0.5135846
2018-04-04             159.74  0.5135775
2018-04-05             160.65  0.5135860
2018-04-06             156.63  0.5135867
2018-04-09             157.73  0.5135838
2018-04-10             161.21  0.5135776
2018-04-11             160.28  0.5135860
2018-04-12             162.21  0.5135867
2018-04-13             161.37  0.5135854
2018-04-16             162.60  0.5135860
2018-04-17             166.10  0.5135851
2018-04-18             166.44  0.5135868
2018-04-19             164.91  0.5135872
2018-04-20             162.30  0.5135857
2018-04-23             161.89  0.5135819
2018-04-24             158.46  0.5135805
2018-04-25             158.65  0.5135809
2018-04-26             161.99  0.5135780
2018-04-27             162.09  0.5135856
2018-04-30             160.94  0.5135869


Изображение

Вопрос - ошибка в коде или просто нет сходимости или ещё что-то?

 Профиль  
                  
 
 Re: Keras в R, прогнозирование временного ряда
Сообщение11.05.2018, 02:03 


07/10/15

2400
Я хоть и в R нейросетями не занимался, но код оказался на удивление понятен. Вот что Вам могу сказать:

1. При использовании линейных функций активации нет необходимости в нескольких слоях в принципе. Такая сеть всегда сводится к однослойной. Сделайте хоть 100 слоёв, результат лучше не будет. Только увеличится время обучения и снизится точность результатов из за накопления ошибок округления.

2. При переходе к нелинейной сети - то что у вас получилось - это скорее обычное дело, чем ошибка. Нелинейную сеть нужно правильно инициализировать, только тогда будет результат.

 Профиль  
                  
 
 Re: Keras в R, прогнозирование временного ряда
Сообщение16.05.2018, 13:12 
Аватара пользователя


26/03/13
326
Russia
Вообщем нужно добавить между слоями batch normalization

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group