컴퓨터비전 및 그래픽스 실습 11주차
# 필요한 라이브러리 설치 및 데이터 다운로드
!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()