728x90

모듈

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

 

 

모델 미구현

728x90

+ Recent posts