시계열 예측(Snowflake Cortex ML 기반 함수)

참고

예측은 Snowflake의 지능적인 완전 관리형 AI 및 ML 서비스인 Snowflake Cortex의 일부입니다. 이 기능은 Snowflake Cortex ML 기반 함수 패키지의 일부입니다.

예측은 머신 러닝 알고리즘을 사용하면 과거 시계열 데이터를 통해 미래 데이터를 예측할 수 있습니다. 시계열 예측에서는 과거 입력 데이터를 기반으로 미래 데이터의 단변량 예측을 생성합니다. 일반적인 사용 사례는 계절성 및 기타 요인을 기반으로 판매를 예측하는 것입니다.

과거 데이터에는 다음을 포함해야 합니다.

  • 고정 빈도(예: 매시간, 5분마다 등)가 있어야 하는 타임스탬프 열.

  • 각 타임스탬프에서 몇몇 관심 수량을 나타내는 대상 열.

또한 과거 데이터에는 대상에 영향을 미쳤을 수 있는 추가 열(외생 변수)이 포함될 수도 있습니다. 이러한 열은 숫자 또는 문자 데이터일 수 있습니다.

과거 데이터는 미래의 타임스탬프에서 대상 값의 예측을 생성하는 머신 러닝 모델을 학습시키는 데 사용됩니다. 모델은 스키마 수준 오브젝트이며 학습된 후 여러 예측에 사용할 수 있습니다. (모델을 사용하여 과거 데이터와 동일한 범위의 예측을 생성할 수 없습니다.)

예측은 단일 계열 또는 다중 계열 데이터에서 작동합니다. 다중 계열 데이터는 여러 개의 고유 이벤트 스레드를 나타냅니다. 예를 들어 여러 매장의 판매 데이터가 있는 경우 각 매장의 판매는 매장 식별자를 기반으로 단일 모델로 따로 예측할 수 있습니다.

시계열 데이터의 예측을 생성하려면 Snowflake 기본 제공 클래스 FORECAST 를 사용하고 다음 단계를 따르십시오.

  1. 예측 모델 오브젝트를 만들어 학습 데이터에 대한 참조를 전달합니다. 이 오브젝트는 제공하는 학습 데이터에 모델을 맞춰줍니다(학습). 이 모델은 스키마 수준 오브젝트입니다.

  2. 이 예측 모델 오브젝트를 사용하여 예측 메서드 를 호출하여 미래 타임스탬프에 대해 대상의 예측을 생성하고 시간 스텝 수를 전달하거나, 외생 변수를 사용하는 경우에는 미래의 값을 가진 외생 데이터를 전달합니다.

중요

법적 고지. 이 Snowflake Cortex ML 기반 함수는 머신 러닝 기술을 기반으로 합니다. 제공된 머신 러닝 기술 및 결과는 부정확하거나 부적절하거나 편향될 수 있습니다. 자동 파이프라인에 내장된 결과를 포함하여 머신 러닝 출력을 기반으로 한 의사 결정에는 모델 생성 콘텐츠가 정확하도록 보장하기 위해 사람의 감독 및 검토 프로세스가 있어야 합니다. Snowflake Cortex ML 기반 함수 쿼리는 다른 SQL 쿼리로 처리되며 메타데이터 로 간주될 수 있습니다.

메타데이터. Snowflake Cortex ML 기반 함수를 사용하면 Snowflake는 메타데이터 필드 에 언급된 내용 외에 ML 함수에서 반환된 일반 오류 메시지를 로그에 기록합니다. 이러한 오류 로그는 발생하는 문제를 해결하고 이러한 함수를 개선하여 더 나은 서비스를 제공하는 데 도움이 됩니다.

예측 알고리즘 정보

예측 알고리즘은 그라데이션 부스팅 머신 (GBM)으로 구동됩니다. ARIMA 모델과 마찬가지로, 이 알고리즘은 차분 변환을 사용하여 비정상 추세로 데이터를 모델링하고 과거 대상 데이터의 자동 회귀 지연을 모델 기능으로 사용합니다.

또한 이 알고리즘은 과거 대상 데이터의 이동 평균을 사용하여 추세를 예측하는 데 도움을 주고, 타임스탬프 데이터에서 주기적인 캘린더 변수(예: 요일 및 주)를 자동으로 생성합니다.

과거 대상 및 타임스탬프 데이터만 있는 모델을 맞추거나 대상 값에 영향을 미쳤을 수 있는 외생 데이터(변수)를 포함할 수 있습니다. 외생 변수는 숫자형이나 범주형일 수 있으며 NULL일 수도 있습니다(외생 변수에 대해 NULL을 포함하는 행은 삭제되지 않음).

이 알고리즘은 범주형 변수에 대한 학습 시 원-핫 인코딩에 의존하지 않으므로, 차원이 많은(카디널리티가 높음) 범주형 데이터를 사용할 수 있습니다.

모델에 외생 변수가 포함된 경우 예측 생성 시 전체 예측 범위의 모든 타임스탬프에서 해당 변수의 값을 입력해야 합니다. 알맞은 외생 변수로는 날씨 데이터(기온, 강우량), 회사별 정보(과거 및 예정된 회사 휴무일, 광고 캠페인, 이벤트 일정) 또는 대상 변수를 예측하는 데 도움이 될 수 있다고 생각하는 기타 외부 요인을 들 수 있습니다.

이 알고리즘은 예측 외에 예측 구간도 생성합니다. 예측 구간은 특정 비율의 데이터가 속할 가능성이 있는 상한과 하한 내 값의 추정 범위입니다. 예를 들어 0.95의 값은 데이터 중 95%가 이 구간 내에서 나타날 가능성이 있다는 의미입니다. 예측 구간 백분율을 지정하거나 기본값인 0.95를 사용할 수 있습니다. 예측 구간의 하한 및 상한은 예측 출력의 일부로 반환됩니다.

중요

때때로 Snowflake에서 예측 알고리즘을 구체화할 수 있으며 정기 Snowflake 출시 프로세스를 통해 이러한 개선 사항을 배포할 것입니다. 이 기능의 이전 버전으로 되돌릴 수는 없지만, 이전 버전으로 생성한 모델은 예측을 위해 해당 버전을 계속 사용합니다.

현재 제한 사항

현재 릴리스에는 다음과 같은 제한 사항이 있습니다.

  • 예측 알고리즘을 선택하거나 조정할 수 없습니다.

  • 주 예측 알고리즘의 최소 행 수는 시계열당 12개입니다. 2에서 11 사이의 관측값이 있는 시계열의 경우 예측은 모든 예측 값이 마지막으로 관측된 목표 값과 같은 《나이브한》 예측을 생성합니다.

  • 예측 함수는 추세, 계절성 또는 계절적 진폭을 재정의하는 매개 변수를 제공하지 않습니다. 이들은 데이터에서 유추됩니다.

  • 허용 가능한 최소 데이터 세분성은 1초입니다. (타임스탬프의 간격이 1초 이상이어야 합니다.)

  • 계절적 구성 요소의 최소 세분성은 1분입니다. (이 함수는 더 작은 시간 델타에서 주기적 패턴을 감지할 수 없습니다.)

  • 데이터의 타임스탬프는 고정된 시간 간격을 나타내야 합니다. 입력 데이터가 불규칙한 경우 모델을 학습시킬 때 타임스탬프 열에서 DATE_TRUNC 또는 TIME_SLICE 를 사용해 보십시오.

  • 자동 회귀 기능의 《계절 길이》는 입력 빈도(시간별 데이터의 경우 24, 일별 데이터의 경우 7 등)에 연결됩니다.

  • 일단 학습된 예측 모델은 변경할 수 없습니다. 새 데이터로 기존 모델을 업데이트할 수 없으며 완전히 새 모델을 학습시켜야 합니다. 모델은 버전 관리를 지원하지 않습니다. 새 데이터를 받는 빈도에 따라 매일, 매주 또는 매월 정기적으로 모델을 다시 학습시켜 모델이 변화하는 패턴과 추세에 적응할 수 있도록 하는 것이 좋습니다.

  • 모델을 복제하거나 역할 또는 계정 간에 모델을 공유할 수 없습니다. 스키마 또는 데이터베이스를 복제할 때 모델 오브젝트를 건너뜁니다.

  • FORECAST 클래스의 인스턴스를 복제 할 수 없습니다.

예측 준비하기

예측을 사용하려면 먼저 다음을 수행해야 합니다.

SNOWFLAKE.ML을 포함하도록 검색 경로를 수정 할 수도 있습니다.

가상 웨어하우스 선택하기

Snowflake 가상 웨어하우스 가 이 기능에 대한 머신 러닝 모델을 학습시키고 사용하기 위한 컴퓨팅 리소스를 제공합니다. 이 섹션에서는 프로세스에서 가장 시간이 많이 걸리고 메모리 집약적인 부분인 학습 단계에 중점을 두고서 이 목적에 가장 적합한 웨어하우스 유형 및 크기를 선택하는 방법에 대한 일반적인 지침을 제공합니다.

단일 계열 데이터를 기반으로 학습시키기

단일 계열 데이터에 대해 학습된 모델의 경우 학습 데이터의 크기를 기준으로 웨어하우스 유형을 선택하십시오. 표준 웨어하우스는 Snowpark 메모리 한도 가 더 낮으며 행 수가 적고 외생 변수가 있는 학습 작업에 더 적합합니다.

학습 데이터에 외생 변수가 포함되지 않은 경우 데이터 세트에 5백만 개 이하의 행이 있으면 표준 웨어하우스에서 학습할 수 있습니다. 학습 데이터가 5개 이상의 외생 변수를 사용하는 경우 최대 행 수가 적습니다. 그렇지 않은 경우 대규모 학습 작업을 위해 Snowpark에 최적화된 웨어하우스 를 사용하는 것이 좋습니다.

일반적으로 단일 계열 데이터의 경우 웨어하우스 크기가 커진다고 해서 학습 시간이 빨라지거나 메모리 제한이 높아지지는 않습니다. 대략적인 경험 법칙에 따르면 학습 시간은 시계열의 행 수에 비례합니다. 예를 들어, XS 표준 웨어하우스에서 100,000행의 데이터 세트에 대한 학습에 약 30초가 걸립니다. 1,000,000행의 데이터 세트에 대한 학습에는 약 140초가 걸립니다.

최상의 성능을 위해 모델을 학습하기 위한 다른 동시 워크로드 없이 전용 웨어하우스를 사용하는 것이 좋습니다.

다중 계열 데이터에 대한 학습

단일 계열 데이터와 마찬가지로, 가장 큰 시계열의 행 수를 기반으로 웨어하우스 유형을 선택하는 것이 좋습니다. 가장 큰 시계열에 5백만 개 이상의 행이 포함된 경우 학습 작업이 표준 웨어하우스의 메모리 제한을 초과할 가능성이 큽니다.

단일 계열 데이터와 달리, 다중 계열 데이터는 더 큰 웨어하우스 크기에서 훨씬 더 빠르게 학습됩니다. 다음 데이터 요소가 선택의 안내자 역할을 할 수 있습니다.

웨어하우스 유형

시계열 수

시계열당 행 수

웨어하우스 크기

학습 시간

표준

1

100,000

XS

38초

10

100,000

XS

112초

100

100,000

XS

594초

10

100,000

XL

34초

100

100,000

XL

114초

1000

100,000

XL

572초

Snowpark에 최적화됨

10

100,000

XL

74초

100

100,000

XL

215초

1000

100,000

XL

1429초

예측 오브젝트 생성 권한 부여하기

예측 모델을 훈련하면 스키마 수준 오브젝트가 생성됩니다. 따라서 모델 생성에 사용하는 역할은 모델이 생성되는 스키마에 대한 CREATE SNOWFLAKE ML FORECAST 권한이 있어야 스키마에 모델을 저장할 수 있습니다. 이 권한은 CREATE TABLE 또는 CREATE VIEW와 같은 다른 스키마 권한과 유사합니다.

예측을 생성해야 하는 사람들이 사용할 analyst 라는 역할을 생성하는 것이 좋습니다.

다음 예에서 admin 역할은 스키마 admin_db.admin_schema 의 소유자입니다. analyst 역할은 이 스키마에서 모델을 생성해야 합니다.

USE ROLE admin;
GRANT USAGE ON admin_db TO ROLE analyst;
GRANT USAGE ON admin_schema TO ROLE analyst;
GRANT CREATE SNOWFLAKE.ML.FORECAST ON SCHEMA admin_db.admin_schema TO ROLE analyst;
Copy

이 스키마를 사용하기 위해 사용자는 analyst 역할을 맡습니다.

USE ROLE analyst;
USE SCHEMA admin_db.admin_schema;
Copy

analyst 역할이 analyst_db 데이터베이스에서 CREATE SCHEMA 권한을 가질 경우 이 역할은 새 스키마 analyst_db.analyst_schema 를 생성하고 해당 스키마에서 예측 모델을 생성할 수 있습니다.

USE ROLE analyst;
CREATE SCHEMA analyst_db.analyst_schema;
USE SCHEMA analyist_db.analyist_schema;
Copy

스키마에 대한 역할의 예측 모델 생성 권한을 취소하려면 REVOKE <권한> 를 사용하십시오.

REVOKE CREATE SNOWFLAKE.ML.FORECAST ON SCHEMA admin_db.admin_schema FROM ROLE analyst;
Copy

예에 대한 데이터 설정하기

아래 예제에서는 두 개의 테이블을 만듭니다. 이 항목의 후반부에 나오는 예제 에 이들 테이블의 뷰가 포함됩니다.

sales_data 테이블에는 판매 데이터가 있습니다. 각 판매 데이터에 매장 ID, 품목 식별자, 타임스탬프, 판매 금액이 포함됩니다. 외생 변수 또는 외부 변수(온도, 습도, 휴일)도 포함됩니다.

future_features 테이블에는 외생 변수의 미래 값이 포함되는데, 이러한 변수로 예측할 때 필요합니다.

CREATE OR REPLACE TABLE sales_data (store_id NUMBER, item VARCHAR, date TIMESTAMP_NTZ,
  sales FLOAT, temperature NUMBER, humidity FLOAT, holiday VARCHAR);

INSERT INTO sales_data VALUES
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-01'), 2.0, 50, 0.3, 'new year'),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-02'), 3.0, 52, 0.3, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-03'), 4.0, 54, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-04'), 5.0, 54, 0.3, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-05'), 6.0, 55, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-06'), 7.0, 55, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-07'), 8.0, 55, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-08'), 9.0, 55, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-09'), 10.0, 55, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-10'), 11.0, 55, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-11'), 12.0, 55, 0.2, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-12'), 13.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-01'), 2.0, 50, 0.3, 'new year'),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-02'), 3.0, 52, 0.3, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-03'), 4.0, 54, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-04'), 5.0, 54, 0.3, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-05'), 6.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-06'), 7.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-07'), 8.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-08'), 9.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-09'), 10.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-10'), 11.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-11'), 12.0, 55, 0.2, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-12'), 13.0, 55, 0.2, NULL);

-- future values for exogenous variables (additional features)
CREATE OR REPLACE TABLE future_features (store_id NUMBER, item VARCHAR,
  date TIMESTAMP_NTZ, temperature NUMBER, humidity FLOAT, holiday VARCHAR);

INSERT INTO future_features VALUES
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-13'), 52, 0.3, NULL),
  (1, 'jacket', TO_TIMESTAMP_NTZ('2020-01-14'), 53, 0.3, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-13'), 52, 0.3, NULL),
  (2, 'umbrella', TO_TIMESTAMP_NTZ('2020-01-14'), 53, 0.3, NULL);
Copy

모델 학습, 사용, 확인, 삭제 및 업데이트하기

CREATE SNOWFLAKE.ML.FORECAST 를 사용하여 모델을 만들고 학습시킵니다. 이 모델은 사용자가 제공한 데이터 세트를 기반으로 학습됩니다.

CREATE SNOWFLAKE.ML.FORECAST <name>(...);
Copy

SNOWFLAKE.ML.FORECAST 생성자에 대한 자세한 내용은 FORECAST 섹션을 참조하십시오. 모델 생성의 예는 섹션을 참조하십시오.

참고

SNOWFLAKE.ML.FORECAST는 제한된 권한을 사용하여 실행되므로, 기본적으로 데이터에 액세스할 수 없습니다. 따라서 호출자의 권한을 전달하는 참조 로 테이블과 뷰를 전달해야 합니다. 테이블 또는 뷰에 대한 참조 대신 쿼리 참조 를 제공할 수도 있습니다.

예측을 생성하려면 모델의 <name>!FORECAST 메서드를 호출하십시오.

CALL <name>!FORECAST(...)
Copy

모델 목록을 보려면 SHOW SNOWFLAKE.ML.FORECAST 명령을 사용하십시오.

SHOW SNOWFLAKE.ML.FORECAST;
Copy

모델을 제거하려면 DROP SNOWFLAKE.ML.FORECAST 명령을 사용하십시오.

DROP SNOWFLAKE.ML.FORECAST <name>;
Copy

모델을 업데이트하려면 모델을 삭제하고 새 모델을 학습시키십시오. 모델은 변경할 수 없으며 자체적으로 업데이트할 수 없습니다.

예측 생성하기

모델을 만들면 name!FORECAST(...) 로 예측을 생성할 수 있습니다. 동일한 모델을 사용하여 개수에 관계없이 여러 데이터 세트에서 예측을 생성할 수 있습니다.

다음 예에서는 모델을 생성하고 모델에서 예측을 생성하는 방법을 보여주며 모든 매개 변수에 대한 자세한 내용은 <name>!FORECAST 섹션을 참조하십시오.

모델 학습 사용된 데이터 세트의 열 이름과 다른 열 이름을 가진 데이터 세트가 있는 모델을 사용하려면 (AS를 사용하여) 모델에서 예상하는 이름으로 열 이름을 바꾸는 뷰 또는 쿼리를 만듭니다. 해당 뷰 또는 쿼리를 FORECAST 메서드의 입력값으로 사용합니다.

모델 생성 및 사용에 사용되는 매개 변수에 대한 자세한 내용은 FORECAST 섹션을 참조하십시오.

다음 예에서는 다양한 사용 사례에 시계열 예측을 사용하는 방법을 보여줍니다.

단일 계열에 대해 예측하기

이 예에서는 추가 특징 없이 타임스탬프 열과 대상 값 열의 두 열이 있는 단일 시계열(즉, 모든 행이 단일 계열에 속함)을 사용합니다. 먼저, 모델을 학습시키기 위해 sales_data 에서 데이터 세트를 준비합니다. 다음 코드는 v1 이라는 뷰를 만듭니다.

CREATE OR REPLACE VIEW v1 AS SELECT date, sales
  FROM sales_data WHERE store_id=1 AND item='jacket';
SELECT * FROM v1;
Copy

SELECT 문은 다음을 반환합니다.

+-------------------------+-------+
| DATE                    | SALES |
+-------------------------+-------+
| 2020-01-01 00:00:00.000 | 2     |
| 2020-01-02 00:00:00.000 | 3     |
| 2020-01-03 00:00:00.000 | 4     |
| 2020-01-04 00:00:00.000 | 5     |
| 2020-01-05 00:00:00.000 | 6     |
+-------------------------+-------+

다음 문은 위의 데이터 세트를 사용하여 예측 모델을 학습시킵니다.

CREATE SNOWFLAKE.ML.FORECAST model1(
  INPUT_DATA => SYSTEM$REFERENCE('VIEW', 'v1'),
  TIMESTAMP_COLNAME => 'date',
  TARGET_COLNAME => 'sales'
);
Copy

모델이 학습되면 다음 메시지가 나타납니다.

Instance MODEL1 successfully created.

이제 예측 모델을 model1 로 사용할 수 있습니다. 다음 3개의 타임스탬프를 예측하는 명령은 아래와 같습니다.

call model1!FORECAST(FORECASTING_PERIODS => 3);
Copy

출력

모델은 학습 데이터에서 타임스탬프 사이의 간격을 유추했습니다.

+-------------------------+-----------+--------------+--------------+
| TS                      | FORECAST  | LOWER_BOUND  | UPPER_BOUND  |
+-------------------------+-----------+--------------+--------------+
| 2020-01-13 00:00:00.000 | 14        | 14           | 14           |
| 2020-01-14 00:00:00.000 | 15        | 15           | 15           |
| 2020-01-15 00:00:00.000 | 16        | 16           | 16           |
+-------------------------+-----------+--------------+--------------+

이 예에서는 예측이 실제 값과 비교하여 오차가 0인 완벽한 선형 예측을 산출하므로, 예측 구간(LOWER_BOUND, UPPER_BOUND)이 FORECAST 값과 동일합니다.

예측 구간의 크기를 사용자 지정하려면 prediction_interval 을 구성 오브젝트의 일부로 전달하십시오.

CALL model1!FORECAST(FORECASTING_PERIODS => 3, CONFIG_OBJECT => {'prediction_interval': 0.8});
Copy

결과를 테이블에 직접 저장하려면 다음 코드를 사용하십시오.

BEGIN
  CALL model1!FORECAST(FORECASTING_PERIODS => 3);
  LET x := SQLID;
  CREATE TABLE my_forecasts AS SELECT * FROM TABLE(RESULT_SCAN(:x));
END;

SELECT * FROM my_forecasts;
Copy

위 코드에서는 RESULT_SCAN을 사용하지만 설령 여러 프로세스가 한꺼번에 실행 중이더라도 경합 조건이 발생하지 않습니다. 위 모델 호출의 결과는 my_forecasts 테이블에 결정론적으로 저장됩니다.

외생 변수가 있는 단일 계열에 대해 예측하기

추가 특징(예: 공휴일 또는 날씨)이 예측에 영향을 미치도록 하려면 학습 데이터에 이러한 특징을 포함해야 합니다. 여기서는 sales_data 테이블의 해당 필드를 포함하는 뷰를 만듭니다.

CREATE OR REPLACE VIEW v2 AS SELECT date, sales, temperature, humidity, holiday
  FROM sales_data WHERE store_id=1 AND item='jacket';
SELECT * FROM v2;
Copy

출력

다음은 SELECT 쿼리 결과의 첫 5개 행입니다.

+-------------------------+--------+-------------+----------+----------+
| DATE                    | SALES  | TEMPERATURE | HUMIDITY | HOLIDAY  |
+-------------------------+--------+-------------+----------+----------+
| 2020-01-01 00:00:00.000 | 2      | 50          | 0.3      | new year |
| 2020-01-02 00:00:00.000 | 3      | 52          | 0.3      | null     |
| 2020-01-03 00:00:00.000 | 4      | 54          | 0.2      | null     |
| 2020-01-04 00:00:00.000 | 5      | 54          | 0.3      | null     |
| 2020-01-05 00:00:00.000 | 6      | 55          | 0.2      | null     |
+-------------------------+--------+-------------+----------+----------+

이제 이 뷰를 사용하여 모델을 학습시킬 수 있습니다. 타임스탬프와 대상 열 이름만 지정하면 되며, 입력 데이터의 추가 열은 외생 변수로 간주됩니다.

CREATE SNOWFLAKE.ML.FORECAST model2(
  INPUT_DATA => SYSTEM$REFERENCE('VIEW', 'v2'),
  TIMESTAMP_COLNAME => 'date',
  TARGET_COLNAME => 'sales'
);
Copy

새 모델의 이름은 model2 로 지정됩니다. 미래의 타임스탬프에 대한 예측을 수행하려면 모델의 외생 변수에 대해 미래의 값을 입력해야 하는데, 이 경우에는 TEMPERATURE, HUMIDITY, HOLIDAY 입니다. 그러면 《기온이 정상보다 낮으면 어떻게 됩니까?》와 같은 《가상》 질문에 답할 수 있습니다. 이제 미래의 타임스탬프에 대해 이 데이터를 포함하는 future_features 테이블에서 뷰를 만듭니다.

CREATE OR REPLACE VIEW v2_forecast AS select date, temperature, humidity, holiday
  FROM future_features WHERE store_id=1 AND item='jacket';
SELECT * FROM v2_forecast;
Copy

출력

+-------------------------+-------------+----------+---------+
| DATE                    | TEMPERATURE | HUMIDITY | HOLIDAY |
+-------------------------+-------------+----------+---------+
| 2020-01-13 00:00:00.000 | 52          | 0.3      | null    |
| 2020-01-14 00:00:00.000 | 53          | 0.3      | null    |
+-------------------------+-------------+----------+---------+

이제 이 데이터를 사용하여 예측을 생성할 수 있습니다.

CALL model2!FORECAST(
  INPUT_DATA => SYSTEM$REFERENCE('VIEW', 'v2_forecast'),
  TIMESTAMP_COLNAME =>'date'
);
Copy

FORECAST 메서드의 이 변형에서는 예측할 타임스탬프의 수를 지정하지 않습니다. 대신에, 예측의 타임스탬프는 v2_forecast 뷰에서 가져옵니다.

+-------------------------+-----------+--------------+--------------+
| TS                      | FORECAST  | LOWER_BOUND  | UPPER_BOUND  |
+-------------------------+-----------+--------------+--------------+
| 2020-01-13 00:00:00.000 | 14        | 14           | 14           |
| 2020-01-14 00:00:00.000 | 15        | 15           | 15           |
+-------------------------+-----------+--------------+--------------+

다중 계열에 대한 예측

이전의 예측은 단일 계열에 대한 것입니다. 즉, 학습 데이터의 모든 행이 단일 값 시퀀스를 나타냅니다. 동시에 여러 계열에 대한 예측 모델을 생성할 수도 있습니다.

샘플 데이터에는 store_iditem 열이 포함되어 있습니다. 데이터 세트의 모든 매장/품목 조합에 대한 판매를 각기 따로 예측하려면 이러한 값을 결합하는 새 열을 만들어 계열 열로 지정하십시오.

예를 들어, 다음 쿼리로 store_item 이라는 새 열로 store_iditem 을 결합하는 새 뷰를 만듭니다.

CREATE OR REPLACE VIEW v3 AS SELECT [store_id, item] AS store_item, date, sales FROM sales_data;
SELECT * FROM v3;
Copy

출력

결과 데이터 세트의 각 계열에 대한 첫 5개 행은 다음과 같습니다.

+-------------------+-------------------------+-------+
| STORE_ITEM        | DATE                    | SALES |
+-------------------+-------------------------+-------+
| [ 1, "jacket" ]   | 2020-01-01 00:00:00.000 | 2     |
| [ 1, "jacket" ]   | 2020-01-02 00:00:00.000 | 3     |
| [ 1, "jacket" ]   | 2020-01-03 00:00:00.000 | 4     |
| [ 1, "jacket" ]   | 2020-01-04 00:00:00.000 | 5     |
| [ 1, "jacket" ]   | 2020-01-05 00:00:00.000 | 6     |
| [ 2, "umbrella" ] | 2020-01-01 00:00:00.000 | 2     |
| [ 2, "umbrella" ] | 2020-01-02 00:00:00.000 | 3     |
| [ 2, "umbrella" ] | 2020-01-03 00:00:00.000 | 4     |
| [ 2, "umbrella" ] | 2020-01-04 00:00:00.000 | 5     |
| [ 2, "umbrella" ] | 2020-01-05 00:00:00.000 | 6     |
+-------------------+-------------------------+-------+

다음 문은 이전의 데이터 세트를 사용하여 예측 모델을 학습시킵니다. 계열 열 이름 store_item 을 지정해야 합니다.

CREATE SNOWFLAKE.ML.FORECAST model3(
  INPUT_DATA => SYSTEM$REFERENCE('VIEW', 'v3'),
  SERIES_COLNAME => 'store_item',
  TIMESTAMP_COLNAME => 'date',
  TARGET_COLNAME => 'sales'
);
Copy

학습 후 다음을 사용하여 동시에 모든 계열에서 앞으로 두 단계(즉, 계열당 두 단계)를 예측할 수 있습니다.

CALL model3!FORECAST(FORECASTING_PERIODS => 2);
Copy

출력

+-------------------+------------------------+----------+-------------+-------------+
| SERIES            | TS                     | FORECAST | LOWER_BOUND | UPPER_BOUND |
+-------------------+------------------------+----------+-------------+-------------+
| [ 1, "jacket" ]   | 2020-01-13 00:00:00.000 | 14      | 14          | 14          |
| [ 1, "jacket" ]   | 2020-01-14 00:00:00.000 | 15      | 15          | 15          |
| [ 2, "umbrella" ] | 2020-01-13 00:00:00.000 | 14      | 14          | 14          |
| [ 2, "umbrella" ] | 2020-01-14 00:00:00.000 | 15      | 15          | 15          |
+-------------------+-------------------------+---------+-------------+-------------+

다음을 사용하여 특정 계열만 예측할 수도 있습니다.

CALL model3!FORECAST(SERIES_VALUE => [2,'umbrella'], FORECASTING_PERIODS => 2);
Copy

출력

결과에는 매장 2의 우산 판매에 대해 다음 두 단계만 표시됩니다.

+-------------------+------------ ------------+-----------+-------------+-------------+
| SERIES            | TS                      | FORECAST  | LOWER_BOUND | UPPER_BOUND |
+-------------------+---------- --------------+-----------+-------------+-------------+
| [ 2, "umbrella" ] | 2020-01-13 00:00:00.000 | 14        | 14          | 14          |
| [ 2, "umbrella" ] | 2020-01-15 00:00:00.000 | 15        | 15          | 15          |
+-------------------+-------------------------+-----------+-------------+-------------+

관심 있는 계열만 포함하려면 다중 계열 예측 결과를 필터링하는 것보다는 FORECAST 메서드로 하나의 계열을 지정하는 것이 더 효율적인데, 한 계열의 예측만 생성되기 때문입니다.

외생 변수가 있는 다중 계열에 대한 예측

본질적으로 앞에 나온 두 예를 결합하여 외생 변수와 함께 다중 시계열을 학습시키고 예측하려면 다음과 같은 방식으로 데이터를 준비해 계열 열(이 경우에는 store_item)과 한 개 이상의 외생 열(여기서는 temperature)을 모두 포함하십시오.

CREATE OR REPLACE VIEW v4 AS SELECT [store_id, item] AS store_item,
  date, sales, temperature FROM sales_data;
SELECT * FROM v4;
Copy

출력

결과 데이터 세트의 각 계열에 대해 첫 5개 행은 다음과 같습니다.

+-------------------+-------------------------+-------+-------------+
| STORE_ITEM        | DATE                    | SALES | TEMPERATURE |
+-------------------+-------------------------+-------+-------------+
| [ 1, "jacket" ]   | 2020-01-01 00:00:00.000 | 2     | 50          |
| [ 1, "jacket" ]   | 2020-01-02 00:00:00.000 | 3     | 52          |
| [ 1, "jacket" ]   | 2020-01-03 00:00:00.000 | 4     | 54          |
| [ 1, "jacket" ]   | 2020-01-04 00:00:00.000 | 5     | 54          |
| [ 1, "jacket" ]   | 2020-01-05 00:00:00.000 | 6     | 55          |
| [ 2, "umbrella" ] | 2020-01-01 00:00:00.000 | 2     | 50          |
| [ 2, "umbrella" ] | 2020-01-02 00:00:00.000 | 3     | 52          |
| [ 2, "umbrella" ] | 2020-01-03 00:00:00.000 | 4     | 54          |
| [ 2, "umbrella" ] | 2020-01-04 00:00:00.000 | 5     | 54          |
| [ 2, "umbrella" ] | 2020-01-05 00:00:00.000 | 6     | 55          |
+-------------------+-------------------------+-------+-------------+

다음 문은 이전의 데이터 세트를 사용하여 예측 모델을 학습시킵니다. 계열 열 이름 store_item 을 지정해야 합니다.

CREATE SNOWFLAKE.ML.FORECAST model4(
  INPUT_DATA => SYSTEM$REFERENCE('VIEW', 'v4'),
  SERIES_COLNAME => 'store_item',
  TIMESTAMP_COLNAME => 'date',
  TARGET_COLNAME => 'sales'
);
Copy

중간 뷰를 생성하는 대신 input_data 에 대한 쿼리 참조 를 전달할 수 있습니다. 다음 문으로 이전 문에서 만든 것과 동일한 입력 데이터로 모델을 만듭니다.

CREATE SNOWFLAKE.ML.FORECAST model4(
  INPUT_DATA => SYSTEM$QUERY_REFERENCE('SELECT [store_id, item] AS store_item, date, sales, temperature FROM sales_data'),
  SERIES_COLNAME => 'store_item',
  TIMESTAMP_COLNAME => 'date',
  TARGET_COLNAME => 'sales'
);
Copy

전과 마찬가지로, 예측할 때는 외생 변수에 대해 미래의 값을 전달해야 하지만 이번에는 각 계열에 대해 전달해야 합니다. 외생 변수의 미래 값을 준비합니다.

CREATE OR REPLACE VIEW V4_FORECAST AS SELECT [store_id, item] AS store_item,
  date, temperature FROM future_features;
SELECT * FROM v4_forecast;
Copy

출력

+-------------------+-------------------------+-------------+
| STORE_ITEM        | DATE                    | TEMPERATURE |
+-------------------+-------------------------+-------------+
| [ 1, "jacket" ]   | 2020-01-13 00:00:00.000 | 52          |
| [ 1, "jacket" ]   | 2020-01-14 00:00:00.000 | 53          |
| [ 2, "umbrella" ] | 2020-01-13 00:00:00.000 | 52          |
| [ 2, "umbrella" ] | 2020-01-14 00:00:00.000 | 53          |
+-------------------+-------------------------+-------------+

이제 이전의 타임스탬프에서 예측할 수 있습니다.

CALL model4!FORECAST(
  INPUT_DATA => SYSTEM$REFERENCE('VIEW', 'v4_forecast'),
  SERIES_COLNAME => 'store_item',
  TIMESTAMP_COLNAME =>'date'
);
Copy

출력

+-------------------+-------------------------+----------+-------------+-------------+
| SERIES            | TS                      | FORECAST | LOWER_BOUND | UPPER_BOUND |
+-------------------+-------------------------+----------+-------------+-------------+
| [ 1, "jacket" ]   | 2020-01-13 00:00:00.000 | 14       | 14          | 14          |
| [ 1, "jacket" ]   | 2020-01-14 00:00:00.000 | 15       | 15          | 15          |
| [ 2, "umbrella" ] | 2020-01-13 00:00:00.000 | 14       | 14          | 14          |
| [ 2, "umbrella" ] | 2020-01-14 00:00:00.000 | 15       | 15          | 15          |
+-------------------+-------------------------+----------+-------------+-------------+

예측 시각화하기

예측을 시각화하려면 Snowsight 차트 기능 을 사용하십시오. 예측을 생성한 후 쿼리 결과 테이블 위의 Charts 를 클릭합니다.

UNION ALL을 사용해 예측을 원본 데이터 세트에 조인하여 원본 데이터와 예측 결과에 있는 SELECTs를 결합하여 둘 모두 함께 시각화할 수 있습니다. 예:

CALL model4!FORECAST(FORECASTING_PERIODS => 3);

SELECT date AS ts, sales AS actual, NULL AS forecast, NULL AS lower_bound, NULL AS upper_bound
  FROM sales_data
UNION ALL
SELECT ts, NULL AS actual, forecast, lower_bound, upper_bound
  FROM TABLE(RESULT_SCAN(-1));
Copy

필요한 경우 타임스탬프 및 외생 변수 열의 이름을 바꾸어 원본 데이터 세트와 예측에서 일치하도록 합니다. NULL을 사용하여 학습 데이터의 예측 대상 값을 나타내고, 반대로 예측 결과의 과거 대상 값을 나타냅니다. 이전의 예에서 실제(기록) 대상 열 actual 및 예측 대상 forecast 의 이름이 바뀌었습니다.

이런 식으로 데이터를 준비한 후 차트 오른쪽의 Data 섹션에서 다음 단계를 따르십시오.

  1. ACTUAL 열을 선택한 다음 Aggregation 아래의 None 을 선택합니다.

  2. TS 열을 선택한 다음 Bucketing 아래의 None 을 선택합니다.

  3. FORECAST 열을 추가하고 Use as Line 을 선택한 다음 Aggregation 아래의 None 을 선택합니다.

  4. LOWER_BOUND 열과 UPPER_BOUND 열을 같은 방식으로 추가합니다.

결과 차트는 다음과 유사해야 합니다.

Example of creating a chart from a time series forecast

특징 중요도 이해하기

예측 모델을 사용하여 사용자가 선택하는 외생 변수, 자동으로 생성된 시간 특징(예: 요일 또는 주), 대상 변수의 변환(예: 이동 평균 및 자동 회귀 지연)을 포함하여, 모델에 사용되는 모든 특징의 상대적 중요도를 설명할 수 있습니다. 이 정보는 데이터에 실제로 영향을 미치는 요소를 파악하는 데 유용합니다.

<name>!EXPLAIN_FEATURE_IMPORTANCE 메서드는 모델의 트리가 각 특징을 사용하여 의사 결정을 내린 횟수를 계산합니다. 이러한 특징 중요도 점수는 합계가 1이 되도록 0과 1 사이의 값으로 정규화됩니다. 결과 점수는 학습된 모델에 있는 함수의 대략적인 순위를 나타냅니다.

점수가 서로 가까운 특징은 그 중요도가 비슷합니다. 극히 간단한 계열의 경우(예: 대상 열에 상수 값이 있는 경우) 모든 특징 중요도 점수가 0일 수 있습니다.

서로 매우 비슷한 여러 특징을 사용하면 해당 특징들의 중요도 점수가 낮아질 수 있습니다. 예를 들어, 한 가지 특징이 판매 품목의 수량 이고 다른 특징이 재고 품목의 수량 인 경우 보유 수량보다 더 많이 판매할 수 없고 판매할 수량보다 더 많은 재고가 쌓이지 않도록 재고를 적절히 관리하려고 하므로 이들 값이 상관 관계를 가질 수 있습니다. 두 특징이 정확히 동일한 경우 모델은 의사 결정을 할 때 이들을 상호 교환 가능한 것으로 취급할 수 있으므로, 동일한 특징 중 하나만 포함된 경우 해당 점수의 절반인 특징 중요도 점수가 도출됩니다.

특징 중요도로 지연 특징 도 알 수 있습니다. 학습 중에 모델은 학습 데이터의 빈도(매시간, 매일 또는 매주)를 유추합니다. 특징 lagx (예: lag24)는 x 시간 단위 전 대상 변수의 값입니다. 예를 들어 데이터가 시간별 데이터로 유추되는 경우 lag24 는 대상 변수 24시간 전을 나타냅니다.

대상 변수(이동 평균 등)의 다른 모든 변환은 결과 테이블에 aggregated_endogenous_features 로 요약됩니다.

제한 사항

  • 특징 중요도를 계산하는 데 사용되는 기법을 선택할 수 없습니다.

  • 특징 중요도 점수는 모델의 정확성에 중요한 특징에 대한 직관을 얻는 데 도움이 될 수 있지만, 실제 값을 추정치로 간주해야 합니다.

모델에 대한 특징의 상대적 중요도를 이해하려면 모델을 학습시킨 다음 <name>!EXPLAIN_FEATURE_IMPORTANCE 를 호출하십시오. 이 예에서는 먼저 두 개의 외생 변수로 임의 데이터를 생성하는데, 한 변수는 임의적이므로 모델에 그다지 중요하지 않을 가능성이 있으며 다른 하나는 대상의 복사본이므로 모델에 더 중요할 가능성이 있습니다.

다음 문을 실행하여 데이터를 생성하고 이를 기반으로 모델을 학습시키고 특징의 중요도를 가져옵니다.

CREATE OR REPLACE VIEW v_random_data AS SELECT
  DATEADD('minute', ROW_NUMBER() over (ORDER BY 1), '2023-12-01')::TIMESTAMP_NTZ ts,
  MOD(SEQ1(),10) y,
  UNIFORM(1, 100, RANDOM(0)) exog_a
FROM TABLE(GENERATOR(ROWCOUNT => 500));

CREATE OR REPLACE SNOWFLAKE.ML.FORECAST forecast_feature_importance_demo(
  INPUT_DATA => SYSTEM$REFERENCE('VIEW', 'v_random_data'),
  TIMESTAMP_COLNAME => 'ts',
  TARGET_COLNAME => 'y'
);

CALL forecast_feature_importance_demo!EXPLAIN_FEATURE_IMPORTANCE();
Copy

출력

+------+--------------------------------------+-------+-------------------------+
| RANK | FEATURE_NAME                         | SCORE | FEATURE_TYPE            |
+------+--------------------------------------+-------+-------------------------+
|    1 | aggregated_endogenous_trend_features |  0.36 | derived_from_endogenous |
|    2 | exog_a                               |  0.22 | user_provided           |
|    3 | epoch_time                           |  0.15 | derived_from_timestamp  |
|    4 | minute                               |  0.13 | derived_from_timestamp  |
|    5 | lag60                                |  0.07 | derived_from_endogenous |
|    6 | lag120                               |  0.06 | derived_from_endogenous |
|    7 | hour                                 |  0.01 | derived_from_timestamp  |
+------+--------------------------------------+-------+-------------------------+

평가 메트릭 이해하기

기본적으로 모든 예측 모델은 교차 검증됩니다. 제공된 모든 학습 데이터를 기반으로 모델을 학습시키는 것 외에도, 학습 데이터 중 일부를 기반으로 하나 이상의 모델을 학습시킨 후에 사용하여 보류된 데이터를 《예측》합니다. 그런 다음 예측한 목표 값을 실제 목표 값과 비교합니다. 평가 메트릭이 필요하지 않거나 컴퓨팅 리소스를 사용하고 싶지 않은 경우 모델을 인스턴스화할 때 evaluate 를 FALSE로 설정하십시오.

제한 사항

  • n_splits 매개 변수는 최소한 2 이상으로 설정해야 합니다.

  • 작은 데이터 세트에는 평가를 수행하기에 충분한 데이터가 없을 수 있습니다. 학습 행의 총 개수는 (n_splits * test_size) + gap 개 이상이어야 합니다. 평가 모델을 학습시키는 데 사용할 수 있는 데이터가 충분하지 않으면 evaluate 가 TRUE일 때도 평가 메트릭을 사용할 수 없습니다.

CREATE OR REPLACE VIEW v_random_data AS SELECT
  DATEADD('minute', ROW_NUMBER() over (ORDER BY 1), '2023-12-01')::TIMESTAMP_NTZ ts,
  MOD(SEQ1(),10) y,
  UNIFORM(1, 100, RANDOM(0)) exog_a
FROM TABLE(GENERATOR(ROWCOUNT => 500));

CREATE OR REPLACE SNOWFLAKE.ML.FORECAST model(
  INPUT_DATA => SYSTEM$REFERENCE('VIEW', 'v_random_data'),
  TIMESTAMP_COLNAME => 'ts',
  TARGET_COLNAME => 'y'
);

CALL model!SHOW_EVALUATION_METRICS();
Copy

출력

+--------------------------+--------------+--------------------+------+
| ERROR_METRIC             | METRIC_VALUE | STANDARD_DEVIATION | LOGS |
+--------------------------+--------------+--------------------+------+
| "MAE"                    |        7.107 |              1.998 | NULL |
| "MAPE"                   |        0.475 |              0.237 | NULL |
| "MDA"                    |        0.920 |              0.025 | NULL |
| "MSE"                    |       86.020 |             66.798 | NULL |
| "SMAPE"                  |        0.241 |              0.047 | NULL |
| "COVERAGE_INTERVAL=0.95" |        0.981 |              0.025 | NULL |
| "WINKLER_ALPHA=0.05"     |       56.697 |             45.199 | NULL |
+--------------------------+--------------+--------------------+------+

학습 로그 검사하기

CONFIG_OBJECT => 〈ON_ERROR〉: 〈SKIP〉 을 사용하여 여러 계열을 학습시키는 경우 전체 학습 프로세스가 실패하지 않고서 개별 시계열 모델이 학습에 실패할 수 있습니다. 실패한 시계열과 그 이유를 이해하려면 <model_instance>!SHOW_TRAINING_LOGS 를 호출하십시오.

CREATE TABLE t_error(date TIMESTAMP_NTZ, sales FLOAT, series VARCHAR);
INSERT INTO t_error VALUES
  (TO_TIMESTAMP_NTZ('2019-12-20'), 1.0, 'A'),
  (TO_TIMESTAMP_NTZ('2019-12-21'), 2.0, 'A'),
  (TO_TIMESTAMP_NTZ('2019-12-22'), 3.0, 'A'),
  (TO_TIMESTAMP_NTZ('2019-12-23'), 2.0, 'A'),
  (TO_TIMESTAMP_NTZ('2019-12-24'), 1.0, 'A'),
  (TO_TIMESTAMP_NTZ('2019-12-25'), 2.0, 'A'),
  (TO_TIMESTAMP_NTZ('2019-12-26'), 3.0, 'A'),
  (TO_TIMESTAMP_NTZ('2019-12-27'), 2.0, 'A'),
  (TO_TIMESTAMP_NTZ('2019-12-28'), 1.0, 'A'),
  (TO_TIMESTAMP_NTZ('2019-12-29'), 2.0, 'A'),
  (TO_TIMESTAMP_NTZ('2019-12-30'), 3.0, 'A'),
  (TO_TIMESTAMP_NTZ('2019-12-31'), 2.0, 'A'),
  (TO_TIMESTAMP_NTZ('2020-01-01'), 2.0, 'A'),
  (TO_TIMESTAMP_NTZ('2020-01-02'), 3.0, 'A'),
  (TO_TIMESTAMP_NTZ('2020-01-03'), 3.0, 'A'),
  (TO_TIMESTAMP_NTZ('2020-01-04'), 7.0, 'A'),
  (TO_TIMESTAMP_NTZ('2020-01-05'), 10.0, 'B'),
  (TO_TIMESTAMP_NTZ('2020-01-06'), 13.0, 'B'),
  (TO_TIMESTAMP_NTZ('2020-01-06'), 12.0, 'B'), -- duplicate timestamp
  (TO_TIMESTAMP_NTZ('2020-01-07'), 15.0, 'B'),
  (TO_TIMESTAMP_NTZ('2020-01-08'), 14.0, 'B'),
  (TO_TIMESTAMP_NTZ('2020-01-09'), 18.0, 'B'),
  (TO_TIMESTAMP_NTZ('2020-01-10'), 12.0, 'B');

CREATE SNOWFLAKE.ML.FORECAST model(
  INPUT_DATA => SYSTEM$QUERY_REFERENCE('SELECT date, sales, series FROM t_error'),
  SERIES_COLNAME => 'series',
  TIMESTAMP_COLNAME => 'date',
  TARGET_COLNAME => 'sales',
  CONFIG_OBJECT => {'ON_ERROR': 'SKIP'}
);

CALL model!SHOW_TRAINING_LOGS();
Copy

출력

+--------+-------------------------------------------------------------------------------------------------+
| SERIES | LOGS                                                                                            |
+--------+-------------------------------------------------------------------------------------------------+
| "B"    | {   "Errors": [     "Frequency cannot be inferred when duplicate timestamps are present."   ] } |
| "A"    | NULL                                                                                            |
+--------+-------------------------------------------------------------------------------------------------+

비용 고려 사항

예측 모델 학습과 사용에는 저장소 및 컴퓨팅 비용이 발생합니다.

가상 웨어하우스 선택하기 에 설명된 바와 같이, 학습은 학습된 모델에서 예측하는 것보다 더 많은 컴퓨팅 리소스를 사용합니다. 하지만 예측 비용은 모델의 반복 사용으로 누적될 수 있습니다. Snowflake 컴퓨팅 비용에 대한 일반 정보는 컴퓨팅 비용 이해하기 섹션을 참조하십시오.

발생하는 저장소 요금은 학습 단계 중에 생성된 ML 모델 인스턴스의 저장을 반영합니다. 모델 인스턴스와 연결된 오브젝트를 보려면 Account Usage 뷰(예: ACCOUNT_USAGE.TABLES 및 ACCOUNT_USAGE.STAGES)로 이동하십시오. 이러한 오브젝트는 NULL 데이터베이스 및 스키마 열과 함께 표시됩니다. 하지만 instance_id 열이 채워지며 이러한 오브젝트가 모델 인스턴스 내에 포함되어 있음을 나타냅니다. 이러한 오브젝트는 모델 인스턴스로 완전히 관리되며 오브젝트에 별도로 액세스하거나 삭제할 수 없습니다. 모델과 관련된 저장소 요금을 절감하려면 사용되지 않거나 더 이상 지원되지 않는 모델을 삭제하십시오.

Snowpark에서 예측 사용하기

session.call 은 아직 예측 모델과 호환되지 않습니다. Snowpark에서 예측 모델을 호출하려면 여기에 표시된 대로 대신 session.sql 을 사용하십시오.

session.sql('call my_model!forecast(...)').collect()
Copy