Zeitreihen-Prognose (Snowflake ML-Funktionen)

Bei der Prognoseerstellung (Forecasting) wird ein Algorithmus des maschinellen Lernens eingesetzt, um anhand historischer Zeitreihendaten zukünftige numerische Daten vorherzusagen. Ein häufiger Anwendungsfall ist die Prognose der Verkäufe nach Artikeln für die nächsten zwei Wochen.

Schnellstart für Prognosen

In diesem Abschnitt erfahren Sie, wie Sie am schnellsten mit der Prognosenerstellung beginnen können.

Voraussetzungen

Um loszulegen, müssen Sie Folgendes tun:

  • Wählen Sie eine Datenbank, ein Schema und ein virtuelles Warehouse aus.

  • Vergewissern Sie sich, dass Sie Eigentümer des Schemas sind oder über CREATE SNOWFLAKE.ML.FORECAST-Berechtigungen in dem von Ihnen gewählten Schema verfügen.

  • Sie haben eine Tabelle oder Ansicht mit mindestens zwei Spalten: eine Zeitstempelspalte und eine numerische Spalte. Stellen Sie sicher, dass Ihre Zeitstempelspalte Zeitstempel in einem festen Intervall enthält und nicht zu viele Zeitstempel fehlen. Das folgende Beispiel zeigt einen Datensatz mit Zeitstempelintervallen von einem Tag:

    ('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

Prognosen erstellen

Sobald Sie über die Voraussetzungen verfügen, können Sie das AI & ML-Studio in Snowsight verwenden, das Sie durch das Setup führt, oder Sie können die folgenden SQL Befehle verwenden, um ein Modell zu trainieren und mit der Erstellung von Prognosen zu beginnen:

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

Weitere Einzelheiten zur Syntax und den verfügbaren Methoden finden Sie in der Referenz FORECAST (SNOWFLAKE.ML).

Mehr zum Thema Prognosen

Die Prognosefunktion ist so aufgebaut, dass sie beliebige numerische Zeitreihendaten in die Zukunft vorhersagen kann. Zusätzlich zu dem einfachen Fall, der im Abschnitt Schnellstart für Prognosen vorgestellt wurde, können Sie Folgendes tun:

  • Für mehrere Serien gleichzeitig vorhersagen Sie können zum Beispiel die Verkäufe mehrerer Artikel für die nächsten zwei Wochen vorhersagen.

  • Trainieren und Vorhersagen anhand von Features Features sind zusätzliche Faktoren, von denen Sie glauben, dass sie die Kennzahl, die Sie prognostizieren möchten, beeinflussen.

  • Bewerten Sie die Präzision Ihres Modells.

  • Verstehen Sie die relative Bedeutung der Merkmale, auf denen das Modell trainiert wurde..

  • Trainingsfehler debuggen

In den folgenden Abschnitten finden Sie Beispiele für diese Szenarios und weitere Details zur Funktionsweise von Prognosen.

Beispiele

In diesem Abschnitt finden Sie Beispiele dafür, wie Sie Ihre Daten für Prognosen einstellen und ein Prognosemodell auf der Grundlage Ihrer Zeitreihendaten erstellen.

Bemerkung

Idealerweise haben die Trainingsdaten für ein Prognosemodell Zeitschritte in gleichmäßigen Abständen (z. B. täglich). Das Modelltraining kann jedoch mit Daten aus der realen Welt umgehen, bei denen Zeitschritte fehlen, doppelt vorhanden sind oder falsch ausgerichtet sind. Weitere Informationen dazu finden Sie unter Der Umgang mit Daten aus der realen in der Zeitreihenprognose.

Beispieldaten einrichten

Im folgenden Beispiel werden zwei Tabellen erstellt. Ansichten zu diesen Tabellen sind unten in den Beispielen zu diesem Thema enthalten.

Die Tabelle sales_data enthält Verkaufsdaten. Jeder Verkauf umfasst eine Filial-ID, einen Bezeichner für den Artikel, einen Zeitstempel und den Verkaufsbetrag. Weitere Spalten, die zusätzliche Features (Temperatur, Luftfeuchtigkeit und Feiertage) enthalten, werden ebenfalls berücksichtigt

Die Tabelle future_features enthält die zukünftigen Werte der Feature-Spalten, die für die Prognoseerstellung mithilfe von Features als Teil Ihres Vorhersageprozesses erforderlich sind.

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

Prognoseerstellung für eine einzelne Zeitreihen

Dieses Beispiel verwendet eine einzelne Zeitreihe (d. h. alle Zeilen sind Teil einer einzigen Zeitreihe), die zwei Spalten hat, eine Zeitstempelspalte und eine Zielwertspalte, ohne zusätzliche Features.

Bereiten Sie zunächst das Beispieldatenset vor, um das Modell zu trainieren:

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

Die SELECT-Anweisung gibt Folgendes zurück:

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

Trainieren Sie nun ein Prognosemodell mit dieser Ansicht:

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

Nachdem das Modell trainiert wurde, wird die folgende Meldung angezeigt:

Instance MODEL1 successfully created.

Als Nächstes verwenden Sie das Prognosemodell, um die nächsten drei Zeitstempel zu prognostizieren:

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

Ausgabe

Beachten Sie, dass das Modell das Intervall zwischen den Zeitstempeln aus den Trainingsdaten abgeleitet hat.

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

In diesem Beispiel ist das Vorhersageintervall (LOWER_BOUND, UPPER_BOUND) gleich dem FORECAST-Wert, da die Prognose eine perfekte lineare Vorhersage ergibt, die im Vergleich zu den tatsächlichen Werten keinen Fehler aufweist.

Um die Größe des Vorhersageintervalls anzupassen, übergeben Sie prediction_interval als Teil eines Konfigurationsobjekts:

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

Um Ihre Ergebnisse direkt in einer Tabelle zu speichern, verwenden Sie CREATE TABLE … AS SELECT … und rufen Sie die Methode FORECAST in der FROM-Klausel auf:

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

Wie im obigen Beispiel gezeigt, lassen Sie beim Aufruf der Methode den Befehl CALL weg. Stattdessen setzen Sie den Aufruf in Klammern, denen das Schlüsselwort TABLE vorangestellt ist.

Prognoseerstellung für mehrere Zeitreihen

Um ein Prognosemodell für mehrere Serien auf einmal zu erstellen, verwenden Sie den Parameter series_colname.

In diesem Beispiel enthalten die Daten die Spalten store_id und item. Um die Verkäufe für jede Kombination aus Filiale und Artikel im Datenset separat zu prognostizieren, können Sie eine neue Spalte erstellen, die diese Werte kombiniert, und diese dann als Zeitreihenspalte angeben.

Die folgende Abfrage erstellt eine neue Ansicht, die store_id und item in einer neuen Spalte mit dem Namen store_item kombiniert:

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

Ausgabe

Die ersten fünf Zeilen für jede Zeitreihe des resultierenden Datensets sind:

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

Verwenden Sie nun die Prognosefunktion, um ein Modell für jede Serie zu trainieren, alles in einem Schritt. Beachten Sie, dass der Parameter series_colname auf store_item festgelegt ist:

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

Als Nächstes verwenden Sie dieses Modell, um die nächsten beiden Zeitpunkte für alle Serien zu prognostizieren:

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

Ausgabe

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

Sie können auch eine bestimmte Serie prognostizieren mit:

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

Ausgabe

Das Ergebnis zeigt nur die nächsten beiden Schritte für den Verkauf von Regenschirmen in Filiale 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          |
+-------------------+-------------------------+-----------+-------------+-------------+

Tipp

Die Angabe einer Zeitreihe mit der Methode FORECAST ist effizienter als das Filtern der Ergebnisse einer Multizeitreihen-Prognose, um nur die Zeitreihen einzuschließen, an der Sie interessiert sind, denn es wird nur die Prognose für eine Zeitreihe erstellt.

Prognosen mit Features

Wenn Sie möchten, dass zusätzliche Features (z. B. Feiertage oder Wetter) die Prognose beeinflussen, müssen Sie diese Features in Ihre Trainingsdaten aufnehmen. Hier erstellen Sie eine Ansicht, die diese Felder aus der Tabelle sales_data enthält:

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

Ausgabe

Dies sind die ersten fünf Zeilen aus dem Ergebnis der SELECT-Abfrage.

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

Jetzt können Sie diese Ansicht verwenden, um ein Modell zu trainieren. Sie müssen nur die Namen der Zeitstempel- und Zielspalten angeben. Zusätzliche Spalten in den Eingabedaten werden als Features für die Verwendung beim Training betrachtet.

CREATE SNOWFLAKE.ML.FORECAST model3(
  INPUT_DATA => TABLE(v2),
  TIMESTAMP_COLNAME => 'date',
  TARGET_COLNAME => 'sales'
);
Copy

Um mit diesem Modell Prognosen zu erstellen, müssen Sie dem Modell Zukunftswerte für die Features zur Verfügung stellen: in diesem Fall TEMPERATURE, HUMIDITY und HOLIDAY. So kann das Modell seine Umsatzprognosen auf der Grundlage von Temperatur-, Luftfeuchtigkeits- und Feiertagsprognosen anpassen.

Erstellen Sie nun eine Ansicht aus der Tabelle future_features, die diese Daten für zukünftige Zeitstempel enthält:

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

Ausgabe

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

Jetzt können Sie mithilfe dieser Daten eine Prognose generieren:

CALL model3!FORECAST(
  INPUT_DATA => TABLE(v2_forecast),
  TIMESTAMP_COLNAME =>'date'
);
Copy

Bei dieser Variante der FORECAST-Methode geben Sie nicht die Anzahl der Zeitstempel an, die vorhergesagt werden sollen. Stattdessen stammen die Zeitstempel der Prognosen aus der Ansicht 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           |
+--------+-------------------------+-----------+--------------+--------------+

Problembehandlung und Bewertung des Modells

Sie können die folgenden Funktionen verwenden, um die Leistung Ihres Modells zu bewerten, zu verstehen, welche Features sich am stärksten auf Ihr Modell auswirken, und um den Trainingsprozess zu debuggen, wenn ein Fehler aufgetreten ist:

Bewertungskennzahlen

Um die Bewertungskennzahlen für Ihr Modell zu erhalten, rufen Sie die Methode <Name_des_Modells>!SHOW_EVALUATION_METRICS auf. Standardmäßig bewertet die Prognosefunktion alle Modelle, die sie trainiert, mit einer Methode Kreuzvalidierung genannten Methode. Das bedeutet, dass die Funktion nicht nur das endgültige Modell auf der Grundlage aller von Ihnen bereitgestellten Trainingsdaten trainiert, sondern auch Modelle basierend auf Teilmengen Ihrer Trainingsdaten trainiert. Diese Modelle werden dann zur Vorhersage Ihrer Zielmetrik auf den zurückgehaltenen Daten verwendet, sodass die Funktion diese Vorhersagen mit den tatsächlichen Werten in Ihren historischen Daten vergleichen kann.

Wenn Sie diese Bewertungskennzahlen nicht benötigen, können Sie evaluate auf FALSE festlegen. Wenn Sie die Art und Weise, wie die Kreuzvalidierung durchgeführt wird, steuern möchten, können Sie die folgenden Parameter verwenden:

  • n_splits: Gibt die Anzahl der Aufteilungen in Ihren Daten für die Kreuzvalidierung an. Der Standardwert ist 1.

  • max_train_size: Stellt die maximale Anzahl von Zeilen für ein einzelnes Trainingsset dar.

  • test_size: Beschränkt die Anzahl der Zeilen, die in jedem Testset enthalten sind.

  • Lücke: Stellt die Lücke zwischen dem Ende jedes Trainingssatzes und dem Beginn des Testsatzes dar.

Ausführliche Informationen zu den Evaluierungsparametern finden Sie unter Konfiguration der Bewertung.

Bemerkung

Kleine Datensets enthalten möglicherweise nicht genügend Daten, um eine Bewertung durchzuführen. Die Gesamtzahl der Trainingszeilen muss gleich oder größer sein als (n_splits * test_size) + gap. Wenn nicht genügend Daten verfügbar sind, um ein Bewertungsmodell zu trainieren, sind keine Bewertungskennzahlen verfügbar, auch wenn evaluate auf TRUE eingestellt ist.

Wenn n_splits 1 ist (der Standardwert), ist die Standardabweichung für die Werte der Bewertungskennzahl NULL, da nur ein Validierungsdatensatz verwendet wird.

Beispiel

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

Ausgabe

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

Bedeutung des Features

Um die relative Bedeutung der in Ihrem Modell verwendeten Features zu verstehen, verwenden Sie die Methode <Name_des_Modells>!EXPLAIN_FEATURE_IMPORTANCE.

Wenn Sie ein Prognosemodell trainieren, verwendet Ihr Modell bereitgestellte Daten, wie z. B. Zeitstempel, Ihre Zielmetrik, zusätzliche Spalten, die Sie bereitstellen (Features), und Features, die automatisch generiert werden, um die Performance Ihrer Prognosen zu verbessern, um Muster in Ihren Daten zu lernen. Durch das Training wird ermittelt, wie wichtig jedes dieser Elemente für eine genaue Vorhersage ist. Der Zweck dieser Funktion ist es, die relative Bedeutung dieser Features auf einer Skala von 0 bis 1 zu verstehen.

Im Hintergrund zählt diese Funktion, wie oft das Modell jedes Feature verwendet hat, um eine Entscheidung zu treffen. Diese Feature Importance-Bewertungen werden dann auf Werte zwischen 0 und 1 normalisiert, sodass sie in der Summe 1 ergeben. Die sich daraus resultierenden Punktzahlen ergeben eine ungefähre Rangliste der Features in Ihrem trainierten Modell.

Wichtige Hinweise zu diesem Feature

  • Features, deren Punktzahlen nahe beieinander liegen, sind ähnlich wichtig.

  • Bei extrem einfachen Zeitreihen (z. B. wenn die Zielspalte einen konstanten Wert hat) können alle Feature Importance-Bewertungen null sein.

  • Die Verwendung mehrerer Features, die einander sehr ähnlich sind, kann dazu führen, dass die Importance-Bewertung dieser Features sinkt. Wenn zum Beispiel zwei Features exakt identisch sind, kann es sein, dass das Modell sie bei der Entscheidungsfindung als austauschbar behandelt. Dies führt zu einer Feature Importance-Bewertung, die nur halb so hoch ist, wie wenn nur eines der identischen Features berücksichtigt würde.

Beispiel

Dieses Beispiel verwendet die Daten aus dem Bewertungsbeispiel und ruft die Methode der Feature-Bedeutung auf. Sie sehen, dass die Variable exog_a, die erstellt wurde, das zweitwichtigste Feature ist - hinter allen gleitenden Durchschnitten, die unter dem Feature aggregated_endogenous_trend_features zusammengefasst sind.

Führen Sie die folgenden Anweisungen aus, um die Bedeutung der Features zu erfahren:

CALL model!EXPLAIN_FEATURE_IMPORTANCE();
Copy

Ausgabe

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

Problembehandlung

Wenn Sie mehrere Zeitreihen mit CONFIG_OBJECT => 'ON_ERROR': 'SKIP' trainieren, können einzelne Zeitreihenmodelle fehlschlagen, ohne dass der gesamte Trainingsprozess fehlschlägt. Um zu verstehen, welche Zeitreihen fehlgeschlagen sind und warum, rufen Sie die Methode <Name_des_Modells>!SHOW_TRAINING_LOGS auf.

Beispiel

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

Ausgabe

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

Management von Modellen

Um eine Liste Ihrer Modelle anzuzeigen, verwenden Sie den Befehl SHOW SNOWFLAKE.ML.FORECAST:

SHOW SNOWFLAKE.ML.FORECAST;
Copy

Um ein Modell zu löschen, verwenden Sie den Befehl DROP SNOWFLAKE.ML.FORECAST:

DROP SNOWFLAKE.ML.FORECAST my_model;
Copy

Modelle sind unveränderlich und können nicht direkt aktualisiert werden. Trainieren Sie stattdessen ein neues Modell.

Warehouse-Auswahl

Ein virtuelles Snowflake-Warehouse stellt die Computeressourcen für Training und Nutzung der Machine Learning-Modelle für dieses Feature zur Verfügung. In diesem Abschnitt finden Sie allgemeine Hinweise zur Auswahl des optimalen Typs und der optimalen Größe des Warehouses für diesen Zweck. Der Schwerpunkt liegt dabei auf dem Trainingsschritt, dem zeit- und speicherintensivsten Teil des Prozesses.

Es gibt zwei Schlüssel, die Sie bei der Auswahl eines Warehouses beachten sollten:

  1. Anzahl der Zeilen und Spalten, die Ihre Daten enthalten

  2. Die Anzahl unterschiedlicher Serien, die Ihre Daten enthalten.

Bei der Auswahl Ihres Warehouses können Sie sich an den folgenden Regeln orientieren:

  1. Wenn Sie auf einer längeren Zeitreihe (> 5 Millionen Zeilen) oder auf vielen Spalten (viele Features) trainieren, sollten Sie ein Upgrade auf Snowpark-optimierte Warehouses in Betracht ziehen.

  2. Wenn Sie viele Serien trainieren, wählen Sie eine größere Größe. Die Prognosefunktion verteilt das Modelltraining auf alle verfügbaren Knoten in Ihrem Warehouse, wenn Sie für mehrere Serien auf einmal trainieren.

Die folgende Tabelle enthält dieselben Hinweise:

Serientyp

< 5 Millionen Zeilen

> 5 Millionen Zeilen und ≤ 100 Millionen Zeilen

> 100 Millionen Zeilen

Eine Serie

Standard-Warehouse; XS

Snowpark-optimiertes Warehouse; XS

Erwägen Sie die Aggregation auf ein weniger häufiges Zeitstempelintervall (z. B. stündlich bis täglich)

Mehrere Serien

Standard-Warehouse; Größe anpassen

Snowpark-optimiertes Warehouse; Größe anpassen

Erwägen Sie, das Training nach Serien in mehrere Jobs zu bündeln

Als grobe Schätzung kann man sagen, dass die Trainingszeit proportional zur Anzahl der Zeilen in Ihrer Zeitreihe ist. Auf einem XS-Standard-Warehouse dauert das Training für einen Datensatz mit 100.000 Zeilen bei ausgeschalteter Auswertung (CONFIG_OBJECT => {'evaluate': False}) beispielsweise etwa 400 Sekunden. Das Training auf einem Datenset mit 1.000.000 Zeilen dauert etwa 850 Sekunden. Wenn die Auswertung aktiviert ist, erhöht sich die Trainingszeit ungefähr linear um die Anzahl der verwendeten Splits.

Details zum Algorithmus

Der Prognosealgorithmus wird von einem Gradient-Boosting-Modul (GBM) unterstützt. Wie ein ARIMA-basiertes Modell verwendet es eine Transformation aus Differenzbildung (Differenzierung), um Daten mit einem nichtstationären Trend zu modellieren, und verwendet autoregressive Lags der historischen Zieldaten als Modellvariablen.

Darüber hinaus verwendet der Algorithmus gleitende Durchschnitte historischer Zieldaten, um Trends vorherzusagen, und erstellt aus den Zeitstempeldaten automatisch zyklische Kalendervariablen (z. B. Wochentag und Woche des Jahres).

Sie können Modelle nur mit historischen Ziel- und Zeitstempeldaten anpassen, oder Sie können Feature (zusätzliche Spalten) einbeziehen, die den Zielwert beeinflusst haben könnten. Die exogenen Variablen können numerisch oder kategorisch sein, und sie können möglicherweise auch NULL sein (Zeilen, die für exogene Variablen NULL-Werte enthalten, werden nicht gelöscht).

Der Algorithmus verlässt sich beim Training auf kategorialen Variablen nicht auf One-Hot-Codierung, sodass Sie kategoriale Daten mit vielen Dimensionen (hohe Kardinalität) verwenden können.

Wenn Ihr Modell Features enthält, müssen Sie bei der Erstellung einer Prognose Werte für diese Features zu Zeitpunkten für den gesamten Prognosehorizont angeben. Geeignete Features könnten Wetterinformationen (Temperatur, Niederschlag), unternehmensspezifische Informationen (historische und geplante Betriebsferien, Werbekampagnen, Veranstaltungstermine) oder andere externe Faktoren sein, von denen Sie glauben, dass sie zur Vorhersage Ihrer Zielvariablen beitragen können.

Der Algorithmus generiert zusätzlich zu den Prognosen auch Vorhersageintervalle. Ein Vorhersageintervall ist ein geschätzter Wertebereich innerhalb einer Ober- und einer Untergrenze, in den ein bestimmter Prozentsatz der Daten wahrscheinlich fallen wird. Ein Wert von 0,95 bedeutet zum Beispiel, dass 95 % der Daten wahrscheinlich innerhalb des Intervalls liegen. Sie können einen Prozentsatz für das Vorhersageintervall angeben oder den Standardwert von 0,95 verwenden. Die untere und obere Grenze des Vorhersageintervalls werden als Teil der Prognoseausgabe zurückgegeben.

Wichtig

Von Zeit zu Zeit wird Snowflake den Algorithmus zur Prognoseerstellung verfeinern. Solche Verbesserungen werden im Rahmen des regulären Snowflake Release-Prozesses eingeführt. Sie können nicht zu einer früheren Version des Features zurückkehren, aber Modelle, die Sie mit einer früheren Version erstellt haben, verwenden diese Version weiterhin für Vorhersagen bis sie durch den Verhaltensänderungen-Release-Prozess als veraltet eingestuft werden.

Aktuelle Einschränkungen

Das aktuelle Release hat die folgenden Einschränkungen:

  • Sie können den Prognosealgorithmus weder auswählen noch anpassen.

  • Die Mindestanzahl von Zeilen für den Prognose-Hauptalgorithmus beträgt 12 pro Zeitreihe. Bei Zeitreihen mit 2 bis 11 Beobachtungen führt die Prognoseerstellung zu einer „naiven“ Prognose, bei der alle prognostizierten Werte gleich dem zuletzt beobachteten Zielwert sind.

  • Die Prognosefunktionen stellen keine Parameter bereit, um Trend, Saisonalität oder saisonale Amplituden zu überschreiben; diese werden aus den Daten abgeleitet.

  • Die minimal akzeptable Granularität der Daten ist eine Sekunde. (Die Zeitstempel dürfen nicht weniger als eine Sekunde auseinanderliegen.)

  • Die Mindestgranularität der saisonalen Komponenten beträgt eine Minute. (Die Funktion kann keine zyklischen Muster bei kleineren Zeitdeltas erkennen.)

  • Die „Saisonlänge“ der autoregressiven Features ist an die Eingabefrequenz gebunden (24 für stündliche Daten, 7 für tägliche Daten usw.).

  • Einmal trainierte Prognosemodelle sind unveränderlich. Sie können bestehende Modelle nicht mit neuen Daten aktualisieren, sondern Sie müssen ein völlig neues Modell trainieren.

  • Modelle unterstützen keine Versionierung. Snowflake empfiehlt, ein Modell in regelmäßigen Abständen neu zu trainieren, z. B. täglich, wöchentlich oder monatlich, je nachdem, wie häufig Sie neue Daten erhalten, damit sich das Modell an veränderte Muster und Trends anpassen kann.

  • Sie können Modelle weder klonen noch über Rollen oder Konten hinweg freigeben. Beim Klonen eines Schemas oder einer Datenbank werden Modellobjekte übersprungen.

  • Sie können Instanzen der FORECAST-Klasse nicht replizieren.

Erteilen von Berechtigungen zum Erstellen von Prognoseobjekten

Das Training eines Prognosemodells führt zu einem Objekt auf Schemaebene. Daher muss die Rolle, mit der Sie Modelle erstellen, über die Berechtigung CREATE SNOWFLAKE.ML.FORECAST für das Schema verfügen, in dem das Modell erstellt wird, damit das Modell dort gespeichert werden kann. Diese Berechtigung ist vergleichbar mit anderen Schemaberechtigungen wie CREATE TABLE oder CREATE VIEW.

Snowflake empfiehlt, eine Rolle mit dem Namen analyst zu erstellen, die von Personen verwendet wird, deren Aufgabe das Erstellen von Prognosen ist.

Im folgenden Beispiel ist die Rolle admin der Eigentümer des Schemas admin_db.admin_schema. Die Rolle analyst muss in der Lage sein, Modelle in diesem Schema zu erstellen.

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

Um dieses Schema verwenden zu können, wird einem Benutzer die Rolle analyst zugewiesen:

USE ROLE analyst;
USE SCHEMA admin_db.admin_schema;
Copy

Wenn die Rolle analyst über die Berechtigung CREATE SCHEMA in der Datenbank analyst_db verfügt, kann die Rolle ein neues Schema analyst_db.analyst_schema erstellen und in diesem Schema Prognosemodelle erstellen:

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

Um einer Rolle die Berechtigung zum Erstellen eines Prognosemodells für das Schema zu entziehen, verwenden Sie REVOKE <Berechtigungen>:

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

Hinweise zu Kosten

Einzelheiten zu den Kosten für die Nutzung der ML-Funktionen finden Sie unter Hinweise zu Kosten in der Übersicht über die ML-Funktionen.