Stock market(주식 시장) 같은 Time Series data를 예측하는 모델
7일 이전의 데이터들을 가지고 내일의 데이터를 예측하는 것. Many to one
입력 Dimension은 5개(Open, High , ...) Sequence length는 7일치 데이터니까 7, 출력은 1
# Reading Data
timesteps = seq_length = 7
data_dim = 5
output_dim = 1
# Open, High, Low, Close, Volume
xy = np.loadtxt('data-02-stock_daily.csv', delimiter=',')
xy = xy[::-1] # reverse order. 최근 것부터 보여주기 위해 순서 전환
xy = MinMaxScaler(xy) # 큰값, 작은 값들을 MinMaxScaler를 써서 Normalize 한다.(0 ~ 1 사이의 값으로 만드는 것)
x = xy #X 값은 전체
y = xy[:, [-1]] # close as Label
dataX = []
dataY = []
for i in range(0, len(y) - seq_length):
_x = x[i:i + seq_length]
_y = y[i + seq_length]
print(_x, "->", _y)
dataX.append(_x)
dataY.append(_y)
# Training and test datasets
# split to train and testing
train_size = int(len(dataY) * 0.7) #70%를 training data 로 사용한다.
test_size = len(dataY) - train_size
trainX, testX = np.array(dataX[0:train_size]),
np.array(dataX[train_size:len(dataX)])
trainY, testY = np.array(dataY[0:train_size]),
np.array(dataY[train_size:len(dataY)])
# input placeholders
X = tf.placeholder(tf.float32, [None, seq_length, data_dim])
Y = tf.placeholder(tf.float32, [None, 1])
# LSTM and Loss
cell = tf.contrib.rnn.BasicLSTMCell(num_units=hidden_dim, state_is_tuple=True)
outputs, _states = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)
# Y의 예측값 : Output에서 제일 마지막(오른쪽) 열만 쓰겠다. output_dim(최종출력)은 1이 된다. FC를 넣었다는 게 정말 중요!!
Y_pred = tf.contrib.layers.fully_connected(outputs[:, -1], output_dim, activation_fn=None)
# We use the last cell's output
# cost/loss - sequence loss가 아니라서 간단한 linear loss로 보고 계산한다.
loss = tf.reduce_sum(tf.square(Y_pred - Y)) # sum of the squares
# optimizer
optimizer = tf.train.AdamOptimizer(0.01)
train = optimizer.minimize(loss)
# Training and Results
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(1000):
_, l = sess.run([train, loss], feed_dict={X: trainX, Y: trainY})
print(i, l)
testPredict = sess.run(Y_pred, feed_dict={X: testX})
import matplotlib.pyplot as plt
plt.plot(testY)
plt.plot(testPredict)
plt.show()
출력 보면 X는 Sequence가 7이니까 7개
"# LSTM and Loss" 부분, 우리는 여기에서 마지막에 Fully connected layer를 이용해서 output을 한번 더 처리한 다음 Y를 예측할 것인데 Fully connected layer를 만드는 데 사용되는 hidden_dim의 값은 그냥 정해주면 된다.
Exercise