from_generator

김채원·2022년 8월 5일
0

time_series

목록 보기
1/1
post-thumbnail

velog 첫글. 여기가 기록용으로 좋을 것 같아 앞으로 꾸준히 쓰려고 한다.

시계열 데이터 예시를 만든다고 만져보았다.
로컬에선 돌아가는데 colab(무료)에서 램이 부족해서 세션이 종료되었다.
train_data = np.array(train_data)
이 부분에서.... shape가 (260640,432,10) 이었음.
그래서 고용량 램 없이 model.fit 시키는걸 목표로 써봤다.
(사실 결제 하는게 가장 속 편하다...)

  1. csv concat
df = pd.DataFrame()

for i in w_list[:-1]:
    
    tmp = pd.read_csv(i)
    tmp = tmp.replace(" ", np.nan)
    tmp = tmp.interpolate(method = 'values')
    tmp = tmp.fillna(0)
    
    df = pd.concat([df,tmp],axis=0)

df.reset_index(inplace=True)
  1. data split (validation 진행 상황을 보고싶었기에..)
from sklearn.model_selection import train_test_split

data = df[["필요한 feature"]]
target = df[[""필요한 feature"]]


x_train, x_valid, y_train, y_valid = train_test_split(data, target, test_size=0.05, shuffle=False, random_state=34)
x_valid.reset_index(inplace=True)
y_valid.reset_index(inplace=True)
  1. generator function define
def train_get():
    for j in range(len(x_train)-432):
        train_data = np.array(x_train.loc[j:j + 431, ["필요한 feature"]].astype(float))
        train_label = np.array(y_train.loc[j + 432, ["필요한 feature"]].astype(float))
        
        yield (train_data,train_label)


def valid_get():
    for j in range(len(x_valid)-432):
        valid_data = np.array(x_valid.loc[j:j + 431, ["필요한 feature"]].astype(float))
        valid_label = np.array(y_valid.loc[j + 432, ["필요한 feature]].astype(float))
        
        yield (valid_data,valid_label)

432는 데이터를 보고 적당히 정한 window size...
아직 많이 다뤄본적이 없어 window_size를 정하는 적정 기준을 모르겠다.

  1. create generator
train_dataset = tf.data.Dataset.from_generator(train_get_water,
                                         output_types=(np.float32, np.float32), 
                                         output_shapes=((432,10),(4,)))

valid_dataset = tf.data.Dataset.from_generator(valid_get_water,
                                         output_types=(np.float32, np.float32), 
                                         output_shapes=((432,10),(4,)))

가변적인 데이터라면 None으로 설정하면 된다.
나는 불안하기도 하고 고정된 길이라서 통일

  1. batch adjust
train_dataset = train_dataset.batch(128)
valid_dataset = valid_dataset.batch(128)
  1. modeling & fit
model = Sequential()
model.add(GRU(256, input_shape=(432, 10)))
model.add(Dense(4, activation = 'relu'))

optimizer = tf.optimizers.RMSprop(0.001)

model.compile(optimizer=optimizer,loss='mse', metrics=['mae'])

model.fit(train_dataset, epochs=10, validation_data=valid_dataset, shuffle=False) 

모델은 그냥 적당히.
batch size 설정을 해줘야 시계열 모델이 원하는 input shape를 맞출 수 있다.. 처음에 이걸 까먹고 애먹었다. 3차원 입력이니 당연한걸...


early stopping을 걸어두면 좋겠지만, 1 epoch 당 9분가량 걸린다...그래서 그냥 귀찮기도 해서 10만 돌리고 말았음. 실제 쓸 때 속도는 무시한다고 가정한다면 epoch을 왕창 늘리고 걸어놓아야 할듯.
너무 적당히 만들었나 싶어서 결과는 처참한데 기록은 중요한거니까...
나중에 까먹는 것 보다 뭐든 낫다.

  • 종목은 시계열인데 왜 회귀모델이 rmse가 더 좋게 나오는지 모르겠음.
    이거 열받네....
profile
잡다한 공부 기록용

0개의 댓글