时间序列预测(Snowflake ML 函数)¶
预测采用机器学习算法,根据历史时间序列数据预测未来的数字数据。一个常见的使用案例是按商品预测未来两周的销售额。
预测快速入门¶
本节提供了最快捷的预测入门方法。
先决条件¶
要开始使用,您必须执行以下操作:
选择数据库、架构和虚拟仓库。
确认您拥有架构或者在所选架构中拥有 CREATE SNOWFLAKE.ML.FORECAST 权限。
拥有一个至少有两列的表格或视图:一个时间戳列和一个数字列。确保您的时间戳列具有固定间隔的时间戳,并且不会丢失太多时间戳。下面的示例显示了时间戳间隔为一天的数据集:
('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) 参考。
更深入了解预测¶
预测功能用于预测未来的任何数值时间序列数据。除了 预测快速入门 部分介绍的简单案例外,您还可以进行以下操作:
同时预测多个系列。例如,您可以预测未来两周多种商品的销售情况。
使用特征进行训练和预测。特征是您认为会影响您要预测的指标的其他因素。
评估模型的准确性。
了解用于训练模型的特征的相对重要性。
调试训练错误。
以下各节将举例说明这些情况,并详细介绍如何预测的工作方式。
示例¶
本节将举例说明如何设置数据以进行预测以及如何根据时间序列数据创建预测模型。
备注
理想情况下,预测模型的训练数据具有间隔相等的时间步(例如每天)。然而,模型训练可以处理现实世界中存在时间步缺失、重复或错位的数据。有关更多信息,请参阅 在时间序列预测中处理真实世界的数据。
设置示例数据¶
下面的示例创建了两个表。这些表的视图包含在本主题后面的 示例 中。
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.
接下来,使用预测模型预测接下来的三个时间戳:
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 |
+--------+-------------------------+-----------+--------------+--------------+
在本示例中,由于预测结果是完全线性的,与实际值相比误差为零,因此预测区间(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_id
和 item
合并到一个名为 store_item
的新列中:
CREATE OR REPLACE VIEW v3 AS SELECT [store_id, item] AS store_item, date, sales FROM sales_data;
SELECT * FROM v3;
输出
生成的数据集的每个序列的前五行是:
+-------------------+-------------------------+-------+
| 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 查询结果的前五行。
+-------------------------+--------+-------------+----------+----------+
| 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 方法。默认情况下,预测函数使用一种名为 交叉验证 (link removed) 的方法来评估其训练的所有模型。这意味着,除了对您提供的所有训练数据来训练最终模型外,该函数还会对训练数据的子集训练模型。然后,这些模型将用于针对保留的数据预测目标指标,使该功能能够将这些预测值与历史数据中的实际值进行比较。
如果不需要这些评估指标,可以将 evaluate
设置为 FALSE。如果要控制交叉验证的运行方式,可以使用以下参数:
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 的范围内的相对重要性。
本质上,这个辅助函数会计算模型使用每个特征做出决策的次数。然后将这些特征重要性得分归一化为 0 到 1 之间的值,它们的总和是 1。生成的分数表示训练模型中特征的近似排名。
该特征的主要考虑因素¶
得分接近的特征具有相似的重要性。
对于极其简单的序列(例如,目标列的值为常数),所有特征重要性得分可能为零。
使用彼此非常相似的多个特征可能会降低这些特征的重要性得分。例如,如果两个特征完全相同,则模型在做出决策时可能会将它们视为可互换,从而导致特征重要性分数是仅包含一个相同特征时这些分数的一半。
示例¶
本示例使用 评估示例 中的数据,并调用特征重要性方法。您可以看到,所创建的 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-Optimized Warehouses。
如果要对多个系列进行训练,请扩大数据。当同时对多个序列进行训练时,预测功能会将模型训练分配到仓库中所有可用的节点。
下表提供了同样的指导:
系列类型 |
< 500 万行 |
> 500 万行且 ≤ 1 亿行 |
> 1 亿行 |
---|---|---|---|
一个系列 |
标准仓库;XS |
Snowpark 优化的仓库:XS |
考虑聚合到频率较低的时间戳间隔(例如,从每小时到每天) |
多个系列 |
标准仓库;扩大数据 |
Snowpark 优化的仓库;扩大数据 |
考虑按系列将训练分批纳入多个工作中 |
粗略估计,训练时间与时间序列中的行数成正比。例如,在 XS 标准仓库上,在关闭评估的情况下 (CONFIG_OBJECT => {'evaluate': False}
) 后,对 100,000 行数据集进行训练大约需要 400 秒。对 1,000,000 行数据集进行训练大约需要 850 秒。开启评估功能后,训练时间的增加与使用的拆分次数大致成线性关系。
算法详情¶
预测算法由 梯度提升机 (link removed) (GBM) 提供支持。与 ARIMA (link removed) 模型一样,它使用差分变换对具有非平稳趋势的数据进行建模,并使用历史目标数据的自回归滞后项作为模型变量。
此外,该算法使用历史目标数据的滚动平均值来帮助预测趋势,并使用时间戳数据自动生成循环日历变量(例如星期几和一年中的一周)。
您可以仅使用历史目标值和时间戳数据拟合模型,也可以加入可能影响目标值的特征(额外的列)。外生变量可以是数值或分类值,也可以是 NULL (不会删除包含 NULLs 外生变量的行)。
在对分类变量进行训练时,该算法不依赖单次编码,因此可以使用多维度(高基数)的分类数据。
如果模型包含特征,则在生成预测时,必须在整个预测范围的每个时间戳处为这些特征提供值。适当的特征包括天气数据(温度、降雨量)、公司特定信息(历史和计划的公司假期、广告活动、活动时间表),或者您认为可能有助于预测目标变量的任何其他外部因素。
除了预测之外,此算法还可生成预测区间。预测区间是上限和下限内的估计值范围,一定百分比的数据可能会落在这个范围内。例如,值 0.95 表示 95% 的数据可能出现在区间内。您可以指定预测区间百分比,或使用默认值 0.95。预测区间的下限和上限将作为预测输出的一部分返回。
重要
Snowflake 可能会不时改进预测算法。此类改进通过 Snowflake 的常规发布流程推出。您无法恢复到该功能的先前版本,但使用先前版本创建的模型将继续使用该版本进行预测,直到通过行为变更发布流程淘汰为止。
当前限制¶
当前版本具有以下限制:
您无法选择或调整预测算法。
主要预测算法的最小行数为每个时间序列 12 行。对于观测值介于 2 到 11 个之间的时间序列,预测会产生一个“朴素”的预测,其中所有预测值都等于上次观测的目标值。
预测函数不提供替换趋势、季节性或季节性幅度的参数;这些参数是从数据推断出来的。
可接受的最小数据粒度为一秒。(时间戳之间的间隔不得短于一秒。)
季节性组件的最小精确度为 1 分钟。(函数无法在较小时间增量下检测到循环模式。)
自回归特征的“季节长度”与输入频率相关联(每小时数据为 24,每日数据为 7,依此类推)。
预测模型一旦经过训练,就是不可变的。您不能使用新数据更新现有模型;您必须训练一个全新模型。
模型不支持版本控制。Snowflake 建议根据您接收新数据的频率,定期(可能是每天、每周或每月)重新训练模型,使模型能够适应不断变化的模式和趋势。
您无法克隆模型或跨角色或账户共享模型。 克隆架构或数据库时,将会跳过模型对象。
您不能 复制 FORECAST 类的实例。
授予创建预测对象的权限¶
训练预测模型会生成架构级对象。因此,用于创建模型的角色必须对创建模型的架构具有 CREATE SNOWFLAKE.ML.FORECAST 权限,这样才能将模型存储在该架构中。此权限类似于其他架构权限,如 CREATE TABLE 或 CREATE VIEW。
Snowflake 建议您创建一个需要创建预测的人员使用的角色,名称为 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 <privileges>:
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。