시계열 예측(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);
예측 만들기¶
전제 조건이 충족되면 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));
구문 및 사용 가능한 방법에 대한 자세한 내용은 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);
단일 계열에 대해 예측하기¶
이 예에서는 추가 특징 없이 타임스탬프 열과 대상 값 열의 두 열이 있는 단일 시계열(즉, 모든 행이 단일 계열에 속함)을 사용합니다.
먼저, 모델을 훈련시킬 예제 데이터 세트를 준비합니다.
CREATE OR REPLACE VIEW v1 AS SELECT date, sales
FROM sales_data WHERE store_id=1 AND item='jacket';
SELECT * FROM v1;
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'
);
모델이 학습되면 다음 메시지가 나타납니다.
Instance MODEL1 successfully created.
다음으로, 예측 모델을 사용하여 다음 3개의 타임스탬프를 예측합니다.
call model1!FORECAST(FORECASTING_PERIODS => 3);
출력
모델은 학습 데이터에서 타임스탬프 사이의 간격을 유추했습니다.
+--------+-------------------------+-----------+--------------+--------------+
| 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});
결과를 테이블에 직접 저장하려면 CREATE TABLE … AS SELECT … 를 사용하고 FROM 절에서 FORECAST 메서드를 호출 합니다.
CREATE TABLE my_forecasts AS
SELECT * FROM TABLE(model1!FORECAST(FORECASTING_PERIODS => 3));
위의 예제와 같이 메서드를 호출할 때 CALL 명령어를 생략합니다. 대신, 호출을 괄호로 묶고 그 앞에 TABLE 키워드를 붙입니다.
다중 계열에 대한 예측¶
한 번에 여러 계열에 대한 예측 모델을 생성하려면 series_colname
매개 변수를 사용합니다.
이 예제에서는 데이터에 store_id
및 item
열이 포함되어 있습니다. 데이터 세트의 모든 매장/품목 조합에 대한 판매를 각기 따로 예측하려면 이러한 값을 결합하는 새 열을 만들어 계열 열로 지정하십시오.
다음 쿼리로 store_item
이라는 새 열로 store_id
와 item
을 결합하는 새 뷰를 만듭니다.
CREATE OR REPLACE VIEW v3 AS SELECT [store_id, item] AS store_item, date, sales FROM sales_data;
SELECT * FROM v3;
출력
결과 데이터 세트의 각 계열에 대한 첫 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'
);
그런 다음 해당 모델을 사용하여 모든 계열의 다음 두 타임스탬프를 예측합니다.
CALL model2!FORECAST(FORECASTING_PERIODS => 2);
출력
+-------------------+------------------------+----------+-------------+-------------+
| 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);
출력
결과에는 매장 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;
출력
다음은 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'
);
이 모델을 사용하여 예측을 생성하려면 모델에 기능의 미래 값(이 경우 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;
출력
+-------------------------+-------------+----------+---------+
| 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'
);
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();
출력
+--------+--------------------------+--------------+--------------------+------+
| 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 |
+--------+--------------------------+--------------+--------------------+------+
기능 중요도¶
모델에서 사용된 기능의 상대적 중요성을 이해하려면 <model_name>!EXPLAIN_FEATURE_IMPORTANCE 메서드를 사용합니다.
예측 모델을 훈련시킬 때 모델은 타임스탬프, 목표 메트릭, 공급자가 제공하는 추가 열(기능), 예측의 성능을 개선하기 위해 자동으로 생성되는 기능 등 제공된 데이터를 사용하여 데이터의 패턴을 학습합니다. 훈련을 통해 이러한 각 요소가 다른 요소보다 정확한 예측에 얼마나 중요한지 파악할 수 있습니다. 이 도우미 함수의 목적은 이러한 함수의 상대적 중요도를 0~1의 척도로 파악하는 것입니다.
이 도우미 함수는 모델이 결정을 내리기 위해 각 함수를 사용한 횟수를 계산합니다. 이러한 특징 중요도 점수는 합계가 1이 되도록 0과 1 사이의 값으로 정규화됩니다. 결과 점수는 학습된 모델에 있는 함수의 대략적인 순위를 나타냅니다.
이 기능에 대한 주요 고려 사항¶
점수가 서로 가까운 특징은 그 중요도가 비슷합니다.
극히 간단한 계열의 경우(예: 대상 열에 상수 값이 있는 경우) 모든 특징 중요도 점수가 0일 수 있습니다.
서로 매우 비슷한 여러 특징을 사용하면 해당 특징들의 중요도 점수가 낮아질 수 있습니다. 예를 들어, 두 기능이 정확히 동일한 경우 모델은 의사 결정을 할 때 이들을 상호 교환 가능한 것으로 취급할 수 있으므로, 동일한 기능 중 하나만 포함된 경우 해당 점수의 절반인 특징 중요도 점수가 도출됩니다.
예¶
이 예제에서는 평가 예제 의 데이터를 사용하여 기능 중요도 메서드를 호출합니다. 생성된 exog_a
변수는 aggregated_endogenous_trend_features
기능 이름으로 집계되는 모든 롤링 평균에 이어 두 번째로 중요한 기능임을 알 수 있습니다.
다음 문을 실행하여 기능의 중요성을 이해할 수 있습니다.
CALL model!EXPLAIN_FEATURE_IMPORTANCE();
출력
+--------+------+--------------+---------------+---------------+
| 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();
출력
+--------+--------------------------------------------------------------------------+
| SERIES | LOGS |
+--------+--------------------------------------------------------------------------+
| "B" | { "Errors": [ "At least two unique timestamps are required." ] } |
| "A" | NULL |
+--------+--------------------------------------------------------------------------+
모델 관리¶
모델 목록을 보려면 SHOW SNOWFLAKE.ML.FORECAST 명령을 사용하십시오.
SHOW SNOWFLAKE.ML.FORECAST;
모델을 삭제하려면 DROP SNOWFLAKE.ML.FORECAST 명령을 사용합니다.
DROP SNOWFLAKE.ML.FORECAST my_model;
모델은 변경할 수 없으며 자체적으로 업데이트할 수 없습니다. 대신 새로운 모델을 훈련시킵니다.
웨어하우스 선택¶
Snowflake 가상 웨어하우스 가 이 기능에 대한 머신 러닝 모델을 학습시키고 사용하기 위한 컴퓨팅 리소스를 제공합니다. 이 섹션에서는 프로세스에서 가장 시간이 많이 걸리고 메모리 집약적인 부분인 학습 단계에 중점을 두고서 이 목적에 가장 적합한 웨어하우스 유형 및 크기를 선택하는 방법에 대한 일반적인 지침을 제공합니다.
웨어하우스를 선택할 때 염두에 두어야 할 두 가지 주요 요소는 다음과 같습니다.
데이터에 포함된 행과 열의 수입니다.
데이터에 포함된 고유 계열의 수입니다.
웨어하우스를 선택할 때 다음과 같은 경험 규칙을 사용할 수 있습니다.
더 긴 시계열(> 500만 개 행) 또는 많은 열(많은 기능)을 훈련시키는 경우 Snowpark에 최적화된 웨어하우스 로 업그레이드하는 것이 좋습니다.
여러 계열을 훈련시키는 경우 크기를 늘리십시오. 예측 함수는 한 번에 여러 계열을 훈련시킬 때 웨어하우스에서 사용 가능한 모든 노드에 모델 훈련을 분배합니다.
다음 테이블은 동일한 지침을 제공합니다.
계열 유형 |
< 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;
이 스키마를 사용하기 위해 사용자는 analyst
역할을 맡습니다.
USE ROLE analyst;
USE SCHEMA admin_db.admin_schema;
analyst
역할이 analyst_db
데이터베이스에서 CREATE SCHEMA 권한을 가질 경우 이 역할은 새 스키마 analyst_db.analyst_schema
를 생성하고 해당 스키마에서 예측 모델을 생성할 수 있습니다.
USE ROLE analyst;
CREATE SCHEMA analyst_db.analyst_schema;
USE SCHEMA analyst_db.analyst_schema;
스키마에 대한 역할의 예측 모델 생성 권한을 취소하려면 REVOKE <권한> 를 사용하십시오.
REVOKE CREATE SNOWFLAKE.ML.FORECAST ON SCHEMA admin_db.admin_schema FROM ROLE analyst;
비용 고려 사항¶
ML 함수 사용 비용에 대한 자세한 내용은 ML 함수 개요에서 비용 고려 사항 섹션을 참조하십시오.
법적 고지¶
중요
법적 고지. 이 Snowflake ML 함수는 머신 러닝 기술을 기반으로 합니다. 제공된 머신 러닝 기술 및 결과는 부정확하거나 부적절하거나 편향될 수 있습니다. 자동 파이프라인에 내장된 결과를 포함하여 머신 러닝 출력을 기반으로 한 의사 결정에는 모델 생성 콘텐츠가 정확하도록 보장하기 위해 사람의 감독 및 검토 프로세스가 있어야 합니다. Snowflake Cortex ML 함수 쿼리는 다른 SQL 쿼리로 처리되며 메타데이터 로 간주될 수 있습니다.
메타데이터. Snowflake Cortex ML 함수를 사용하면 Snowflake는 ML 함수가 반환하는 일반 오류 메시지를 기록합니다. 이러한 오류 로그는 발생하는 문제를 해결하고 이러한 함수를 개선하여 더 나은 서비스를 제공하는 데 도움이 됩니다.
자세한 내용은 Snowflake AI 신뢰 및 안전 FAQ 를 참조하십시오.