時系列予測(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週間の複数の商品の売上を予測できます。

  • 特徴量を使用してトレーニングし、予測する。特徴量とは、予測するメトリックに影響を与えると考えられる追加の要因のことをいいます。

  • モデルの精度を評価する。

  • モデルがトレーニングされた特徴量の相対的な重要性を理解します。

  • トレーニングエラーをデバッグする。

以下のセクションでは、これらのシナリオの例と、予測の仕組みに関する詳細について説明します。

このセクションでは、予測のためにデータを設定する方法と、時系列データに基づいて予測モデルを作成する方法の例を示します。

注釈

予測モデルのトレーニングデータには、等間隔(たとえば、毎日)の時間ステップが含まれるのが理想的です。ただし、モデルのトレーニングでは、時間ステップが欠落するか、重複する、またはずれている実際のデータを処理できます。詳細については、 時系列予測における現実世界のデータの取り扱い をご参照ください。

サンプルデータの設定

以下の例では、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

単一系列の予測

この例では、タイムスタンプ列とターゲット値列の2つの列を持つ単一時系列(つまり、すべての行が単一時系列の一部)を使用します。

まず、モデルをトレーニングするためのサンプル データセットを準備します。

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           |
+--------+-------------------------+-----------+--------------+--------------+

この例では、予測は実際の値と比較してエラーのない完全な線形予測をもたらすため、予測区間(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_id 列と item 列が含まれています。データセット内のすべての店舗と商品の組み合わせについて個別に売上を予測するには、これらの値を組み合わせた新しい列を作成し、それを系列の列として指定します。

以下のクエリは、 store_iditem を結合して、 store_item という名前の新しい列にした、新しいビューを作成します。

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     |
+-------------------+-------------------------+-------+

ここで、予測関数を使用して、各シリーズのモデルをすべて1つのステップでトレーニングします。 series_colname パラメーターが store_item に設定されていることに注意してください。

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

次に、そのモデルを使用して、すべてのシリーズの次の2つのタイムスタンプを予測します。

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の傘の販売について、次の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          |
+-------------------+-------------------------+-----------+-------------+-------------+

Tip

FORECAST メソッドで1つの系列を指定すると、1つの系列の予測のみが生成されるため、関心のある系列のみを含むように複数系列の予測結果をフィルタリングするよりも効率的です。

特徴量を使用した予測

追加の特徴量(例: 休日や天候)が予測に影響を及ぼすようにする場合は、これらの特徴量をトレーニングデータに含める必要があります。ここでは、 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

このモデルを使用して予測を生成するには、モデルに特徴量の将来の値(この場合は、 TEMPERATUREHUMIDITYHOLIDAY)を指定する必要があります。これにより、モデルは気温、湿度、休日の予測に基づいて売上予測を調整できるようになります。

ここで、将来のタイムスタンプのために、このデータを含む 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           |
+--------+-------------------------+-----------+--------------+--------------+

トラブルシューティングとモデル評価

以下のヘルパー関数を使用すると、モデルのパフォーマンスを評価し、モデルに最も影響を与える特徴量を把握し、エラーが発生した場合にトレーニングプロセスをデバッグすることができます。

評価メトリック

モデルの評価メトリックを取得するには、 <モデル名>!SHOW_EVALUATION_METRICS メソッドを呼び出します。デフォルトでは、予測関数は、 クロスバリデーション と呼ばれる方法を使用して、トレーニングするすべてのモデルを評価します。つまり、内部的には、提供されたすべてのトレーニング データで最終モデルをトレーニングするだけでなく、この関数はトレーニングデータのサブセットでモデルをトレーニングすることになります。これらのモデルは、保留されたデータに基づいてターゲットメトリックを予測するために使用され、関数はそれらの予測を履歴データの実際の値と比較できるようになります。

これらの評価メトリックが必要ない場合は、 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();
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

特徴量の重要性

モデルで使用される特徴量の相対的な重要性を理解するには、 <モデル名>!EXPLAIN_FEATURE_IMPORTANCE メソッドを使用します。

予測モデルをトレーニングする場合、モデルは、タイムスタンプ、ターゲット メトリック、指定した追加の列(特徴量)、予測のパフォーマンスを向上させるために自動的に生成される特徴量などの提供されたデータを使用して、データ内のパターンを学習します。トレーニングでは、正確な予測を行うために、これらのそれぞれが他のものと比べてどれほど重要であるかを検出します。これらの特徴量の相対的な重要度を0から1のスケールで理解することが、このヘルパー関数の目的です。

内部的には、このヘルパー関数は、モデルが各特徴量を使用して決定を下した回数をカウントします。それから、これらの特徴量の重要度スコアは、合計が1になるように0から1の間の値に正規化されます。結果として得られるスコアは、トレーニング済みモデルの特徴量の近似ランキングを表します。

この特徴量に関する主な考慮事項

  • スコアが近い特徴量は同じような重要性を持ちます。

  • 極端に単純な系列(たとえば、対象列の値が一定の場合)では、すべての特徴量の重要度スコアが0になる可能性があります。

  • 互いによく似た複数の特徴量を使用すると、それらの特徴量の重要度スコアが低下する可能性があります。たとえば、2つの特徴量がまったく同じである場合、モデルは決定を下す際にそれらを交換可能なものとして扱い、その結果、同じ特徴量のうちの1つだけが含まれていた場合には、特徴量の重要度スコアは本来のスコアの半分になる可能性があります。

この例では、 評価例 のデータを使用し、特徴量重要度メソッドを呼び出します。作成された exog_a 変数は、 aggregated_endogenous_trend_features 特徴量名で集計されるすべてのローリング平均に次いで2番目に重要な機能であることがわかります。

特徴量の重要度を取得するには、以下のステートメントを実行します。

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' でトレーニングする場合、トレーニングプロセス全体が失敗しなくても、個々の時系列モデルがトレーニングに失敗することがあります。どの時系列がなぜ失敗したかを把握するには、 <モデル名>!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 仮想ウェアハウス は、この特徴量のための機械学習モデルをトレーニングし、使用するためのコンピューティングリソースを提供します。このセクションでは、プロセスの中で最も時間とメモリを消費する部分であるトレーニングステップに焦点を当て、この目的に最適なウェアハウスのタイプとサイズを選択するための一般的なガイダンスを提供します。

ウェアハウスを選択する際に留意すべき重要な要素が2つあります。

  1. データに含まれる行と列の数。

  2. データに含まれる個別の系列の数。

ウェアハウスを選択する際には、以下の経験則を使用できます。

  1. より長い時系列(500万行超)または多数の列(多数の特徴量)でトレーニングする場合は、 Snowpark用に最適化されたウェアハウス へのアップグレードを検討してください。

  2. 多くの系列でトレーニングする場合は、サイズアップしてください。予測関数では、複数のシリーズを一度にトレーニングする場合に、ウェアハウス内の利用可能なすべてのノードにモデルトレーニングを分散します。

以下の表に同じガイダンスを示します。

系列タイプ

500万行未満

500万行超1億行以下

1億行超

1系列

標準ウェアハウス; XS

Snowparkに最適化されたウェアハウス; XS

より頻度の低いタイムスタンプ間隔(例:1時間ごとから1日ごと)に集計することを検討する

複数の系列

標準ウェアハウス; サイズアップ

Snowparkに最適化されたウェアハウス; サイズアップ

系列ごとのトレーニングを複数のジョブでバッチ処理することを検討する

おおよその目安として、トレーニング時間は時系列の行数に比例します。たとえば、評価をオフ(CONFIG_OBJECT => {'evaluate': False})にした XS 標準ウェアハウスでは、100,000行のデータセットのトレーニングに約400秒かかります。1,000,000行のデータセットでのトレーニングには、約850秒かかります。評価をオンにすると、トレーニング時間は使用される分割数に応じてほぼ直線的に増加します。

アルゴリズムの詳細

予測アルゴリズムは、 勾配ブースティングマシン (GBM)を使用しています。 ARIMA モデルのように、非定常トレンドを持つデータをモデリングするために差分変換を使用し、モデル変数として過去のターゲットデータの自己回帰ラグを使用します。

さらに、このアルゴリズムは、過去のターゲットデータの移動平均を使用してトレンドの予測を支援し、タイムスタンプデータから周期的なカレンダー変数(曜日や週番号など)を自動的に生成します。

過去のターゲットとタイムスタンプ データのみを使用してモデルを適合させることも、ターゲット値に影響を与えた可能性のある特徴量(追加の列)を含めることもできます。外生変数は、数値またはカテゴリ別の値であり、 NULL (外生変数の NULLs を含む行はドロップされません)の場合もあります。

このアルゴリズムは、カテゴリ別変数でトレーニングする際にone-hotエンコーディングに依存しないため、ディメンション数の多い(カーディナリティの高い)カテゴリデータを使用することができます。

モデルに特徴量が組み込まれている場合は、予測を生成する際に完全な予測範囲のタイムスタンプごとにそれらの特徴量の値を提供する必要があります。適切な特徴量には、気象情報(気温、降雨量)、企業固有の情報(これまでの、および計画されている企業の休日、広告キャンペーン、イベントスケジュール)、またはターゲット変数の予測に役立つと思われるその他の外部要因などがあります。

アルゴリズムは、予測に加えて予測区間も生成します。予測区間とは、データのある割合が該当する可能性のある上限値と下限値内の推定値の範囲を表します。たとえば、0.95という値は、データの95%が区間内に出現する可能性が高いことを意味します。予測区間を指定することも、デフォルトの0.95を使用することもできます。予測区間の下限と上限は、予測出力の一部として返されます。

重要

Snowflakeは随時、予測アルゴリズムを改良することがあります。このような改善は、通常のSnowflakeリリースプロセスを通じて展開されます。以前のバージョンの特徴量に戻すことはできませんが、以前のバージョンで作成したモデルは、動作変更リリースプロセスによって廃止されるまで、予測に引き続きそのバージョンを使用します。

現在の制限

現在のリリースには次の制限があります。

  • 予測アルゴリズムの選択や調整はできません。

  • 主な予測アルゴリズムの最小行数は、時系列ごとに12です。観測データが2と11の間の時系列では、予測はすべての予測値が最後に観測されたターゲット値に等しい「ナイーブ」な予測を生成します。

  • 予測関数は、トレンド、季節性、または季節振幅を上書きするパラメーターを提供しません。パラメーターはデータから推測されます。

  • データの最小許容粒度は1秒です。(タイムスタンプの間隔は1秒以内でなければなりません。)

  • 季節要因の最小粒度は1分です。(関数はより小さな時間差で周期的なパターンを検出することはできません。)

  • 自己回帰的な特徴量の「シーズンの長さ」は、入力頻度に関連付けられています(1時間ごとのデータでは24、1日ごとのデータでは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;
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 関数の概要の コストの考慮事項 を参照してください。