흔히 주식 예측 프로그램, 물가 예측 프로그램을 만들었다는 이야기를 들을 수 있다. 그렇다면 시간에 따라 변하는 데이터를 어떻게 예측할 수 있을까?
1. 시계열 문제
시계열 분석이란 시간에 따라 변하는 데이터를 사용하여 추이를 분석하는 것이다. 주가 변동, 환율 변동, 기온 및 습도 변화 등이 대표적인 시계열 분석이다. 즉, 추세를 파악하거나 향후 전망 등을 예측하기 위한 용도로 시계열 분석을 사용한다. 시계열 형태는 데이터 변동 유형에 따라 불규칙 변동, 추세 변동, 순환 변동, 계절 변동으로 구분할 수 있다.
● 불규칙 변동 : 시계열 자료에서 시간에 따른 규칙적인 움직임과 달리 어떤 규칙성이 없어 예측 불가능하고 우연적으로 발생하는 변동을 의미한다. 예를 들면 전쟁, 홍수, 화재, 지진, 파업 등이 있다.
● 시계열 자료가 갖는장기적인 변화 추세를 의미한다. 추세란 장기간에 걸쳐 지속적으로 증가, 감소하거나 일정한 상태를 유지하려는 성향을 의미하기 때문에 짧은 기간 동안에는 추세 변동을 찾기 어려운 단점이 있다. 예를 들면 국내 총생산(GDP), 인구 증가율이 있다.
● 순환 변동 : 대체로 2 ~ 3년 정도의 일정한 기간을 주기로 순환적으로 나타내는 변동을 의미한다. 즉, 1년 이내 주기로 곡선을 그리며 추세 변동에 따라 변동하는 것으로 경기 변동이 대표적이다.
● 계절 변동 : 계절적 영향과 사회적 관습에 따라 1년 주기로 발생하는 것을 의미한다. 보통 계절에 따라 순환하며 변동하는 특성이 있다.
2. AR, MA, ARMA, ARIMA
시계열 분석은 독립 변수를 사용하여 종속 변수를 예측하는 일반적인 머신 러닝에서 시간을 독립 변수로 사용한다는 특징이 있다.
# AR 모델
이전 관측 값이 이후 관측 값에 영향을 준다는 아이디어에 대한 모형으로 자기 회귀 모델이라고도 한다.
1은 시계열 데이터에서 현재 시점을 의미하며, 2는 과거가 현재에 미치는 영향을 나타내는 모수에 시계열 데이터의 과거 시점을 곱한 것이다. 마지막으로 3은 시계열 분석에서 오차 항을 의미하며 백색 잡음이라고도 한다. 따라서 수식은 p 시점을 기준으로 그 이전의 데이터에 의해 현재 시점의 데이터가 영향을 받는 모형이라고 할 수 있다.
# MA 모델
트렌드가 변화하는 상황에 적합한 회귀 모델이다. 이동 평균 모델에서는 윈도우라는 개념을 사용하는데, 시계열을 따라 윈도우 크기만큼 슬라이딩된다고 하여 이동 평균 모델이라고 한다.
1은 시계열 데이터에서 현재 시점을 의미하며, 2는 매개변수에 과거 시점의 오차를 곱한 것이다. 3은 오차 항을 의미한다. 따라서 AR 모델처럼 이전 데이터의 상태에서 현재 데이터의 상태를 추론하는 것이 아닌, 이전 데이터의 오차에서 현재 데이터의 상태를 추론하겠다는 의미이다.
# ARMA 모델
AR과 MA를 섞은 모델로 연구 기관에서 주로 사용한다. AR, MA 두 관점에서 과거의 데이터를 사용하는 것이 ARMA이다.
# ARIMA 모델
자기 회귀와 이동 평균을 모두 고려하는 모형인데, ARMA와 달리 과거 데이터의 선형 관계뿐만 아니라 추세까지 고려한 모델이다.
1. ARIMA 함수를 호출하여 사용하는데, ARIMA(p, d, q) 함수에서 쓰는 파라미터는 다음과 같다.
● p : 자기 회귀 차수
● d : 차분 차수
● q : 이동 평균 차수
2. fit() 메서드를 호출하고 모델에 데이터를 적용하여 훈련시킨다.
3. predict() 메서드를 호출하여 미래의 추세 및 동향에 대해 예측한다.
코드를 통해서 한번 이해해 보자!
from pandas import read_csv
from pandas import to_datetime
from pandas import DataFrame
from statsmodels.tsa.arima.model import ARIMA
from matplotlib import pyplot
import numpy as np
import pandas as pd
from sklearn.metrics import mean_absolute_error
def parser(x):
return to_datetime.strptime('199'+x, '%Y-%m')
series = pd.read_csv('/home/oriental8/dev/DL/ARIMA/sales.csv', header=0, parse_dates=[0], index_col=0, encoding='iso-8859-1')
if series.shape[1] == 1:
series = series.squeeze()
X = series.values
X = np.nan_to_num(X)
size = int(len(X) * 0.66)
train, test = X[0:size], X[size:len(X)]
history = [x for x in train]
predictions = list()
odel = ARIMA(history, order=(5,1,0))
model_fit = model.fit()
print(model_fit.summary())
residuals = DataFrame(model_fit.resid)
residuals.plot()
pyplot.show()
residuals.plot(kind='kde')
pyplot.show()
print(residuals.describe())
print('-----------------------------------------------')
for t in range(len(test)):
model2 = ARIMA(history, order=(5,1,0))
model2_fit = model2.fit()
output = model2_fit.forecast()
yhat = output[0]
predictions.append(yhat)
obs = test[t]
history.append(obs)
print('predict = %f , expected = %f' % (yhat, obs))
error = mean_absolute_error(test, predictions)
print('Test MSE : %.3f' % error)
pyplot.plot(test)
pyplot.plot(predictions, color='red')
pyplot.show()
결과 값을 보면...
다음 시간에는 RNN에 대해서 학습하겠다
'AI > DeepLearning' 카테고리의 다른 글
[DL] LSTM & GRU & 양방향 RNN (0) | 2024.11.15 |
---|---|
[DL] RNN (7) | 2024.11.13 |
[DL] CNN (2) | 2024.11.08 |
[DL] 딥러닝의 구조 (3) | 2024.10.01 |
[DL] 딥러닝을 위한 준비 (3) | 2024.09.27 |