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, Супермодераторы



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

Сейчас этот форум просматривают: Rasool


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

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