시계열 모델링

2024. 10. 15. 14:35·KT AIVLE School/딥러닝

 

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 연결하는 법

중간에 Dense를 넣고싶으면 True로 해준 후, 펴주기

 

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
적절한 복잡도 찾기  (3) 2024.10.14
분류모델링  (1) 2024.10.11
회귀모델링  (1) 2024.10.11
'KT AIVLE School/딥러닝' 카테고리의 다른 글
  • Functional API 및 다중 입력
  • 모델 저장하기
  • 적절한 복잡도 찾기
  • 분류모델링
Rabet
Rabet
  • 블로그 메뉴

    • 관리자
    • 글쓰기
  • Rabet
    卯
    Rabet
  • 전체
    오늘
    어제
    • Root (139)
      • QA (1)
        • 오류사항 (1)
      • KT AIVLE School (0)
        • Start (4)
        • Python프로그래밍 & 라이브러리 (6)
        • 데이터 처리 및 분석 (7)
        • 데이터 분석 및 의미 찾기 (7)
        • 웹크롤링 (10)
        • 머신러닝 (10)
        • 딥러닝 (6)
        • 시각지능 딥러닝 (10)
        • 언어지능 딥러닝 (6)
        • JAVA (4)
        • SQL (2)
        • 가상화 클라우드 (5)
        • 프로젝트 (8)
      • 웹공부 (14)
        • SPRING (11)
        • React (1)
      • 코딩 알고리즘 스터디 (23)
      • 코딩테스트 (9)
        • JAVA (8)
        • HTML (1)
      • CS공부 (3)
      • 자격증공부 (3)
        • 정보처리기사 (1)
        • 컴퓨터활용능력 1급 (1)
        • AICE Associate (1)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
Rabet
시계열 모델링
상단으로

티스토리툴바