딥러닝(LSTM)으로 아파트 지수 예측하기 – 1) 훈련 데이터 생성

이번 포스팅에서는 LSTM으로 아파트 지수 예측하기 실험을 하겠습니다.

LSTM은 RNN(Recurrent Neural Network) 알고리즘의 특별한 한 종류입니다. RNN은 글, 유전자, 손글씨, 음성 신호, 주가 등 배열(sequence 또는 시계열 데이터)의 형태를 갖는 데이터에서 패턴을 인식하는 인공 신경망입니다. LSTM은 기존 RNN을 개선한 모델로 긴 의존 기간(long-term dependency)을 필요로 하는 데이터를 학습하는데 효과적인 모델입니다. RNN과 LSTM에 대한 알고리즘에 대한 설명은 개별 포스팅을 작성해서 추후에 링크 걸어놓도록 하겠습니다.

이번 포스팅에서는 실험을 먼저 진행해 보겠습니다. LSTM 실험에는 시계열 데이터가 필요하기 때문에 연속된 부동산 매매 데이터가 필요합니다. 부동산 개별 실거래가는 매달에 맞춰 거래가 일어나지 않기 때문에 일단 한국감정원에서 배포하는 전국주택가격지수 중에서 강남구의 아파트 거래가격 지수를 사용하겠습니다. 부동산 개별 실거래가를 사용한 실험이나 다른 경제 지표와 같이 수행하는 실험은 이어서 포스팅하겠습니다.

실험에 사용한 전체 코드와 데이터는 여기서 다운로드 받을 수 있습니다. 실험은 google colab (설명)에서 진행했습니다.

실험 데이터 업로드 하기

패키지 import & 실험 데이터 파일 올리기

실험에 사용할 패키지들을 import합니다. 구글 colab에서 데이터 업로드를 하기 위해 google.colab 패키지의 upload 함수를 사용합니다. 아래와 같이 데이터 업로드가 정상적으로 완료되었습니다.

데이터 파일은 아래와 같이 날짜와 그 달의 강남구 아파트 매매 지수가 있는 간단한 형식으로 되어있습니다.

date,trade_price_idx_value
2006-01-01,74.200000000000003
2006-02-01,75.799999999999997
2006-03-01,78.099999999999994
2006-04-01,81.400000000000006
2006-05-01,83.599999999999994
2006-06-01,83.799999999999997
2006-07-01,83.599999999999994
2006-08-01,83.5

데이터 기본 format

df.info()로 데이터를 살펴봅니다. 기간은 2006년도에서 2019년도로 되어있지만 매달 한 건의 강남구 아파트 매매지수만 있다보니 데이터 개수는 생각보다 적습니다. 총 165개의 데이터가 있습니다.

훈련 데이터와 테스트 데이터 분리하기

plot으로 데이터 흐름을 살펴봅니다. 2014년도가 강남구 아파트 매매지수의 저점이였고 그 후 가파르게 상승하고 있습니다. 이제 데이터를 훈련 데이터, 테스트 데이터로 분리합니다. 2017년 1월 1일까지의 데이터를 훈련 데이터, 그 이후의 데이터를 테스트 데이터로 분리합니다.

그래프에서 train set과 test set을 색으로 표시하면 아래와 같습니다.


plot으로 표시된 train, test 데이터 셋

데이터 스케일링(Scaling)

마지막으로 MinMaxScaler 클래스를 사용하여 데이터를 스케일링 합니다. MinMaxScalar(X)는 데이터의 최대값이 1, 최소값이 0이 되도록 변환합니다. 이렇게 데이터의 scale을 맞추면 weight의 scale도 일관성 있게 나올 수 있습니다.

사용방법은 다음과 같습니다.

(1) 훈련 데이터의 분포 추정 : 훈련 데이터를 입력으로 하여 fit 메서드를 실행하여 분포 모수를 객체내에 저장
(2) 훈련 데이터의 변환 : 훈련 데이터를 입력으로 하여 transform 메서드를 실행하면 훈련 데이터를 변환
(3) 테스트 데이터의 변환: 테스트 데이터를 입력으로 하여 transform 메서드를 실행하여 테스트 데이터를 변환.

훈련 데이터는 (1)번과 (2)번 과정을 합쳐서 fit_transform 메서드를 사용하고 테스트 데이터는 transform 메서드를 사용하여 스케일링을 진행합니다.

정규화가 완료된 데이터들은 다시 pandas dataframe 데이터 타입으로 변환합니다. dataframe으로 타입을 변경하는 이유는 pandas는 시계열 자료에 대한 다양한 기능을 제공하여 LSTM에서 사용하는 window를 만들기 유용하기 때문입니다.

sliding window 구성하기

window는 LSTM을 훈련하기 위한 단위로 고정된 사이즈를 가집니다. window가 12개라면 과거 시간 데이터 12개를 사용해서 다음 시간 단위의 값을 예측하게 됩니다. 현재 실험 데이터의 경우 과거의 시간 단위 12개 부동산 지수들이 훈련 속성들이 되고 현재 시간의 부동산 지수가 target이 됩니다.

dataframe의 shift 연산을 사용하면 인덱스는 그대로 두고 데이터만 시간 단위로 이동할 수 있어 sliding window 타입의 데이터를 구성하기에 용이합니다. 예를 들어 shift(1)을 하면 바로 다음 시간 인덱스로 데이터가 이동하며 shift(-1)을 하면 바로 이전 시간 인덱스로 데이터가 이동합니다. 아래 예시를 보면서 자세히 설명해보겠습니다.

shift 사용하여 window 구성

shift(1)을 사용한 칼럼은 데이터 값이 다음 시간 인덱스로 한칸씩 이동한 것을 확인할 수 있습니다. 이렇게 구성된 데이터에서 dropna로 NaN값을 포함한 데이터를 제거하고 드디어 본격적인 실험에 들어갑니다. 생각보다 포스팅이 길어져서 여기서 한번 자르고 다음 포스팅으로 이어 쓰겠습니다.

참고:

LSTM 실험 (Keras) :
https://3months.tistory.com/168

minmax:
https://datascienceschool.net/view-notebook/f43be7d6515b48c0beb909826993c856/

댓글 (4)

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다