LSTM 으로 아파트 지수 예측하기 실험 1부에 이어서 계속합니다.
데이터에서 빈 값 제거하기
이제 dropna 함수로 빈 값(missing value)을 제거하고 전체 데이터를 훈련 데이터와 테스트 데이터로 분리합니다. 각각의 훈련 데이터와 테스트 데이터는 속성과 타겟 열으로 분리합니다. drop함수는 특정 열이나 칼럼을 제거하는 기능을 합니다 (링크)
X_train = train_sc_df.dropna().drop(‘trade_price_idx_value’, axis=1)
y_train = train_sc_df.dropna()[[‘trade_price_idx_value’]]
X_test = test_sc_df.dropna().drop(‘trade_price_idx_value’, axis=1)
y_test = test_sc_df.dropna()[[‘trade_price_idx_value’]]
X_train.head()

훈련/테스트 데이터 생성하기
이제 dataframe 타입이었던 훈련/테스트 데이터들을 values 를 사용하여 dataframe의 numpy 표현형만 가져옵니다. sklearn을 비롯해서 기계학습 패키지들은 일반적으로 훈련/테스트 데이터로 numpy의 ndarray 타입을 지원합니다. values를 사용하기 전의 X_train은 DataFrame 타입이였지만 values를 사용한 후 numpy.ndarray로 변경된 것을 확인할 수 있습니다.

훈련데이터 X_train은 125개의 데이터 개수와 12개의 slot을 가진것을 확인 할 수 있습니다. 훈련값 y_train은 역시 125개의 데이터 개수와 1개의 target 값을 가지고 있습니다. 여기서 최종 훈련 데이터를 생성하기 위해서는 keras의 LSTM에서 필요로 하는 3차원 데이터로 변환을 시켜줘야 합니다. 최종 데이터의 shape이 (size, timestamp, feature) 형태로 나타나야 합니다. 이번 실험의 경우 속성이 아파트 지수 한가지 이기 때문에 1을 입력하지만 n 개의 속성을 사용할 경우 feature 순서에 n의 값을 입력하면 됩니다.
LSTM 실험하기
LSTM은 기존에 사용하던 Scikit-learn 패키지에서는 제공하지 않기 때문에 케라스(keras)를 사용하였습니다. 케라스는 파이썬으로 작성된 오픈 소스 라이브러리입니다. 텐서플로, Theano 등 유명한 딥러닝 알고리즘 위에서 수행할 수 있으며 딥 신경망 알고리즘들의 빠른 실험을 가능케 하도록 설계되었습니다.
LSTM 모델 생성하기
케라스에서는 층(layer)을 조합하여 모델(model)을 만듭니다. 모델은 (일반적으로) 층의 그래프입니다. 그 중에서도 가장 간단한 형태의 모델은 레이어들을 선형으로 쌓는 Sequential Model 입니다. 케라스에서는 add 함수를 사용하여 층을 쌓습니다. LSTM 레이어와 Dense 레이어 하나를 추가합니다. Dense는 완전 연결 레이어(fully connected layer)으로 기본적인 레이어 중 하나입니다. 예측하고자 하는 target의 개수가 하나이므로 Dense(1)을 출력으로 사용합니다.
전체 모델은 다음과 같은 2개의 레이어로 구성되었습니다.
- 20 메모리 셀을 가진 LSTM 레이어 하나
- Dense 레이어 하나 (output)
케라스는 input이 어떤 모양으로 들어올지에 대한 정보가 필요합니다. 그 정보를 알려주는 것이 input_shape 입니다. 데이터 개수(size)는 중요하지 않기 때문에 timestep과 feature만 알려주면 됩니다. 모델을 구성한 후 compile 메서드를 호출하여 학습 과정을 설정합니다.
compile에는 중요한 3가지 변수가 있습니다.
- optimizer : 훈련 과정을 설정합니다.
- loss : 최적화 과정에서 최소화될 손실 함수(loss function)를 설정합니다.
- metrics : 훈련을 모니터링하기 위해 사용됩니다.
일반적으로 사용하는 adam을 optimizer로 사용하고 연속된 값 예측이라 mean_squared_error를 loss 값으로 설정합니다. 마지막으로 summary 메소드로 모델 구성 내용을 확인합니다.

모델 훈련하기
케라스에서는 fit 메소드를 통해서 훈련을 합니다. fit 메소드에서 첫번째 인자는 훈련데이터이고 두번째 인자는 지도 학습에서 레이블 데이터입니다.
fit 메소드에서 중요한 파라미터 설명입니다.
- epochs : 훈련은 에포크(epoch)로 구성됩니다. 한 에포크는 전체 입력 데이터를 한번 순회하는 것입니다(작은 배치로 나누어 수행됩니다).
- batch_size : numpy 데이터를 전달하면 모델은 데이터를 작은 배치로 나누고 훈련 과정에서 이 배치를 순회합니다. 이 정수 값은 배치의 크기를 지정합니다. 전체 샘플 개수가 배치 크기로 나누어 떨어지지 않으면 마지막 배치의 크기는 더 작을 수 있습니다.
- validation_data(x_val, y_val) = 검증 데이터(validation data)를 사용합니다. 검증 데이터를 사용하면 각 에포크마다 검증 데이터의 정확도도 함께 출력되는데, 이 정확도는 훈련이 잘 되고 있는지를 보여줄 뿐이며 실제로 모델이 검증 데이터를 학습하지는 않습니다. 검증 데이터의 loss가 낮아지다가 높아지기 시작하면 이는 과적합(overfitting)의 신호입니다.
- validation_split : validation_data 대신 사용할 수 있습니다. 검증 데이터를 사용하는 것은 동일하지만, 별도로 존재하는 검증 데이터를 주는 것이 아니라 X_train과 y_train에서 일정 비율을 분리하여 이를 검증 데이터로 사용합니다. 역시나 훈련 자체에는 반영되지 않고 훈련 과정을 지켜보기 위한 용도로 사용됩니다. 사용 예시 : validation_split=0.2
- verbose : 훈련의 진행과정을 보여줍니다. 0일 경우 아무것도 출력하지 않고, 1일 경우 훈련의 진행도를 보여주는 진행 막대를 보여줍니다. 2일 경우 미니 배치마다 손실 정보를 출력합니다.
batch_size 와 epochs
모델을 훈련하다는 것은 훈련용 데이터 셋을 이용하여 최적화 과정을 통해 모델의 weight를 찾는 것입니다. 데이터가 많을 경우 전체 데이터를 메모리에 올리기 힘들 뿐만 아니라, 너무 큰 데이터를 한번에 학습시키면 가장 작은 cost값으로 수렴하기 힘들다는 문제가 있습니다. 그렇기 때문에 큰 덩어리를 일정크기의 작은 덩어리로 잘라서 모델에 넣어서 학습시키는데, 이 작은 덩어리의 크기를 batch size라고 합니다.
Epoch는 전체 데이터 셋에 대해 한번의 학습 과정이 완료되었다는 의미로 epochs=100이면 전체 데이터를 100번 사용해서 학습을 거치는 것이다. 원래 epoch는 인공 신경망에서 전체 데이터셋에 대해 forward pass/backward pass 과정을 거친 것을 의미한다. 즉 전체 데이터 셋에 대해 한 번 학습을 완료한 상태이다. ( epoch : one epoch is when an entire dataset is passed forward and backward through the neural network only Once)
이번 실험에서는 epochs를 100, batch_size를 30으로 진행하였습니다. 그리고 debug 정보는 출력하되 진행 정보만 확인할 수 있도록 1을 선택했습니다. 아래는 훈련 결과 화면으로 epoch 가 진행될때마다 loss 값이 줄어드는 것을 확인할 수 있습니다.

evaluate 메소드를 사용하여 compile에서 사용했던 metric, mse 값이 얼마나 나오는지 확인해보았습니다. mse 값은 0.07이 나왔습니다.

test 데이터 값이 0.95에서 1.72까지 나오는 것을 감안하면 그렇게 나쁜 결과가 아닌 것 같긴 합니다.

그렇지만 좀 더 결과를 시각적으로 확인하기 위해 실제 값과 예측 값을 plot으로 뿌려보기로 했습니다.

원래 값과 예측 값이 일치하면 직선에 가깝게 분포가 되는데 결과는 그리 만족스럽지 않은 것 같습니다. 실제 강남 부동산 지수보다 예측 부동산 지수가 전반적으로 낮게 나오고 있습니다. 그 원인은 아마도 훈련 데이터 들이 대부분 부동산 침체기 시기 데이터를 사용 되었고 최근 데이터인 테스트 데이터는 훈련 데이터에는 없던 높은 지수가 많아서 인 것으로 생각됩니다. 훈련 데이터를 최근 데이터까지 포함해서 좀더 범위를 높이면 성능은 좀 더 좋아질 것이라 생각됩니다. 그렇지만 부동산 지수를 예측하는 것이 목표가 아니라서 일단은 여기서 멈추겠습니다.

이제 본격적으로 부동산 실거래가 데이터를 사용해서 LSTM으로 예측을 하는 실험을 이어서 해보겠습니다 : )

포스팅 참고 링크
keras documentation :
https://keras.io/layers/recurrent/#lstm
https://keras.io/models/sequential/
https://keras.io/getting-started/sequential-model-guide/
https://www.tensorflow.org/guide/keras/overview?hl=ko
https://wikidocs.net/32105
https://blog.naver.com/qbxlvnf11/221449595336
https://keras.io/getting-started/sequential-model-guide
s://pozalabs.github.io/lstm/
http://blog.naver.com/PostView.nhn?blogId=qbxlvnf11&logNo=221449297033&parentCategoryNo=&categoryNo=52&viewDate=&isShowPopularPosts=false&from=postView
LSTM 이론 설명 :
https://dgkim5360.tistory.com/entry/understanding-long-short-term-memory-lstm-kr
RNN 설명 (동영상) :