Deep Learning study

Recurrent Neural Network(RNN)with time series data 본문

AI/Tensorflow

Recurrent Neural Network(RNN)with time series data

HwaniL.choi 2018. 1. 11. 14:30
반응형

드디어 마지막 강의를 들었다.(https://www.youtube.com/watch?v=odMGK7pwTqY&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=47)


마지막 강의는 RNN과 time series data를 사용해보는 것이다. 이 강의에서 소개한 것은 주가를 예측해 보는 것이다. 


아래는 그 코드이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import tensorflow as tf
import numpy as np
import matplotlib
import os
 
tf.set_random_seed(777)  # reproducibility
 
 
import matplotlib.pyplot as plt
 
 
def MinMaxScaler(data):
    ''' Min Max Normalization
    Parameters
    ----------
    data : numpy.ndarray
        input data to be normalized
        shape: [Batch size, dimension]
    Returns
    ----------
    data : numpy.ndarry
        normalized data
        shape: [Batch size, dimension]
    References
    ----------
    .. [1] http://sebastianraschka.com/Articles/2014_about_feature_scaling.html
    '''
    numerator = data - np.min(data, 0)
    denominator = np.max(data, 0- np.min(data, 0)
    # noise term prevents the zero division
    return numerator / (denominator + 1e-7)
 
 
# train Parameters
seq_length = 7
data_dim = 5
hidden_dim = 10
output_dim = 5
learning_rate = 0.01
iterations = 500
 
# Open, High, Low, Volume, Close
xy = np.loadtxt('data-02-stock_daily.csv', delimiter=',')
xy = xy[::-1]  # reverse order (chronically ordered)
xy = MinMaxScaler(xy)
= xy
#y = xy[:, [-1]]  # Close as label
= xy
 
# build a dataset
dataX = []
dataY = []
for i in range(0len(y) - seq_length):
    _x = x[i:i + seq_length]
    _y = y[i + seq_length]  # Next close price
    #print(_x, "->", _y)
    dataX.append(_x)
    dataY.append(_y)
 
# train/test split
train_size = int(len(dataY) * 0.7)
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 place holders
= tf.placeholder(tf.float32, [None, seq_length, data_dim])
= tf.placeholder(tf.float32, [None, 5])
 
# build a LSTM network
cell = tf.contrib.rnn.BasicLSTMCell(
    num_units=hidden_dim, state_is_tuple=True, activation=tf.tanh)
outputs, _states = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)
Y_pred = tf.contrib.layers.fully_connected(outputs[:,-1], output_dim, activation_fn=None)  # We use the last cell's output
 
print(Y_pred.shape)
# cost/loss
loss = tf.reduce_sum(tf.square(Y_pred - Y))  # sum of the squares
# optimizer
optimizer = tf.train.AdamOptimizer(learning_rate)
train = optimizer.minimize(loss)
 
# RMSE
targets = tf.placeholder(tf.float32, [None, 5])
predictions = tf.placeholder(tf.float32, [None, 5])
rmse = tf.sqrt(tf.reduce_mean(tf.square(targets - predictions)))
 
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
 
    # Training step
for i in range(iterations):
    _, step_loss = sess.run([train, loss], feed_dict={
                                X: trainX, Y: trainY})
    print("[step: {}] loss: {}".format(i, step_loss))
 
    # Test step
test_predict = sess.run(Y_pred, feed_dict={X: testX})
rmse_val = sess.run(rmse, feed_dict={targets: testY, predictions: test_predict})
print("RMSE: {}".format(rmse_val))
# Plot predictions
 
#print(testY[:,[-1]])
#print(testY.shape)
 
 
plt.plot(testY[:,[-1]])
plt.plot(test_predict[:,[-1]])
 
plt.show()
cs


원본 코드이긴 한데 , 내가 하려던 무엇이 있어서 index몇개를 바꾸고 여러 시도를 해보았었따. . 그렇지만 잘 동작하는것 같다.

일단은 이번에 사용할 데이터는 양이 많기때문에 데이터 파일을 np.loadtxt()로 직접 불러온다. 

이렇게 생긴 데이터인데 각 행은 date이고 각 열은 순서대로 , open, max, min, volume, close 때의 수치이다.

이 강의에서는 이전 7일간의 데이터들로 다음날 close일때의 가격을 예측하려고 한다. 따라서 sequence_length가 7이된다. 그리고 각 시퀀스에는 5차원 벡터가 들어가므로 data_dim = 5 이다. output_dim = 5 라고 되어있는데 사실 다음날의 close값만 알면 되기때문에 원래는 1 이었는데 내가 바꾸어 보았다. 

이렇게 하고 이제는 불러온 위의 데이터들을 train data와 test data로 나누어 준다. 데이터의 약 70%정도로는 학습을 시키는 것이고 나머지 30%의 데이터 들로는 잘 학습이 되었는지 검증작업을 한다. 


해서 여느때와 같이 RNN을 구성해 주고 마지막엔 FC를 만들어준다. 학습을 시키고 , 쓰지않은 test data로 검증을 해 본다. 

빨간색이 실제 데이터고 , 파란색이 학습시킨 결과이다.

학습이 정말 매우 잘 된것같다. 


사실 이정도면 머신러닝으로 모든 주가예측이가능할것같단 생각이 들었다. 하지만 여기서 정말 이상한점을 느끼게 되었다. 

자세히 보면 실제그래프를 오른쪽으로 평행이동 한것이 모델이 만들어낸 결과값이다. 고민고민을 하다가 생각해 낸것이 데이터의 문제인것 같다. 


사실 학습은 그렇게 시킨다고 해도 , 검증하는 데이터에 나는 의문을 가졌다. 예측이라하면 미래의 것을 모르기때문에 그 상태를 알아보려고 짐작을 해보는 것인데 여기서는 그냥 이미 실제의 데이터들을 가지고 다시 그것을 예측하고 있다. 

물론 내 생각이지만,, 어제 이것때문에 혼란에 빠졌다.  내가 생각했던것과 강의에서 소개하는 것이 좀 달라서 이해가 되지 않았었나보다...


내가 생각해 본 것은, 앞의 7일간의 데이터를 받아와 학습된 모델로 다음날의 데이터들(open,max,...,close)을 예측하고, 그 다음날의 값을 에측할때는 전날의 예측값과 그전의 6일 데이터를가지고 예측을 해보는것이다. 그리고 그다음날엔 그전 이틀간의 예측값과 그전의 5일 데이터,, ....... 이러다보면 언젠간 모두 예측한 값들로만 다시 예측을 하는 것이다. 

그러면 미래의 예측값들을 그래프로 볼 수 있겠지.. ?


물론 이 강의에서 하고자하는것은 나와같은 입문자들이 이해정도만 할 수 있도록 간단하게 다음날의 예측값만 알려고 하는 것이기 때문에 그전의 데이터들은 다 주어져 있다고 생각을 해서 그런것 같다. 하지만 현실적으로 생각해서 투자를 하려고 한다면 다음날의 값 만을 계산해 내는것보다는 향후의 전망을 알고싶을 것이기 때문에 예측값이 맞다고 가정을 하고 계속 그값들로 더미래의 값들도 예측해보고 싶었다. (물론 주식시장의 변화에는 다른 요인들이 매우 많지만 그것들은 고려하지 않는다는 가정하에... )

예측을 해놓고, 매일매일 그 주식의 실제 변동 그래프를 보면서 나의 모델이 어느정도로 예측하고 있는지 알아 볼 수 있을 것이다. 또 예측값이 빗나갔다면 모델을 수정해줌으로서 더 나은 모델을 만들 수 있지 않을까.. 완전 초보인데 하고싶은게 너무 어려운것 같다.


그런데 그렇게 만들고 싶었지만,, 어떻게 그 값들을 갱신시키면서 다시 테스트 데이터로 쓸 수 있는지 잘 모르겠다... 아직 tensorflow와 파이썬에대한 지식이 많이 부족해서 하루종일 고민만 하다 끝이났다.(그래서 위에 코드에보면 output을 5로 하고.. 열심히 바꾸어보았지만,, 마땅한 해결책을 찾지 못했다 ㅠㅠ)

결국 내린 결론은 다시 기초부터 차근차근 쌓아 올려야 겠다. 머신러닝 기초부터 보면서 딥러닝까지 . 좀 더 이해를 잘 하고, 실력도 늘게 된다면 만들 수 있지 않을까


이것으로 김성훈 교수님의 강의는 모두 끝이 났다. 기본틀과 방향을 잡아나가는데에 좋은 강의인것 같다.

반응형
Comments