074 PyCaret 시계열 모듈 시작하기
키워드: pycaret time series, 시계열 모듈
개요
PyCaret 3.0부터 시계열 예측 모듈이 추가되었습니다. 다양한 시계열 예측 알고리즘을 간편하게 사용할 수 있으며, 자동화된 모델 선택과 하이퍼파라미터 튜닝을 제공합니다.
실습 환경
- Python 버전: 3.11 권장
- 필요 패키지:
pycaret[full]>=3.0
시계열 모듈 임포트
from pycaret.time_series import *
샘플 데이터 준비
import pandas as pd
import numpy as np
# 074 시계열 데이터 생성
np.random.seed(42)
dates = pd.date_range('2020-01-01', periods=365*2, freq='D')
# 074 구성 요소
trend = np.linspace(100, 150, len(dates))
seasonality = 20 * np.sin(2 * np.pi * np.arange(len(dates)) / 365)
weekly = 5 * np.sin(2 * np.pi * np.arange(len(dates)) / 7)
noise = np.random.normal(0, 5, len(dates))
values = trend + seasonality + weekly + noise
# 074 데이터프레임
data = pd.DataFrame({
'date': dates,
'value': values
})
data.set_index('date', inplace=True)
print(f"데이터 기간: {data.index.min()} ~ {data.index.max()}")
print(f"데이터 수: {len(data)}")
print(data.head())
setup() 함수
from pycaret.time_series import *
# 074 환경 설정
ts = setup(
data=data,
target='value',
fh=30, # 예측 기간 (forecast horizon)
session_id=42,
verbose=False
)
print("설정 완료!")
주요 파라미터
ts = setup(
data=data,
target='value',
fh=30, # 예측 기간
fold=3, # 교차 검증 폴드 수
seasonal_period=365, # 계절 주기 (자동 감지도 가능)
fold_strategy='expanding',# 교차 검증 전략
numeric_imputation_target='drift', # 결측치 처리
session_id=42,
verbose=False
)
교차 검증 전략
expanding: 학습 데이터 누적 증가
┌───────┐ test
├────────┐ test
├─────────┐ test
sliding: 고정 크기 윈도우 이동
┌───┐ test
┌───┐ test
┌───┐ test
지원 알고리즘 확인
from pycaret.time_series import *
ts = setup(data, target='value', fh=30, session_id=42, verbose=False)
# 074 지원 모델 목록
print(models())
주요 알고리즘:
| 모델 ID | 알고리즘 | 설명 |
|---|---|---|
| naive | Naive | 단순 예측 (마지막 값) |
| snaive | Seasonal Naive | 계절 단순 예측 |
| polytrend | Polynomial Trend | 다항식 추세 |
| arima | ARIMA | 자기회귀 통합 이동평균 |
| auto_arima | Auto ARIMA | 자동 ARIMA |
| exp_smooth | Exponential Smoothing | 지수 평활 |
| ets | ETS | 오차, 추세, 계절성 분해 |
| theta | Theta | 세타 방법 |
| prophet | Prophet | Facebook Prophet |
| lr_cds_dt | Linear w/ Deseasonalize | 선형 회귀 + 계절성 제거 |
| en_cds_dt | Elastic Net w/ Deseasonalize | Elastic Net + 계절성 제거 |
| ridge_cds_dt | Ridge w/ Deseasonalize | Ridge + 계절성 제거 |
| lasso_cds_dt | Lasso w/ Deseasonalize | Lasso + 계절성 제거 |
| lightgbm_cds_dt | LightGBM w/ Deseasonalize | LightGBM + 계절성 제거 |
create_model() 함수
from pycaret.time_series import *
ts = setup(data, target='value', fh=30, session_id=42, verbose=False)
# 074 단순 모델
naive = create_model('naive')
# 074 Auto ARIMA
arima = create_model('auto_arima')
# 074 지수 평활
exp_smooth = create_model('exp_smooth')
# 074 Prophet
prophet = create_model('prophet')
# 074 LightGBM
lgbm = create_model('lightgbm_cds_dt')
모델 비교
from pycaret.time_series import *
ts = setup(data, target='value', fh=30, fold=3, session_id=42, verbose=False)
# 074 여러 모델 비교
best = compare_models()
# 074 상위 3개 모델
top3 = compare_models(n_select=3)
# 074 특정 모델만 비교
selected = compare_models(include=['naive', 'arima', 'exp_smooth', 'prophet'])
예측 수행
from pycaret.time_series import *
ts = setup(data, target='value', fh=30, session_id=42, verbose=False)
# 074 모델 생성
model = create_model('auto_arima')
# 074 예측
predictions = predict_model(model)
print(predictions)
# 074 예측 기간 변경
predictions_60 = predict_model(model, fh=60)
시각화
from pycaret.time_series import *
import matplotlib.pyplot as plt
ts = setup(data, target='value', fh=30, session_id=42, verbose=False)
model = create_model('auto_arima')
# 074 예측 시각화
plot_model(model, plot='forecast')
# 074 진단 플롯
plot_model(model, plot='diagnostics')
# 074 분해 플롯
plot_model(model, plot='decomp')
# 074 잔차 ACF
plot_model(model, plot='acf')
# 074 잔차 분포
plot_model(model, plot='residuals')
교차 검증 결과 확인
from pycaret.time_series import *
ts = setup(data, target='value', fh=30, fold=5, session_id=42, verbose=False)
# 074 모델 생성 (교차 검증 자동 실행)
model = create_model('auto_arima')
# 074 각 폴드별 성능 확인
# 074 create_model 실행 시 출력되는 테이블에서 확인
# 074 최종 모델의 메트릭
# 074 MASE, RMSSE, MAE, RMSE, MAPE, SMAPE, R2
모델 저장 및 로드
from pycaret.time_series import *
ts = setup(data, target='value', fh=30, session_id=42, verbose=False)
model = create_model('auto_arima')
# 074 모델 저장
save_model(model, 'ts_model')
# 074 모델 로드
loaded_model = load_model('ts_model')
# 074 로드한 모델로 예측
predictions = predict_model(loaded_model)
전체 워크플로우 예제
from pycaret.time_series import *
import pandas as pd
import numpy as np
# 1. 데이터 준비
np.random.seed(42)
dates = pd.date_range('2020-01-01', periods=365*2, freq='D')
values = (100 + np.linspace(0, 50, len(dates)) +
20 * np.sin(2 * np.pi * np.arange(len(dates)) / 365) +
np.random.normal(0, 5, len(dates)))
data = pd.DataFrame({'date': dates, 'value': values})
data.set_index('date', inplace=True)
# 2. 환경 설정
ts = setup(
data=data,
target='value',
fh=30,
fold=3,
session_id=42,
verbose=False
)
# 3. 모델 비교
print("=== 모델 비교 ===")
best = compare_models(n_select=3)
# 4. 최적 모델로 예측
print("\n=== 예측 ===")
predictions = predict_model(best[0])
print(predictions.head())
# 5. 시각화
plot_model(best[0], plot='forecast')
# 6. 저장
save_model(best[0], 'best_ts_model')
print("\n모델 저장 완료!")
PyCaret 시계열 데이터세트
from pycaret.datasets import get_data
# 074 내장 시계열 데이터세트 사용
airline = get_data('airline')
print(airline.head())
print(f"Shape: {airline.shape}")
# 074 setup에 사용
from pycaret.time_series import *
ts = setup(
data=airline,
fh=12, # 12개월 예측
session_id=42,
verbose=False
)
best = compare_models()
자주 사용하는 설정
from pycaret.time_series import *
# 074 일별 데이터 (연간 계절성)
ts_daily = setup(
data=data,
target='value',
fh=30,
seasonal_period=365,
session_id=42
)
# 074 월별 데이터 (연간 계절성)
ts_monthly = setup(
data=monthly_data,
target='value',
fh=12,
seasonal_period=12,
session_id=42
)
# 074 주별 데이터 (연간 계절성)
ts_weekly = setup(
data=weekly_data,
target='value',
fh=52,
seasonal_period=52,
session_id=42
)
정리
- PyCaret 시계열:
from pycaret.time_series import * setup()으로 환경 설정 (fh, fold 중요)compare_models()로 최적 모델 탐색create_model()로 개별 모델 생성predict_model()로 예측 수행plot_model()로 시각화
다음 글 예고
다음 글에서는 단변량 시계열 예측을 다룹니다.
PyCaret 머신러닝 마스터 시리즈 #074