메뉴 건너뛰기

컴퓨터비전 및 그래픽스 실습

# 필요한 라이브러리 설치 및 데이터 다운로드

!pip install gdown

!mkdir dataset

!gdown --id 1Hen6NV84zXTQgKh2o0hbi6sPvrGPhd0m --output dataset/2023_5y_ago.csv

 

# 필수 라이브러리 불러오기

import pandas as pd               # CSV 파일을 읽기 위한 pandas

import numpy as np                # 수치 계산 및 배열 처리를 위한 numpy

import matplotlib.pyplot as plt   # 시각화를 위한 matplotlib

from keras.models import Sequential

from keras.layers import LSTM, Dropout, Dense, Activation

# from keras.callbacks import TensorBoard, ModelCheckpoint, ReduceLROnPlateau

import datetime

 

# CSV 데이터 불러오기

data = pd.read_csv('dataset/2023_5y_ago.csv')

data.head()

 

# 고가와 저가의 평균값으로 '중간가격'을 계산

high_prices = data['High'].values

low_prices = data['Low'].values

mid_prices = (high_prices + low_prices) / 2

 

# 시계열 데이터의 윈도우 크기 설정

seq_len = 50                      # 시퀀스 길이 (입력으로 사용될 과거 데이터 수)

sequence_length = seq_len + 1    # 예측을 위해 다음 1개 포함

 

# 시퀀스를 순차적으로 슬라이딩하며 학습에 사용할 데이터 생성

result = []

for index in range(len(mid_prices) - sequence_length):

    result.append(mid_prices[index: index + sequence_length])

 

# 각 윈도우 시퀀스를 첫 번째 값을 기준으로 정규화 (상대적 변화율로 학습)

normalized_data = []

for window in result:

    normalized_window = [((float(p) / float(window[0])) - 1) for p in window]

    normalized_data.append(normalized_window)

 

result = np.array(normalized_data)

 

# 훈련 데이터와 테스트 데이터 분할 (90% 학습, 10% 테스트)

row = int(round(result.shape[0] * 0.9))

train = result[:row, :]

np.random.shuffle(train)   # 훈련 데이터 셔플링 (과적합 방지)

 

# 입력값과 타깃값 분리

x_train = train[:, :-1]                       # 입력값 (50개)

x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))  # LSTM에 맞게 3차원으로 변형

y_train = train[:, -1]                        # 정답값 (미래 1개)

 

x_test = result[row:, :-1]

x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))

y_test = result[row:, -1]

 

# 입력값 형태 확인

x_train.shape, x_test.shape

 

# LSTM 모델 정의

model = Sequential()  # 순차 모델 정의

 

# 첫 번째 LSTM 층: 유닛 50개, 시퀀스를 다음 층으로 넘김

model.add(LSTM(50, return_sequences=True, input_shape=(50, 1)))

 

# 두 번째 LSTM 층: 유닛 64개, 마지막 시퀀스만 반환

model.add(LSTM(64, return_sequences=False))

 

# 출력층: 선형 활성화로 연속적인 수치 예측

model.add(Dense(1, activation='linear'))

 

# 모델 컴파일: 손실 함수는 MSE, 옵티마이저는 RMSProp

model.compile(loss='mse', optimizer='rmsprop')

 

# 모델 구조 출력

model.summary()

 

# 모델 학습 수행

model.fit(x_train, y_train,

    validation_data=(x_test, y_test),  # 검증 데이터 제공

    batch_size=10,                     # 배치 크기

    epochs=20)                         # 학습 반복 횟수

 

# 테스트 데이터로 예측 수행

pred = model.predict(x_test)

 

# 결과 시각화: 실제값 vs 예측값

fig = plt.figure(facecolor='white')

ax = fig.add_subplot(111)

ax.plot(y_test, label='True')         # 실제값 그래프

ax.plot(pred, label='Prediction')     # 예측값 그래프

ax.legend()                           # 범례 추가

plt.show()

 
제목 날짜
태그 목록
위로