1. 통계적 시계열 모델링
y의 이전 시점 데이터들로 부터 흐름의 패턴을 추출하여 예측
2. ML 기반 시계열 모델링
특정 시점 데이터들과 예측대상시점과의 관계로부터 패턴을 추출
3. DL 기반 시계열 모델링
시간흐름 구간!! 데이터(2차원)들과 예측대상시점과의 관계로 패턴 추출
잔차 분석 : 실제 데이터 - 예측 ( ADF, PACF )
잔차가 패턴이 있다면 더 해야할 일이 있다.
백색 잡음에 가깝지 않다면 더 해야할 일이 있다.
백색 잡음에 가까우면 잘 된것
3-1. RNN(Recurrent Neural Networks)
최근 데이터를 기반으로 예측
4,4를 뽑았으면, 4개의 Input가 노드를 지나면 각각의 Hidden state(중간 결과물)이 4개가 나온다.
이전 노드를 참고했던 중간 결가물에 input 가중치가 더해지면서 다시 중간 결과물을 출력한다.
이를 tanh가 진행한다. (활성화 함수라고 보면 됨)
① x, y로 데이터 분할
1-1. 다음 주 데이터를 y로 설정(shift사용 후 결측치 제거)
data['y'] = data['AvgTemp'].shift(-1)
data.dropna(axis = 0, inplace = True)
data.tail()
1-2. x, y로 분리
x = data.loc[:, ['AvgTemp']]
y = data.loc[:,'y']
② 스케일링(x는 필수, y는 값이 크면 필수), 모델 평가 시에 원래 값으로 복원
scaler = MinMaxScaler()
x = scaler.fit_transform(x)
③ 3차원 데이터셋 만들기
# 시계열 데이터 전처리 2차원 --> 3차원으로 변환
def temporalize(x, y, timesteps):
nfeature = x.shape[1]
output_x = []
output_y = []
for i in range(len(x) - timesteps + 1):
t = []
for j in range(timesteps):
t.append(x[[(i + j)], :])
output_x.append(t)
output_y.append(y[i + timesteps - 1])
return np.array(output_x).reshape(-1,timesteps, nfeature), np.array(output_y)
x2, y2 = temporalize(x, y, 4) #이전 데이터의 4주간
x_shape, y_shape #((264, 1), (264,))
④ train, val로 분할
shuffle = False로 지정
x_train, x_val, y_train, y_val = train_test_split(x2, y2, test_size= 53, shuffle = False) # 끝에서 53건 자르기
x_train.shape, y_train.shape #((207, 4, 1), (207,))
⑤ 모델링
timesteps = x_train.shape[1] # 4
nfeatures = x_train.shape[2] # 1
clear_session()
model = Sequential([Input(shape = (timesteps, nfeatures)),
SimpleRNN(8, return_sequences = True),
SimpleRNN(8),
Dense(1)])
model.summary()
model.compile(optimizer = Adam(0.01), loss = 'mse')
hist = model.fit(x_train, y_train, epochs = 100, verbose = 0, validation_split = .2).history
# 학습 곡선 그려보기
dl_history_plot(hist)
# 예측, 평가
pred = model.predict(x_val)
mean_absolute_error(y_val, pred)
# 그래프 그리기
plt.figure(figsize = (10,6))
plt.plot(y_val, label = 'actual')
plt.plot(pred, label = 'predicted')
plt.legend()
plt.grid()
plt.show()
return_sequences=False : 가중치가 연결된 마지막 시퀀스 결과값만 연결
return_sequences=True : 모두 연결!
외) Dense 연결하는 법
3-2. LSTM
time step 값에 두 종류의 상태 값 업데이트 관리
① Cell State 업데이트
불필요한 과거는 잊기(Forget Gate)
현재 중요한 데이터만 기억(Input Gate)
② Hidden State 업데이트
이전 기억이 손실되고 최근 기억이 중요함
clear_session()
model3 = Sequential([Input(shape = (timesteps, nfeatures)),
LSTM(8, return_sequences = True),
LSTM(8),
Dense(1)])
model3.summary()
RNN에서 LSTM으로 바꾸기만 하면 가능
'KT AIVLE School > 딥러닝' 카테고리의 다른 글
Functional API 및 다중 입력 (0) | 2024.10.15 |
---|---|
모델 저장하기 (0) | 2024.10.14 |
적절한 복잡도 찾기 (2) | 2024.10.14 |
분류모델링 (1) | 2024.10.11 |
회귀모델링 (1) | 2024.10.11 |