RNN проблемы с многофункциональным и отдельным набором меток (в Tensorflow) - PullRequest
0 голосов
/ 06 мая 2018

Я учусь использовать RNN для прогнозирования индекса рынка, например, S & P500 (обратите внимание, это индекс S & P, а не 500 разных компаний). Помимо данных об изменении цены я также предоставляю другую информацию, такую ​​как RSI, MACD, EMA

У меня тогда есть 3 метки, которые в будущем будут 1w, 2w 3w, которые я загружаю из отдельного CSV.

Скажите, что это мой пример данных (полностью подготовлен):

price change     RSI          MACD               EMA
0.3              3.2          0.1                0.0
-0.1             3.1          0.1                0.0
-1.2             3.8          0.1                0.2
0.9              2.7          0.1                0.2
1.3              1.7          0.2                0.2

У меня есть отдельный CSV для меток

1w future price change %   2w future price change %   3w future price change %
1.2                        1.8                        -0.3
0.8                        0.2                         1.1
0.2                        1.5                         0.7
1.2                        1.7                         0.1
-0.2                       1.8                        -0.3

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

Я собрал код ниже, но в этой строке выдается ошибка подачи формы:

mse = loss.eval(feed_dict={X: trX, Y: trY})

Я подозреваю, что формат моих данных неверен, поскольку он все еще находится в формате, который я использовал для обучения «нормальной» сети прямой связи. Я подозреваю, что требуется некоторая перестройка, но, честно говоря, я не имею ни малейшего понятия, какой формат из-за наличия нескольких функций. Возможно, я также неправильно определил модель (?).

Буду признателен, если кто-нибудь сможет мне помочь с этим.

У меня также есть дополнительный вопрос: ранее (как вы увидите в коде) я бы перетасовал данные, что было бы неплохо для мини-пакетной прямой связи NN, но как это будет работать с RNN, где Я полагаю, вам нужно представить данные в последовательном порядке? Исходя из этого, допустим, я адаптировал это для акций (а не для индекса рынка); мне нужно было бы представлять данные по каждой акции, чтобы составить скользящее окно, а не делать это каждый день? Очевидно, что изо дня в день каждая строка данных будет относиться к разным запасам.

Извините за все вопросы, я все еще собираюсь разобраться с RNNs!

import tensorflow as tf 
import numpy as np
import pandas as pd
import datetime
from sklearn.model_selection import train_test_split

# hyperparameters
epochs = 600
batch_size = 128
num_hidden = 100

df = pd.read_csv('C:\\python\\MarketData-Inputs.csv',header=None)
ldf = pd.read_csv('C:\\python\\MarketData-Results.csv',header=None)

# 20% test, shuffle the data, and use random state for like-like comparison between runs
trX, teX, trY, teY = train_test_split(df, ldf, test_size=0.2, shuffle=True, random_state=42)

trX = trX.values.astype('float')
trY = trY.values.astype('float')
teX = teX.values.astype('float')
teY = teY.values.astype('float')

print(trX.shape)
print(trY.shape)
print(teX.shape)
print(teY.shape)

#data params
features_size = len(trX[0])
labels_size = len(trY[0])
step_size = 3

tf.reset_default_graph()
X = tf.placeholder("float", [None, step_size, features_size], name="X")
Y = tf.placeholder("float", [None, labels_size], name="Y")

basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=num_hidden, activation=tf.nn.relu)
rnn_outputs, _ = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)

stacked_rnn_outputs = tf.reshape(rnn_outputs, [-1, num_hidden])
stacked_outputs = tf.layers.dense(stacked_rnn_outputs, labels_size)
outputs = tf.reshape(stacked_outputs, [-1, step_size, labels_size]) 

with tf.name_scope("loss"):
    loss = tf.reduce_sum(tf.square(outputs - Y))
    training_op = tf.train.AdamOptimizer().minimize(loss)
    tf.summary.scalar("loss", loss)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    init.run()
    for ep in range(epochs):
        sess.run(training_op, feed_dict={X: trX, Y: trY})
        if ep % 100 == 0:
            mse = loss.eval(feed_dict={X: trX, Y: trY})
            print(ep, "\tMSE:", mse)

    y_pred = sess.run(stacked_outputs, feed_dict={X: teX})
    print(y_pred)

1 Ответ

0 голосов
/ 06 мая 2018

Хорошо, я думаю, что подозревал это. В моем примере я не пакетирую данные, но RNN ожидает, что входной тензор по крайней мере имеет ранг 3, поэтому мне нужно добавить дополнительное измерение к моим входным данным, чтобы получить форму [пакет, последовательность, размер объекта], который Я могу сделать здесь:

trX = np.expand_dims( trX.values.astype('float'), axis=0)
trY = trY.values.astype('float')
teX = np.expand_dims( teX.values.astype('float'), axis=0)
teY = teY.values.astype('float')

и мои заполнители выглядят так.

X = tf.placeholder("float", [None, sequence_size, features_size], name="X")
Y = tf.placeholder("float", [None, labels_size], name="Y")

Относительно моего вопроса о перетасовке данных: я думаю, что теперь я также могу ответить на свой собственный вопрос; последовательность данных должна остаться, потому что порядок последовательности важен для RNN (в этом весь их смысл). Вместо этого данные могут быть перемешаны с помощью пакетной обработки. Таким образом, пакет состоит из случайных подмножеств всего нашего набора данных. Таким образом, если весь набор данных состоит из 1000 временных шагов, и у меня есть размер пакета 100, то я мог бы создать 10 пакетов, а затем представить партии в случайном / случайном порядке в RNN.

Надеюсь, это поможет кому-то в будущем.

...