모듈
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os
import FinanceDataReader as fdr
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, Conv1D, Lambda
from tensorflow.keras.losses import Huber
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
|
cs |
데이터수집
데이터수집은 FinanceDataReader 모듈을 통해 가져왔으며 추후 개발할 웹사이트와 상호작용하기 위해 외부db와 연결할 예정이다.
1
|
samsung = fdr.DataReader('005930',start='1990')
|
cs |
데이터 전처리
주가 데이터에 대하여 딥러닝 모델이 잘 학습하기위해 정규화(Normalization)을 해줘야한다.
표준화(Standardization)
표준화는 데이터의 평균을 0 분산 및 표준편차를 1로 만들어 주는 과정
표준화를 하는이유는
서로다른 통계 데이터들을 비교하기 쉽기 때문.
표준화를 하면 평균은 0 , 분산과 표준편차는 1로 만들어 데이터의 분포를 단순화시키고 비교를 용이하게 해준다.
ex) (6 10 2 4 8) 의 데이터셋이 있을경우 이를 표준화한다면
데이터의 평균 = (6+10+2+4+8) = 6
분산 = (4^2 + 4^2 + 2^2 + 2^2) / (5-1 ) = 10
표준편차는 10의 제곱근이 된다
표준화공식
표준화 코드
X_ = (X - X.mean() ) / X.std()
16
17
18
19
|
scaler = MinMaxScaler()
scale_cols = ['Open', 'High', 'Low', 'Close', 'Volume']
scaled = scaler.fit_transform(samsung[scale_cols])
scaled #표준화 확인
|
cs |
1
|
df = pd.DataFrame(scaled, columns=scale_cols) #표준화 한 데이터셋을 통해 데이터프레임 생성
|
cs |
Train / test 분할
Train
모델을 학습하기 위한 dataset이다. 한 가지 계속 명심해야할 중요한 사실은
"모델을 학습하는데에는 오직 유일하게 Train dataset만 이용한다"
Test
test set은 학습과 검증이 완료된 모델의 성능을 평가하기위한 dataset이다.
보통 Train : Test 데이터를 8 : 2로 나눈다 .
20
21
22
23
|
x_train, x_test, y_train, y_test = train_test_split(df.drop('Close', 1), df['Close'], test_size=0.2, random_state=0, shuffle=False)
x_train.shape, y_train.shape #데이터확인
x_test.shape, y_test.shape #데이터 확인
x_train #데이터확인
|
cs |
train은 4800개의 데이터로 test는 1200개의 데이터 학습할 데이터와 성능을 평가하기 위한 데이터들을
8:2 로 나눠주었다.
TensroFlow Dataset을 활용한 시퀀스 데이터셋 구성
1
2
3
4
5
6
7
8
9
10
|
def windowed_dataset(series,window_size,batch_size,shuffle):
series = tf.expand_dims(series,axis=-1)
ds = tf.data.Dataset.from_tensor_slices(series)
ds = ds.window(window_size + 1, shift=1, drop_remainder=True)
ds = ds.flat_map(lambda w: w.batch(window_size + 1))
if shuffle:
ds = ds.shuffle(1000)
ds = ds.map(lambda w: (w[:-1], w[-1]))
return ds.batch(batch_size).prefetch(1)
|
cs |
#Series : 시리즈 클래스는 1차원 배열의 값(values)에 각 값에 대응되는 인덱스(index)를 부여할 수 있는 구조를 갖고 있음 우선은 하나의feature(종가)를 기준으로 LSTM모델을 돌릴거
tf.expand_dims()는 배열의 차원을 늘려줍니다.
input에는 늘려질 배열을 넣습니다.
axis는 몇 번째 차원의 크기를 늘릴 건지 숫자를 넣습니다.
axis = -1은 가장 안쪽차원을 추가한다.
ex) shape => ([10,10,3]) 일때 tf.expande_dims( axis= -1)일경우 shape => [10, 10, 3, 1]
tf.data.Dataset.from_tensor_slices 함수는 tf.data.Dataset 를 생성하는 함수로 입력된 텐서로부터 slices를 생성합니다. 예를 들어 학습데이터로 (60000, 28, 28)가 입력되면, 60000개의 slices로 만들고 각각의 slice는 28×28의 구조의 데이터를 갖게 됩니다. 위코드는 1차원구조의 데이터셋을 생성함
dataset.window는 3개의 인자를 전달받는데 window_size와 shift, drop_remainder
window는 요소를 shift만큼 묶어서 서브 dataset을 생성한다.
window_size가 데이터셋의 크기를 초과하는경우가 존재하는데
이를 방지하기 위해 drop_remainder = True 인자를 넣어주면된다.
1
2
|
#하이퍼파라미터 정의
WINDOW_SIZE=20 BATCH_SIZE=32
|
cs |
1
2
|
train_data = windowed_dataset(y_train, WINDOW_SIZE, BATCH_SIZE, True)
test_data = windowed_dataset(y_test, WINDOW_SIZE, BATCH_SIZE, False)
#train_data는 학습용데이터, test_data는 train_data를 통한 학습결과를 검증하기 위한 데이터셋 |
cs |
1
2
3
4
5
|
# X: (batch_size, window_size, feature)
# Y: (batch_size, feature)
for data in train_data.take(1):
print(f'데이터셋(X) 구성(batch_size, window_size, feature갯수): {data[0].shape}')
print(f'데이터셋(Y) 구성(batch_size, window_size, feature갯수): {data[1].shape}')
|
cs |
모델 미구현