시계열 예측, 모델 선택의 늪에 빠지다
시계열 예측을 하다 보면 누구나 한 번은 이런 고민에 빠집니다. "PatchTST가 좋을까, FlowState가 좋을까?" 산업용 신호처럼 매끄러운 데이터에는 잘 맞는 모델이, 노이즈 많은 리테일 수요나 긴 계절성 구간에서는 처참한 성능을 보이기도 하죠. 결국 데이터마다 최적의 모델이 다르고, 그걸 일일이 실험하는 비용이 만만치 않습니다.
IBM Research가 공개한 Granite Timeseries Ensemble은 이 "선택의 고통"을 없애는 걸 목표로 합니다. 서로 다른 아키텍처를 가진 4개의 Granite 모델을 하나의 레시피로 묶어서, 별도 학습이나 앙상블 가중치 피팅 없이 바로 중앙값(median)과 분위수(quantile) 예측을 뽑아주는 구조예요. 날씨 예보에서 여러 모델을 앙상블로 돌려 예측 범위를 보는 것과 같은 원리라고 보시면 됩니다.

설치부터 실행까지 5분 컷
우선 granite-tsfm 패키지를 설치하고, Hugging Face에서 권장 4-모델 레시피를 바로 불러옵니다.
pip install "granite-tsfm>=0.3.11"
import pandas as pd
from tsfm_public.models.ensemble.modeling_ensemble import QuantileEnsembleForecaster
# ETT 데이터셋 로드 (예시용 시계열 데이터)
df = pd.read_csv(
"https://raw.githubusercontent.com/zhouhaoyi/ETDataset/main/ETT-small/ETTh1.csv",
parse_dates=["date"],
)
# 사전학습된 앙상블 레시피 로드 (가중치 병합 X, 설정만 저장됨)
ensemble = QuantileEnsembleForecaster.from_pretrained(
"ibm-granite/granite-timeseries-ensemble-r1",
)
# 예측 실행
result = ensemble(
df.tail(1024),
timestamp_column="date",
target_columns=["OT"],
context_length=1024,
prediction_length=24,
)
print(result.prediction_outputs) # 포인트 예측값
print(result.quantile_outputs) # 분위수 예측값 (기본 0.1 ~ 0.9)
여기서 중요한 포인트가 있어요. 이 레시피는 모델 가중치를 병합한 게 아니라 설정만 저장합니다. 실행 시점에 4개 멤버 체크포인트를 런타임에 다운로드하기 때문에 첫 실행은 시간이 좀 걸릴 수 있어요 😅
result.prediction_outputs는 중심 예측값, result.quantile_outputs는 분위수 예측값입니다. 0.1과 0.9 분위수를 쓰면 명목상 80% 커버리지를 갖는 예측 구간을 만들 수 있죠.
기본 레시피에 포함된 4개 모델
| 모델 | 아키텍처 |
|---|---|
| Granite PatchTST-FM-r1 | Patched Transformer |
| Granite PatchTST-FM-r2 | Patched Conformer |
| Granite FlowState-r1.1 | State-space model |
| Granite TTM-r3 | Tiny Time Mixers (MLP mixer) |
네 아키텍처가 트렌드, 계절성, 국소 변동을 서로 다른 방식으로 포착하기 때문에 에러가 겹치지 않는 게 앙상블의 핵심입니다.

Probabilistic vs IQR, 뭘 써야 할까?
두 레시피의 차이는 가중치를 어떻게 주느냐입니다.
Probabilistic Ensemble (권장 기본값)
- 4개 멤버에 동일한 영향력을 부여
- 확률 공간에서 분위수를 풀링한 뒤 요청 분위수를 추출
- 가중치가 고정이라 피팅 단계도, 튜닝할 하이퍼파라미터도 없음
"예측 조합 퍼즐(forecast combination puzzle)"이라는 유명한 현상이 있는데, 포인트 예측에서는 추정 가중치를 쓰는 복잡한 방법보다 단순 등가중 조합이 더 잘 버티는 경우가 많다는 겁니다. 이 레시피는 그 아이디어를 확률 예측에 적용한 거예요.
IQR Ensemble (적응형 대안)
- 각 멤버의 **예측 분포 폭(spread)**에 따라 가중치 부여
- 폭이 좁은 멤버에 더 큰 영향력
- 샘플, 타깃, 예측 지평마다 가중치가 달라짐
- Isotonic regression으로 결합 분위수가 교차하지 않도록 보정
# IQR 레시피로 바꾸려면 subfolder만 변경
ensemble = QuantileEnsembleForecaster.from_pretrained(
"ibm-granite/granite-timeseries-ensemble-r1",
subfolder="recipes/granite-iqr",
)
⚠️ 주의할 점: 폭이 좁다고 해서 반드시 정확하거나 캘리브레이션이 잘 된 예측은 아닙니다. IQR 가중치는 과신(overconfident) 멤버를 편애할 위험이 있어요. 실험하려면 temperature(값이 높을수록 균등 가중치에 가까워짐)와 단일 멤버 가중치 상한(cap)을 조절해 보세요.
GIFT-Eval 벤치마크 결과 (97개 구성, 2026-10-20 기준)
| Forecast | MASE ↓ | MASE Rank ↓ | CRPS/MWQL ↓ | CRPS Rank ↓ |
|---|---|---|---|---|
| Granite Ensemble R1 — Prob | 0.683★ | 47.175★ | 0.471 | 50.948 |
| Granite Ensemble R1 — IQR | 0.684 | 48.773 | 0.471 | 47.619★ |
| Granite PatchTST-FM-r2 | 0.685 | 51.371 | 0.467★ | 48.918 |
| Granite FlowState-r1.1 | 0.701 | 66.474 | 0.490 | 69.485 |
| Granite PatchTST-FM-r1 | 0.717 | 74.794 | 0.488 | 68.134 |
| Granite TTM-r3 | 0.724 | 83.062 | 0.520 | 88.959 |
★ 표시는 해당 지표에서 최고값. 낮을수록 좋음.
결과를 보면 두 앙상블 모두 4개 개별 모델보다 집계 MASE와 평균 MASE Rank에서 우수합니다. Prob 앙상블이 MASE 0.683으로 PatchTST-FM-r2(0.685)를 근소하게 앞서죠. 다만 CRPS/MWQL에서는 PatchTST-FM-r2가 여전히 최저라는 점, IQR 앙상블이 CRPS Rank에서는 가장 좋다는 점이 흥미롭습니다. 집계 오차와 평균 순위가 서로 다른 선택을 가리킨다는 뜻이에요.
핵심은 "리더보드 1등"이 아니라, **어떤 데이터가 들어와도 사전에 모델을 고르지 않아도 된다는 견고함(robustness)**입니다. MASE 격차가 작다는 건, 반대로 말하면 "최적 멤버를 미리 알 필요 없이 비슷하거나 더 나은 정확도를 얻는다"는 실무적 가치가 크다는 거죠.

실무 적용 전 반드시 체크할 것들
1. 국내 개발 환경에서의 적용 맥락
국내 SI·금융권 환경에서는 **추론 비용과 지연(latency)**이 특히 민감합니다. 이 앙상블은 4개 체크포인트를 동시에 로드하기 때문에 단일 모델 대비 메모리와 추론 시간이 대략 4배 수준으로 늘어납니다. 배치성 예측 파이프라인이라면 상관없지만, 실시간 대시보드나 API 응답에 넣으려면 반드시 런타임/메모리 측정 후 도입 여부를 판단하세요. 온프레미스 환경이라면 모델 캐시 경로를 사전에 잡아두는 것도 잊지 마시고요.
2. 이 기술의 한계와 주의사항
- 채널 독립 예측: 현재 레시피는 다변량 채널을 서로 독립적으로 예측합니다. 채널 간 상관관계(예: 전력 수요-기온)를 활용하지 못한다는 뜻이에요.
- 멤버 스펙 불일치: 멤버마다 context limit, 예측 지평, 전처리, 결측치 처리 방식이 다릅니다.
- 캘리브레이션 보장 없음: 두 집계 방식 모두 분포 변화(distribution shift) 하에서 캘리브레이션을 보장하지 않습니다. 배포 후에도 지속적인 모니터링이 필수예요.
- 라이선스: 기본 4개 멤버는 permissive 라이선스지만, 저장소의 확장 레시피에는 IBM Research 체크포인트가 포함되어 비상업/연구용 제한이 붙습니다. 각 모델 카드를 반드시 확인하세요.
3. 내 데이터로 백테스트하는 방법
GIFT-Eval은 광범위한 벤치마크지만, 집계 이득이 모든 시계열에 적용된다는 보장은 없습니다. 실무에서는 다음 순서로 검증하세요.
- 유스케이스 정합성: 각 예측 시점에서 실제로 사용 가능한 데이터만으로 히스토리 윈도우 구성
- 동일 조건 비교: Prob 앙상블, IQR 앙상블, 강한 단일 멤버(PatchTST-FM-r2 등)를 같은 윈도우에서 비교
- 포인트 오차 그 이상: MASE와 함께 분위수 손실, 0.1~0.9 구간의 실측 커버리지(명목 80%) 확인
- 비용 측정: 런타임과 메모리를 기록해 4개 모델 결합의 이득이 비용을 정당화하는지 판단
4. 다음 단계 학습 방향
- Forecaster 인터페이스 확장: 기본 4개 Granite 모델 외에 도메인에 맞는 호환 모델을 멤버로 추가해 보세요. 다운스트림 예측 포맷은 그대로 유지됩니다.
- 시계열 기초 다지기: 앙상블을 이해하려면 MASE, CRPS, 분위수 회귀 개념을 먼저 잡는 게 좋습니다.
- 실전 코드 감각: 터미널에서의 빠른 프로토타이핑에 익숙해지고 싶다면 Gemini 3 Flash CLI 활용기도 함께 보면 도움이 됩니다.
- 프론트엔드 시각화: 예측 결과를 대시보드로 보여줄 계획이라면 CSS rotateX() 3D 변환 가이드처럼 UI 표현 기법도 챙겨두세요.
마무리
Granite Timeseries Ensemble은 "어떤 모델을 골라야 하지?"라는 질문을 "일단 이걸로 시작하고, 필요하면 튜닝하자"로 바꿔주는 실용적인 도구입니다. 리더보드 정상을 노리는 모델이 아니라, 아무 데이터에나 던져도 준수한 결과를 주는 기본값이라는 점이 진짜 가치예요. 도입 전 백테스트와 비용 측정, 이 두 가지만 잊지 마세요 🚀