velog 첫글. 여기가 기록용으로 좋을 것 같아 앞으로 꾸준히 쓰려고 한다.
시계열 데이터 예시를 만든다고 만져보았다.
로컬에선 돌아가는데 colab(무료)에서 램이 부족해서 세션이 종료되었다.
train_data = np.array(train_data)
이 부분에서.... shape가 (260640,432,10) 이었음.
그래서 고용량 램 없이 model.fit 시키는걸 목표로 써봤다.
(사실 결제 하는게 가장 속 편하다...)
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)
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)
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를 정하는 적정 기준을 모르겠다.
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으로 설정하면 된다.
나는 불안하기도 하고 고정된 길이라서 통일
train_dataset = train_dataset.batch(128)
valid_dataset = valid_dataset.batch(128)
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을 왕창 늘리고 걸어놓아야 할듯.
너무 적당히 만들었나 싶어서 결과는 처참한데 기록은 중요한거니까...
나중에 까먹는 것 보다 뭐든 낫다.