티스토리 뷰

LSTM정리

이번 포스팅은 케라스의 LSTM을 이용한 시계열 예측입니다. 시계열 예측을 하려면 어떤 순서로 해야하는지에 대해서만 썼으며 자세한 코드는 귀차ㄴ 다음에 시간이 되면 쓰도록 하겠습니다. 아래 내용들은 지난 며칠간 인터넷의 예제 코드들과 시중의 책들을 보며 조금씩 알게된 것들로 혹여 잘못된 정보가 있을 시 알려주시면 감사하겠습니다.

 

 

LSTM

LSTM은 RNN의 변형 버전입니다. RNN은 순환신경망으로 다른 NN과 다르게 자신의 아웃풋을 다시 인풋으로 사용합니다. 돌고돈단거죠. 그런데 RNN은 기울기소실과 기울기폭발의 문제 때문에 아주 긴 시퀀스 데이터에서는 성능이 떨어집니다. 그래서 이를 보완하기위해 나온게 LSTM이고 따라서 시계열처럼 긴 자료를 가지고 모델링을 할 때 쓰입니다. LSTM 구조에 대한 자세한 설명은 여기에서 보시는 걸 추천드립니다. 유명한 블로그의 글을 한글로 번역한 곳이고 LSTM을 이해하기 쉽게 설명해두었습니다.

이 문서를 간단히 설명하자면, LSTM은 RNN에 cell과 gate를 추가한 형태로 cell은 과거의 정보를 담고있고 이를 제어하는게 gate입니다. 첫번째 forget gate에서 과거정보를 얼마나 잊을것인지 정합니다. 두번째 input gate에서 지금 정보를 얼마나 유지할 것인가 정합니다. 세번째 이를 가지고 cell의 상태를 업데이트합니다. 네번째 output gate에서 어떤 값을 아웃풋으로 낼 것인지 정해서 다음층으로 넘기면 끝입니다.

만약 잘모르겠다해도 괜찮습니다. 일단은 넘어가죠.

 

 

 

시계열데이터 예측 절차

1) 데이터 나누기

이제 모델링을 하기위해 한단계씩 진행해보겠습니다. 먼저 전체 데이터를 train,valid,test 세가지 세트로 나눕니다. 비율은 적당히 (..) 하시면 됩니다.

2) 스케일 조정하기

train에 MinMaxScaler(feature_range=-1,1) 을 이용하여 스케일을 조정합니다. 스케일조정에서 어떤 코드에선 0~1사이로 또 어떤 코드에선 standardization을 적용하는 것을 보았습니다. 그래서 정확히 어떤 스케일러를 써야하는지는 저도 잘 모르겠네요. ;

3) 베이스라인 만들기

열심히 모델을 만들어서 예측했다해도 비교할 기준점이 없으면 잘 예측했는지 아닌지 알기어려울겁니다. 그러니 기준점이 필요하겠죠? 베이스라인은 Jason Brownlee 의 포스팅을 보고 만들었습니다. 내일의 날씨는 어제의 날씨와 같다고 가정하고 만드는 겁니다. 아무런 모델링을 하지 않았고 단순히 내일 날씨는 어제 날씨와 같을거라고 한게 다입니다. 그러나 의외로 이 베이스라인은 꽤 강력합니다. 결과값은 MAE와 RMSE로 비교하겠습니다.

4) 모델 만들기

그럼 이제 LSTM을 만들어봅시다. LSTM처럼 마지막 아웃풋을 다음 인풋으로 받기위해선 stateful=True로 설정해주어야하며, 이런 stateful 네트워크에선 고정된 배치 사이즈를 정해놓는 것이 좋습니다. 제가 LSTM을 이용해서 모델을 만들 때 제일 힘들었던 건 shape을 어떻게 넣어야하는가 였습니다. LSTM은 3D 텐서를 input으로 넣어줘야하는데 (batch_size, timesteps, features)의 순서로 넣으면 됩니다. 아래코드처럼 batch_input_shape=(batch_size, timesteps, features) 로 지정해도 되고, input_shape=(timesteps,features) 하고 따로 batch_size인자를 이용해서 배치사이즈를 지정해도 무방합니다. 이 때 명심할 점은 배치사이즈는 반드시 데이터 셋으로 나누어떨어지는 숫자여야합니다. 즉 train,valid,test 셋 모두에 대해서 나누어떨어져야하므로 그냥 1로 하는게 마음편합니다...

처음에는 아주 간단하게 모델을 만들어봅시다.

아웃풋은 회귀문제이기 때문에 따로 활성화함수를 지정하지않았고 값 하나를 예측할거니까 Dense(1)로 둡니다. 컴파일의 loss, optimizer,metrics는 본인이 지정할 수 있는데 저는 회귀문제이므로 mse나 mae를 지정했습니다.

5) 모델 훈련 및 검증하기

모델 훈련시에도 배치사이즈를 명시해야하며 쓰지않으면 에러가 납니다. (몰라서 헤맸습니다). 케라스에서 에포크를 돌 때 데이터는 자동으로 셔플되기때문에 데이터의 순서가 중요한 LSTM 에서는 shuffle을 False로 설정해야합니다. train셋에서 훈련하고 검증은 검증데이터로 합니다.

검증은 plot으로 그려서 보면 이해하기 쉽습니다.

뭐 이런식으로 나옵니다. 그럼 실제 test셋에 넣었을때 값도 봐야겠죠.

6) 예측하기

간단하게 test셋에 넣었을 때 결과값을 알고싶다면 evaluate를 쓰면됩니다. 위에서 모델 생성시 loss와 metrics에 각각 mse와 mae를 지정했기때문에 evaluate시 값이 두 개가 나옵니다.

예측포인트를 보고싶다면 model.predict(X_test,batch_size=batch_size)를 하면됩니다.

7) 모델 성능 향상시키기

만약 모델의 성능을 향상시키고 싶다면 여러 시도를 해볼 수 있습니다.

  1. LSTM의 층을 더 쌓기
  2. LSTM의 뉴런 수 바꿔보기
  3. batch_size 바꿔보기
  4. input_shape 바꿔보기
  5. 스케일러 바꿔보기
  6. dropout 사용하기(그러나 시계열에서 dropout을 사용해도 되는지는 잘 모르겠네요)
  7. LSTM 대신 GRU 사용해보기

여러 파라미터들을 바꿔가면서 데이터에 맞는 모델을 찾을 수 있습니다. (힘듭니다.)

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함