응용전략

LSTM을 이용한 시계열 예측

뉴욕킴 2024. 10. 5. 12:41

 

model.fit(X, y, validation_split=0.2, epochs=100, batch_size=32, verbose=0)

for i in range(30):
    last_7_days_reshaped = last_7_days[-7:].reshape(1, 7, 1)
    next_day = model.predict(last_7_days_reshaped)
    next_30_days.append(next_day[0, 0])
    last_7_days = np.append(last_7_days, next_day)

 

LSTM과 다른 시계열 모델의 차이란

보통의 시계열 모델은 단기 기억만 가능하지만, LSTM은 장기 기억도 할 수 있어요.

 

일반 시계열 모델: 마치 "어제 비가 왔으니까 오늘도 비가 올 거야"라고 생각하는 것처럼, 가까운 과거만 보고 예측해요.

 

LSTM: "작년 이맘때 비가 많이 왔고, 3개월 전부터 비슷한 패턴이 보이니까 이번에도 비가 많이 올 것 같아"처럼 더 긴 기간의 패턴을 기억하고 예측할 수 있어요.

 

LSTM은 복잡한 패턴을 잘 찾아내서, 날씨 예보, 주식 시장 예측, 또는 이 경우처럼 방문객 수 예측 등에 많이 사용돼요. 하지만 다른 모델들보다 배우는 데 시간이 오래 걸리고, 컴퓨터 파워도 많이 필요해요.

 


STM(Long Short-Term Memory) :

  1. LSTM이란? LSTM은 "긴 단기 기억"이라는 뜻으로, 컴퓨터가 시간에 따라 변하는 정보를 기억하고 학습하는 특별한 방법이에요. 마치 우리가 일기를 쓰면서 오늘 있었던 일을 기억하고, 나중에 그 기억을 떠올리는 것처럼 작동해요.
  2. LSTM의 특징
    • 긴 시간 동안의 정보를 기억할 수 있어요.
    • 중요한 정보는 오래 기억하고, 덜 중요한 정보는 잊어버릴 수 있어요.
    • 새로운 정보가 들어오면 그것을 기존의 기억과 잘 조합할 수 있어요.
  3. LSTM의 구조: LSTM은 여러 개의 "셀"로 이루어져 있어요. 각 셀은 다음과 같은 부분으로 구성됩니다:
    • 입력 게이트: 새로운 정보를 얼마나 받아들일지 결정해요.
    • 망각 게이트: 어떤 정보를 잊어버릴지 결정해요.
    • 출력 게이트: 어떤 정보를 내보낼지 결정해요.
    • 셀 상태: 장기 기억을 저장하는 곳이에요.
    이것은 마치 우리 뇌가 새로운 정보를 받아들이고, 중요하지 않은 것은 잊어버리고, 필요한 정보를 떠올리는 것과 비슷해요.

 

def MinMaxScaler(data):
    numerator = data - np.min(data, 0)
    denominator = np.max(data, 0) - np.min(data, 0)
    return numerator / (denominator + 1e-7)

이 함수는 데이터를 0과 1 사이의 값으로 바꿔주는 거예요. 마치 키가 다른 친구들의 키를 모두 같은 단위로 바꾸는 것과 비슷해요.

 

import tensorflow as tf
from tensorflow.keras import Sequential, layers, callbacks, backend
from tensorflow.keras.layers import Dense, LSTM, Dropout

이 부분은 LSTM 모델을 만드는 데 필요한 도구들을 가져오는 거예요. 마치 레고 블록을 가져오는 것과 비슷해요.

 

for code in tqdm(unique_codes):
    # 학습 데이터 생성
    train_practice = train_total[train_total['종목코드'] == code][['일자','거래량','시가','고가','저가','종가']]
    train_practice['일자'] = pd.to_datetime(train_practice['일자'], format='%Y%m%d')

이 부분은 각 주식에 대한 정보를 가져와서 날짜 형식을 바꾸는 거예요.

 

dfx = train_practice[['거래량','시가','고가','저가', '종가']]
    dfx = MinMaxScaler(dfx)
    dfy = dfx[['종가']]
    dfx = dfx[['거래량','시가','고가','저가', '종가']]

여기서는 주식 정보를 0과 1 사이의 값으로 바꾸고 있어요.

 

window_size = 30  # 1개월 간 학습
    forecast_day = 1  # 1일치 예측
    data_X = []
    data_y = []
    for i in range(len(y) - window_size - forecast_day):
        _X = X[i : i + window_size]
        _y = y[i + window_size : i + window_size + forecast_day]
        data_X.append(_X)
        data_y.append(_y)

이 부분은 30일 동안의 정보를 보고 다음 날의 주가를 예측하도록 데이터를 준비하는 거예요.

 

model = Sequential()
    model.add(LSTM(units=32, activation='relu', return_sequences=True, input_shape=(window_size, features)))
    model.add(Dropout(0.1))
    model.add(LSTM(units=32, activation='relu'))
    model.add(Dropout(0.1))
    model.add(Dense(units=features))

여기서는 LSTM 모델을 만들고 있어요. 32개의 기억 셀을 가진 LSTM 층을 두 개 쌓고, 중간에 Dropout이라는 것을 넣어 모델이 너무 특정 데이터에 맞춰지지 않도록 해요.

 

model.compile(optimizer='adam', loss='mean_squared_error')
    model.fit(data_X, data_y, epochs=20, batch_size=40)

이 부분에서 모델을 학습시키고 있어요. 20번 반복해서 학습하고, 한 번에 40개의 데이터를 보면서 학습해요.

 

for _ in range(0, 15):
        pred_y = model.predict(real_X)
        # ... (예측 결과 처리)

마지막으로, 학습된 모델을 사용해 15일 동안의 주가를 예측하고 있어요.

이렇게 LSTM을 사용하면 과거의 주가 변동을 학습해서 미래의 주가를 예측할 수 있어요.

하지만 주식 시장은 매우 복잡해서 100% 정확한 예측은 불가능하다는 것을 기억해야 해요!

 

[Deep Learning 101] LSTM, 초보자를 위한 안내서

(56) [핵심 머신러닝] RNN, LSTM, and GRU - YouTube