Snowflake 의 FORECAST 함수를 사용한 시계열 데이터 예측 (Private Preview)

MJ Lee
Snowflake Korea
Published in
8 min readNov 30, 2022

Snowflake 는 단변량 시계열 (univariate time series) 데이터에 대한 예측을 할 수 있는 FORECAST 함수를 (private preview 로) 제공합니다. FORECAST 함수는 아래처럼 Snowflake 네이티브 애플리케이션을 설치하는 과정을 통해 쉽게 사용 가능한 built-in 함수로서, 별도의 학습 과정 없이 시계열 데이터에 대한 예측을 할 수 있다는 것이 장점입니다.

--FORECAST 함수를 설치하는 방법. 네이티브 애플리케이션을 공유 받는 방식으로 사용한다.
create or replace database my_app_name
from share snowflake.snowml_forecasting_app_share;

사용법은 매우 간단한데 Timestamp 값이 포함된 컬럼과 수치 값이 포함된 컬럼을 FORECAST 인자로 넘기면 입력 데이터를 학습해서 모델을 만든 후 미래 시점의 예측 값을 테이블 형태로 반환합니다. 예측 값이 exogenous 변수 (모델과 상관없는 외부 요인으로 외생변수 혹은 독립변수 라고도 함.) 에 의존하는 경우에도 해당 컬럼을 인수로 넘기면 이 컬럼을 고려하여 모델을 학습합니다. exogenous 변수는 범주형과 수치형 모두 가능한데, 범주형 변수일 경우 내부적으로 해당 변수에 대해 one-hot 인코딩을 사용해 모델링을 합니다.

FORECAST 함수는 일반 선형 모델(generalized linear model, GLM)과 그래디언트 부스팅 (gradient boosting machine, GBM)을 조합한 알고리즘을 사용하는데 built-in 함수인 만큼 사용자가 하이퍼파라미터 튜닝을 할 필요가 없습니다. 즉, 파라미터 튜닝이 자동으로 수행됩니다. 또한 모델 생성 시 휴일을 고려하고, 결측 값에 크게 영향 받지 않는 모델을 생성하며, timestamp 사이의 간격이 균일하지 않아도 됩니다.

그럼 여러가지 시계열 데이터를 FORECAST 함수를 사용해서 예측해 봅시다.

1.단일 시계열 데이터 예측

FORECAST 함수에서 첫 번째 인자는 timestamp 인 TS, 두 번째 인자는 학습데이터이자 예측 하려는 컬럼 Y, 세 번째 인자는 예측하고자 하는 기간으로, timestamp 간격의 배수가 됩니다. 이 데이터에서는 timestamp 의 간격이 1일이어서 2 는 2일을 뜻합니다. 예측 시 고려해야 하는 exogenous 변수가 별도로 없으므로 (partition by 0) 를 사용해서 전체 데이터가 모델링 대상이 되도록 합니다.

--(좌) 학습 대상 시계열 데이터
select * from input_single_series;

--(우) FORECAST 함수를 사용한 예측 결과
select res.* from input_single_series, table(
my_app_name.snowml.forecast(
input_single_series.ts,
input_single_series.y,
2)
over (partition by 0)
) res;
(좌) 학습 대상 시계열 데이터 (우) FORECAST 함수를 사용한 예측 결과

FORECAST 함수 사용 결과에서 학습 데이터인 Y 컬럼과 예측 데이터인 FORECAST 컬럼 8 번째 행에 값이 모두 표시된 이유는 그래프를 사용하여 시각화 할 때 두 점이 연속적으로 표현되도록 하기 위함 입니다.

2. Exogenous 변수를 고려한 단일 시계열 데이터 예측

다음은 범주형 Exogenous 변수 (categorical_exo)와 수치형 Exogenous 변수 (numerical_exo)를 모두 고려해서 예측을 해야 하는 경우입니다. FORECAST 함수에 이 변수들도 같이 전달합니다.

exogenous 변수 데이터를 사용할 때는 예측하고자 하는 (적어도 하나 이상의) 미래의 timestampe 에 대해서도 exogenous 변수의 값이 있어야 한다는 점에 유의해야 합니다. exogenous 변수를 인자로 넘길때는 key-value 쌍을 입력 값으로 넣기 위해 OBJECT_CONSTRUCT 함수를 사용합니다.

--(좌) 학습 대상 시계열 데이터
select * from input_single_series_exogenous;

--(우) FORECAST 함수를 사용한 예측 결과
select res.* from input_single_series_exogenous as t, table(
my_app_name.snowml.forecast(
t.ts,
t.y,
object_construct('num_exo', t.numerical_exo),
object_construct('cat_exo', t.categorical_exo))
over (partition by 0)
) res;
(좌) Exogenous 변수가 있는 단일 시계열 데이터 (우) FORECAST 함수를 사용한 예측 결과

3.여러 시계열 데이터 예측

시계열을 구분할 컬럼을 over (partition by SERIES) 구문을 사용해 여러 시계열 데이터를 한번에 예측합니다. SERIES 값에 따라 모델은 개별적으로 만들어집니다. 즉, SERIES 값이 다르면 서로 timestamp 범위가 일치하지 않아도 됩니다.

--(좌) 학습 대상 시계열 데이터
select * from input_multiple_series;

--(우) FORECAST 함수를 사용한 예측 결과
select input_multiple_series.series, res.*
from input_table_multiple_series, table(
my_app_name.snowml.forecast(
input_multiple_series.ts,
input_multiple_series.y,
2)
over (partition by input_multiple_series.series)
) res;
(좌) SERIES 컬럼으로 구분되는 여러 시계열 데이터 (우) FORECAST 함수를 사용한 예측 결과

4. Exogenous 변수가 있는 여러 시계열 데이터 예측

2번과 3번의 syntax 를 모두 적용하면 exogenous 변수를 고려해야 하는 여러 시계열 데이터를 한번에 예측할 수 있습니다.

select t.series, res.* from input_multiple_series_exogenous as t, table(
my_app_name.snowml.forecast(
t.ts,
t.y,
object_construct('num_exo', t.numerical_exo),
object_construct('cat_exo', t.categorical_exo))
over (partition by t.series)
) res;

5.시각화

쿼리 실행 후 결과 창 바로 위 Chart 버튼을 클릭하면 아래와 같이 그래프로 표현이 가능합니다.

(FORECAST 함수 적용 후 시각화)

이번 글에서는 Private Preview 로 공개된 FORECAST 함수에 대해 살펴봤습니다. 모델을 학습해서 저장한 후 호출하는 방식이 아니라, 호출 할 때마다 인자로 넘기는 데이터를 통해 예측을 하는 방식이기 때문에 학습 데이터가 매우 크거나 범주형 exogenous 변수의 cardinality 가 높다면 리소스를 과도하게 사용할 수 있습니다.

따라서 주기성이 있는 단기간의 데이터를 학습 데이터로 사용하거나, 장기 데이터의 경우 사전에 분석 과정을 통해 time resolution 을 낮춘 데이터를 학습 데이터로 사용한다면 FORECAST 함수는 성능 문제 없이 매우 간편하고 쉽게, 복잡한 모델링 과정 없이 미래를 예측하는 방법이 될 것입니다.

--

--