predict N-step time series

조회수 660회

모델을 훈련 시킨 이후 시계열 데이터의 미래를 예측하고자 합니다.

모델 훈련 이후 어떻게 predict를 활용하여 다음 N step에 해당하는 미래의 예측값을 구하는지 궁금합니다.

다음과 같은 방법을 사용했으나

a = y_val[-look_back:] 
for i in range(N-step prediction): #predict a new value n times.
    tmp = model.predict(a.reshape(-1, look_back, num_feature)) #predicted value     
    a = a[1:] #remove first     
    a = np.append(a, tmp) #insert predicted value

결과는 아래와 같이 매번 코드를 실행할때 마다 y=ax 혹은 y=-ax의 형태로 plot이 됩니다.

1 2

제가 사용한 방법이 미래의 예측값을 구하는 방법이 제대로 된 것인지 궁금합니다.

제가 생각하기에는 잘못된것 같아 혹시 어떻게 수정을 해야 하는지 의견 부탁드리겠습니다.

전체 코드는 다음과 같습니다.

def create_dataset(signal_data, look_back=1):
    dataX, dataY = [], []
    for i in range(len(signal_data) - look_back):
        dataX.append(signal_data[i:(i + look_back), :])
        dataY.append(signal_data[i + look_back, -1])
    return np.array(dataX), np.array(dataY)

look_back = 20

df = pd.read_csv('kospi.csv')

signal_data = df[["close"]].values.astype('float32')


train_size = int(len(signal_data) * 0.80)
test_size = len(signal_data) - train_size - int(len(signal_data) * 0.05)
val_size = len(signal_data) - train_size - test_size
train = signal_data[0:train_size]
val = signal_data[train_size:train_size + val_size]
test = signal_data[train_size + val_size:len(signal_data)]


x_train, y_train = create_dataset(train, look_back)
x_test, y_test = create_dataset(test, look_back)
x_val, y_val = create_dataset(val, look_back)


model = Sequential([
    layers.LSTM(20, input_shape=(None, 1)),
    layers.Dense(1)
])
model.compile(optimizer='adam', loss='mae')

history = model.fit(x_train, y_train, epochs=50, batch_size=64, verbose=0, validation_data=(x_val, y_val))

a = y_val[-look_back:] 
for i in range(N):
    tmp = model.predict(a.reshape(-1, look_back, num_feature)) #predicted value
    a = a[1:] #remove first
    a = np.append(a, tmp) #insert predicted value

Python 3.6

Tensorflow 2.1.0

  • 데이터 예측이 아닙니다. 즉 내일 주식이 얼마가 될까? 이런것을 예측하는 것이 아닙니다. 물론 퀀트라고 해서 그런 분야의 직업이 있지만 질문자가 올린 코드는 어떤 시계열 데이터가 주어졌을때 하나의 함수로 근사를 하는 겁니다. 예를들어 어떤 학생의 성적이 1월에는 50, 2월에는 80, 3월에는 60, 4월에는 70, 5월에는 80, 6월에는 90 이런식으로 기록하고 있을때 1년치 회귀를 해보면 1차선의 성적이 오르는 함수를 얻을 수 있고 이것을 토대로 이 학생의 내년의 성적은 이정도 예상이 된다고 판단하는 겁니다. 저번글에도 적었지만 통계를 학습하고 회귀를 공부해보세요. 질문자가 원하는 답변을 얻을 수 있을 겁니다. 정영훈 2020.2.11 21:07

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)