시계열 예측(Snowflake ML 함수)

예측은 머신 러닝 알고리즘을 사용하여 과거 시계열 데이터를 기반으로 미래의 수치 데이터를 예측합니다. 일반적인 사용 사례는 다음 2주 동안의 품목별 매출을 예측하는 것입니다.

예측 빠른 시작

이 섹션에서는 예측을 시작하는 가장 빠른 방법을 제공합니다.

전제 조건

시작하려면 다음을 수행해야 합니다.

  • 데이터베이스, 스키마, 가상 웨어하우스를 선택합니다.

  • 스키마를 소유하고 있거나 선택한 스키마에 CREATE SNOWFLAKE.ML.FORECAST 권한이 있는지 확인합니다.

  • 최소 2개의 열(타임스탬프 열 1개, 숫자 열 1개)이 있는 테이블이나 뷰가 있어야 합니다. 타임스탬프 열에 고정 간격으로 타임스탬프가 있는지, 그리고 타임스탬프가 너무 많이 누락되지 않았는지 확인합니다. 다음 예제는 타임스탬프 간격이 1일인 데이터 세트를 보여줍니다.

    ('2020-01-01 00:00:00.000', 2.0),
    ('2020-01-02 00:00:00.000', 3.0),
    ('2020-01-03 00:00:00.000', 4.0);
    
    Copy

예측 만들기

전제 조건이 충족되면 Snowsight 의 AI & ML Studio를 사용하여 설정을 안내하거나 다음 SQL 명령을 사용하여 모델을 훈련하고 예측 생성을 시작할 수 있습니다.

-- Train your model
CREATE SNOWFLAKE.ML.FORECAST my_model(
  INPUT_DATA => TABLE(my_view),
  TIMESTAMP_COLNAME => 'my_timestamps',
  TARGET_COLNAME => 'my_metric'
);

-- Generate forecasts using your model
SELECT * FROM TABLE(my_model!FORECAST(FORECASTING_PERIODS => 7));
Copy

구문 및 사용 가능한 방법에 대한 자세한 내용은 FORECAST (SNOWFLAKE.ML) 참조를 참조하십시오.

예측에 대해 더 자세히 알아보기

예측 함수는 미래의 모든 숫자형 시계열 데이터를 예측하도록 개발되었습니다. 예측 빠른 시작 섹션에 제시된 간단한 사례 외에도 다음을 수행할 수 있습니다.

  • 한 번에 여러 시계열을 예측합니다. 예를 들어, 다음 2주 동안 여러 품목의 매출을 예측할 수 있습니다.

  • 기능을 사용하여 훈련시키고 예측합니다. 기능은 예측할 메트릭에 영향을 미치는 추가 요소입니다.

  • 모델의 정확도를 평가합니다.

  • 모델이 훈련된 기능의 상대적 중요성을 파악합니다.

  • 훈련 오류를 디버그합니다.

다음 섹션에서는 이러한 시나리오의 예시와 예측이 작동하는 방식에 대한 자세한 정보를 제공합니다.

이 섹션에서는 예측을 위해 데이터를 설정하는 방법과 시계열 데이터를 기반으로 예측 모델을 생성하는 방법에 대한 예를 제공합니다.

참고

이상적으로, 예측 모델의 훈련 데이터에는 균등한 간격(예: 매일)의 시간 스텝이 있는 것이 좋습니다. 그러나 모델 훈련은 누락되거나 중복되거나 잘못 정렬된 시간 단계가 있는 실제 데이터를 처리할 수 있습니다. 자세한 내용은 시계열 예측에서 실제 데이터 처리 섹션을 참조하십시오.

예제 데이터 설정

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

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 additional columns (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 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 => TABLE(v1),
  TIMESTAMP_COLNAME => 'date',
  TARGET_COLNAME => 'sales'
);
Copy

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

Instance MODEL1 successfully created.

다음으로, 예측 모델을 사용하여 다음 3개의 타임스탬프를 예측합니다.

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

출력

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

+--------+-------------------------+-----------+--------------+--------------+
| SERIES | TS                      | FORECAST  | LOWER_BOUND  | UPPER_BOUND  |
+--------+-------------------------+-----------+--------------+--------------+
| NULL   | 2020-01-13 00:00:00.000 | 14        | 14           | 14           |
| NULL   | 2020-01-14 00:00:00.000 | 15        | 15           | 15           |
| NULL   | 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

결과를 테이블에 직접 저장하려면 CREATE TABLE … AS SELECT … 를 사용하고 FROM 절에서 FORECAST 메서드를 호출 합니다.

CREATE TABLE my_forecasts AS
  SELECT * FROM TABLE(model1!FORECAST(FORECASTING_PERIODS => 3));
Copy

위의 예제와 같이 메서드를 호출할 때 CALL 명령어를 생략합니다. 대신, 호출을 괄호로 묶고 그 앞에 TABLE 키워드를 붙입니다.

다중 계열에 대한 예측

한 번에 여러 계열에 대한 예측 모델을 생성하려면 series_colname 매개 변수를 사용합니다.

이 예제에서는 데이터에 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     |
+-------------------+-------------------------+-------+

이제 예측 함수를 사용하여 한 단계로 각 계열에 대한 모델을 훈련시킵니다. 참고로 series_colname 매개 변수는 store_item 으로 설정됩니다.

CREATE SNOWFLAKE.ML.FORECAST model2(
  INPUT_DATA => TABLE(v3),
  SERIES_COLNAME => 'store_item',
  TIMESTAMP_COLNAME => 'date',
  TARGET_COLNAME => 'sales'
);
Copy

그런 다음 해당 모델을 사용하여 모든 계열의 다음 두 타임스탬프를 예측합니다.

CALL model2!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 model2!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-14 00:00:00.000 | 15        | 15          | 15          |
+-------------------+-------------------------+-----------+-------------+-------------+

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

기능을 사용하여 예측하기

추가 특징(예: 공휴일 또는 날씨)이 예측에 영향을 미치도록 하려면 훈련 데이터에 이러한 특징을 포함해야 합니다. 여기서는 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 model3(
  INPUT_DATA => TABLE(v2),
  TIMESTAMP_COLNAME => 'date',
  TARGET_COLNAME => 'sales'
);
Copy

이 모델을 사용하여 예측을 생성하려면 모델에 기능의 미래 값(이 경우 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 model3!FORECAST(
  INPUT_DATA => TABLE(v2_forecast),
  TIMESTAMP_COLNAME =>'date'
);
Copy

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

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

문제 해결 및 모델 평가

다음 도우미 함수를 사용하여 모델 성능을 평가하고, 모델에 가장 큰 영향을 미치는 함수를 파악하고, 오류가 발생한 경우 학습 프로세스를 디버그하는 데 도움이 될 수 있습니다.

평가 메트릭

모델에 대한 평가 메트릭을 얻으려면 <model_name>!SHOW_EVALUATION_METRICS 메서드를 호출합니다. 기본적으로 예측 함수는 교차 검증 방법을 사용하여 훈련하는 모든 모델을 평가합니다. 즉, 함수는 내부적으로 공급자가 제공하는 모든 훈련 데이터에 대해 최종 모델을 훈련시키는 것 외에도 훈련 데이터의 하위 집합에 대해서도 모델을 훈련시킵니다. 그런 다음 이러한 모델을 사용하여 보류된 데이터에 대한 목표 메트릭을 예측하고, 이를 통해 함수는 이러한 예측을 과거 데이터의 실제 값과 비교할 수 있습니다.

이러한 평가 메트릭이 필요하지 않은 경우 evaluate 를 FALSE로 설정하면 됩니다. 교차 유효성 검사의 실행 방식을 제어하려면 다음 매개 변수를 사용gkaus ehlqslek.

  • n_splits: 교차 유효성 검사를 위한 데이터의 분할 수를 나타냅니다. 기본값은 1입니다.

  • max_train_size: 단일 훈련 세트에 대한 최대 행 수를 나타냅니다.

  • test_size: 각 테스트 세트에 포함되는 행 수를 제한합니다.

  • gap: 각 훈련 세트의 끝과 테스트 세트의 시작 사이의 차이를 나타냅니다.

평가 매개 변수에 대한 자세한 내용은 평가 구성 섹션을 참조하십시오.

참고

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

n_splits 가 1(기본값)인 경우, 유효성 검사 데이터 세트만 사용되므로 평가 메트릭 값의 표준 편차는 NULL이 됩니다.

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

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

CALL model!SHOW_EVALUATION_METRICS();
Copy

출력

+--------+--------------------------+--------------+--------------------+------+
| SERIES | ERROR_METRIC             | METRIC_VALUE | STANDARD_DEVIATION | LOGS |
+--------+--------------------------+--------------+--------------------+------+
| NULL   | "MAE"                    |         2.49 |                NaN | NULL |
| NULL   | "MAPE"                   |        0.084 |                NaN | NULL |
| NULL   | "MDA"                    |         0.99 |                NaN | NULL |
| NULL   | "MSE"                    |        8.088 |                NaN | NULL |
| NULL   | "SMAPE"                  |        0.077 |                NaN | NULL |
| NULL   | "WINKLER_ALPHA=0.05"     |       12.101 |                NaN | NULL |
| NULL   | "COVERAGE_INTERVAL=0.95" |            1 |                NaN | NULL |
+--------+--------------------------+--------------+--------------------+------+
Copy

기능 중요도

모델에서 사용된 기능의 상대적 중요성을 이해하려면 <model_name>!EXPLAIN_FEATURE_IMPORTANCE 메서드를 사용합니다.

예측 모델을 훈련시킬 때 모델은 타임스탬프, 목표 메트릭, 공급자가 제공하는 추가 열(기능), 예측의 성능을 개선하기 위해 자동으로 생성되는 기능 등 제공된 데이터를 사용하여 데이터의 패턴을 학습합니다. 훈련을 통해 이러한 각 요소가 다른 요소보다 정확한 예측에 얼마나 중요한지 파악할 수 있습니다. 이 도우미 함수의 목적은 이러한 함수의 상대적 중요도를 0~1의 척도로 파악하는 것입니다.

이 도우미 함수는 모델이 결정을 내리기 위해 각 함수를 사용한 횟수를 계산합니다. 이러한 특징 중요도 점수는 합계가 1이 되도록 0과 1 사이의 값으로 정규화됩니다. 결과 점수는 학습된 모델에 있는 함수의 대략적인 순위를 나타냅니다.

이 기능에 대한 주요 고려 사항

  • 점수가 서로 가까운 특징은 그 중요도가 비슷합니다.

  • 극히 간단한 계열의 경우(예: 대상 열에 상수 값이 있는 경우) 모든 특징 중요도 점수가 0일 수 있습니다.

  • 서로 매우 비슷한 여러 특징을 사용하면 해당 특징들의 중요도 점수가 낮아질 수 있습니다. 예를 들어, 두 기능이 정확히 동일한 경우 모델은 의사 결정을 할 때 이들을 상호 교환 가능한 것으로 취급할 수 있으므로, 동일한 기능 중 하나만 포함된 경우 해당 점수의 절반인 특징 중요도 점수가 도출됩니다.

이 예제에서는 평가 예제 의 데이터를 사용하여 기능 중요도 메서드를 호출합니다. 생성된 exog_a 변수는 aggregated_endogenous_trend_features 기능 이름으로 집계되는 모든 롤링 평균에 이어 두 번째로 중요한 기능임을 알 수 있습니다.

다음 문을 실행하여 기능의 중요성을 이해할 수 있습니다.

CALL model!EXPLAIN_FEATURE_IMPORTANCE();
Copy

출력

+--------+------+--------------+---------------+---------------+
| SERIES | RANK | FEATURE_NAME | SCORE         | FEATURE_TYPE  |
+--------+------+--------------+---------------+---------------+
| NULL   |    1 | exog_a       |  31.414947903 | user_provided |
| NULL   |    2 | exog_b       |             0 | user_provided |
+--------+------+--------------+---------------+---------------+

문제 해결하기

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

CREATE TABLE t_error(date TIMESTAMP_NTZ, sales FLOAT, series VARCHAR);
INSERT INTO t_error VALUES
  (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-06'), 10.0, 'B'), -- the same timestamp used again and again
  (TO_TIMESTAMP_NTZ('2020-01-06'), 13.0, 'B'),
  (TO_TIMESTAMP_NTZ('2020-01-06'), 12.0, 'B'),
  (TO_TIMESTAMP_NTZ('2020-01-06'), 15.0, 'B'),
  (TO_TIMESTAMP_NTZ('2020-01-06'), 14.0, 'B'),
  (TO_TIMESTAMP_NTZ('2020-01-06'), 18.0, 'B'),
  (TO_TIMESTAMP_NTZ('2020-01-06'), 12.0, 'B');

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

CALL error_model!SHOW_TRAINING_LOGS();
Copy

출력

+--------+--------------------------------------------------------------------------+
| SERIES | LOGS                                                                     |
+--------+--------------------------------------------------------------------------+
| "B"    | {   "Errors": [     "At least two unique timestamps are required."   ] } |
| "A"    | NULL                                                                     |
+--------+--------------------------------------------------------------------------+

모델 관리

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

SHOW SNOWFLAKE.ML.FORECAST;
Copy

모델을 삭제하려면 DROP SNOWFLAKE.ML.FORECAST 명령을 사용합니다.

DROP SNOWFLAKE.ML.FORECAST my_model;
Copy

모델은 변경할 수 없으며 자체적으로 업데이트할 수 없습니다. 대신 새로운 모델을 훈련시킵니다.

웨어하우스 선택

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

웨어하우스를 선택할 때 염두에 두어야 할 두 가지 주요 요소는 다음과 같습니다.

  1. 데이터에 포함된 행과 열의 수입니다.

  2. 데이터에 포함된 고유 계열의 수입니다.

웨어하우스를 선택할 때 다음과 같은 경험 규칙을 사용할 수 있습니다.

  1. 더 긴 시계열(> 500만 개 행) 또는 많은 열(많은 기능)을 훈련시키는 경우 Snowpark에 최적화된 웨어하우스 로 업그레이드하는 것이 좋습니다.

  2. 여러 계열을 훈련시키는 경우 크기를 늘리십시오. 예측 함수는 한 번에 여러 계열을 훈련시킬 때 웨어하우스에서 사용 가능한 모든 노드에 모델 훈련을 분배합니다.

다음 테이블은 동일한 지침을 제공합니다.

계열 유형

< 500만 개 행

> 500만 개 행 및 ≤ 1억 개 행

> 1억 개 행

1개의 계열

표준 웨어하우스, XS

Snowpark에 최적화된 웨어하우스, XS

덜 빈번한 타임스탬프 간격(예: 1시간마다에서 1일마다)으로 집계하는 것이 좋습니다.

다중 계열

표준 웨어하우스, 크기 확장

Snowpark 최적화된 웨어하우스, 크기 확장

계열별 훈련을 여러 작업으로 일괄 처리하는 방법 고려하기

대략적인 추정치로, 훈련 시간은 시계열의 행 수에 비례합니다. 예를 들어, XS 표준 웨어하우스에서 평가가 꺼진 상태(CONFIG_OBJECT => {'evaluate': False})에서 100,000행 데이터 세트에 대한 훈련에는 약 400초가 소요됩니다. 1,000,000행의 데이터 세트에 대한 학습에는 약 850초가 걸립니다. 평가를 켜면 훈련 시간은 사용한 분할 수에 따라 거의 선형적으로 증가합니다.

알고리즘 세부 정보

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

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

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

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

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

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

중요

Snowflake는 수시로 예측 알고리즘을 개선할 수 있습니다. 이러한 개선 사항은 Snowflake 정기 릴리스 프로세스를 통해 적용됩니다. 이 기능의 이전 버전으로 되돌릴 수는 없지만, 이전 버전으로 생성한 모델은 Behavior Change Release 프로세스를 통해 더 이상 사용되지 않을 때까지 예측을 위해 해당 버전을 계속 사용합니다.

현재 제한 사항

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

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

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

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

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

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

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

  • 일단 학습된 예측 모델은 변경할 수 없습니다. 새 데이터로 기존 모델을 업데이트할 수 없으며 완전히 새 모델을 학습시켜야 합니다.

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

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

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

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

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

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

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

USE ROLE admin;
GRANT USAGE ON DATABASE admin_db TO ROLE analyst;
GRANT USAGE ON SCHEMA 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 analyst_db.analyst_schema;
Copy

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

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

비용 고려 사항

ML 함수 사용 비용에 대한 자세한 내용은 ML 함수 개요에서 비용 고려 사항 섹션을 참조하십시오.