הגבלת ערכי התחזית במודל ARIMA_PLUS של סדרת זמנים

במדריך הזה נסביר איך להשתמש במגבלות כדי לצמצם את תוצאות החיזוי שמוחזרות על ידי מודל סדרת הזמנים של ARIMA_PLUS. במדריך הזה תיצרו שני מודלים של סדרות זמנים על אותם נתונים, מודל אחד שמשתמש במגבלות ומודל אחד שלא משתמש במגבלות. כך תוכלו להשוות בין התוצאות שהמודלים מחזירים ולהבין את ההבדל שנוצר כשמציינים מגבלות.

במדריך הזה תשתמשו בנתונים של new_york.citibike_trips כדי לאמן את המודלים. קבוצת הנתונים הזו מכילה מידע על נסיעות ב-Citi Bike בניו יורק.

לפני שתתחילו את המדריך הזה, כדאי שתכירו את הנושא של חיזוי סדרת זמנים אחת. כדי לקבל מבוא לנושא, השלימו את המדריך חיזוי של סדרת זמנים אחת מנתוני Google Analytics.

ההרשאות הנדרשות

  • כדי ליצור את קבוצת הנתונים, אתם צריכים את ההרשאה bigquery.datasets.create ב-IAM.

  • כדי ליצור את המודל, צריך את ההרשאות הבאות:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • כדי להריץ הסקה, צריך את ההרשאות הבאות:

    • bigquery.models.getData
    • bigquery.jobs.create

במאמר מבוא ל-IAM תוכלו לקרוא מידע נוסף על התפקידים וההרשאות של IAM ב-BigQuery.

מטרות

במדריך הזה תשתמשו בכלים הבאים:

  • ההצהרה CREATE MODEL: כדי ליצור מודל של סדרת זמן.
  • הפונקציה ML.FORECAST: כדי לחזות את מספר הביקורים הכולל ביום.

עלויות

במדריך הזה משתמשים ברכיבים של Google Cloudשהשימוש בהם כרוך בתשלום, כולל:

  • BigQuery
  • BigQuery ML

למידע נוסף על העלויות של BigQuery, קראו את הדף תמחור ב-BigQuery.

כאן תוכלו לקרוא מידע נוסף על העלויות של BigQuery ML.

לפני שמתחילים

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery API, if it is not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

יצירת קבוצת נתונים

כדי ליצור מערך נתונים ב-BigQuery, בוחרים אחת מהאפשרויות הבאות:

המסוף

  1. נכנסים לדף BigQuery במסוף Google Cloud .

    כניסה ל-BigQuery

  2. בחלונית הימנית, לוחצים על Explorer:

    כפתור מודגש לחלונית Explorer.

    אם החלונית הימנית לא מוצגת, לוחצים על Expand left pane כדי לפתוח אותה.

  3. ב-Explorer, מרחיבים את הפרויקט ולוחצים על Datasets.

  4. בדף Datasets, לוחצים על Create dataset.

  5. בחלונית Create dataset:

    • בשדה Dataset ID, מזינים bqml_tutorial.

    • בקטע Data location (מיקום הנתונים), בוחרים באפשרות US (ארה"ב).

    משאירים את שאר הגדרות ברירת המחדל כמו שהן.

  6. לוחצים על Create dataset.

BQ

כדי ליצור קבוצת נתונים חדשה, משתמשים בפקודה bq mk --dataset.

  1. יוצרים מערך נתונים בשם bqml_tutorial ומגדירים את מיקום הנתונים ל-US:

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. מוודאים שמערך הנתונים נוצר:

    bq ls

API

מפעילים את השיטה datasets.insert עם משאב של מערך נתונים מוגדר:

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrames

לפני שתנסו את הדוגמה הזו, פעלו לפי הוראות ההגדרה של BigQuery DataFrames שמפורטות במאמר התחלה מהירה ב-BigQuery באמצעות BigQuery DataFrames. מידע נוסף זמין במאמרי העזרה של BigQuery DataFrames.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת ADC לסביבת פיתוח מקומית.

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

הצגה חזותית של סדרת הזמנים שרוצים לחזות

לפני שיוצרים את המודל, כדאי לבדוק איך נראית סדרת הזמנים של הקלט.

SQL

בשאילתה הבאה, הסעיף FROM bigquery-public-data.new_york.citibike_trips מציין שאתם שולחים שאילתה לטבלה citibike_trips במערך הנתונים new_york.

בהצהרה SELECT, השאילתה משתמשת בפונקציה EXTRACT כדי לחלץ את פרטי התאריך מהעמודה starttime. השאילתה משתמשת בסעיף COUNT(*) כדי לקבל את המספר הכולל של נסיעות Citi Bike ביום.

#standardSQL
SELECT
  EXTRACT(DATE from starttime) AS date,
  COUNT(*) AS num_trips
FROM
`bigquery-public-data`.new_york.citibike_trips
GROUP BY date

כדי להריץ את השאילתה:

  1. במסוף Google Cloud , לוחצים על הלחצן Compose new query.

  2. מזינים את שאילתת GoogleSQL הבאה בעורך השאילתות.

    #standardSQL
    SELECT
     EXTRACT(DATE from starttime) AS date,
     COUNT(*) AS num_trips
    FROM
     `bigquery-public-data`.new_york.citibike_trips
    GROUP BY date
  3. לוחצים על Run. תוצאות השאילתה דומות לתוצאות הבאות.

    פלט השאילתה.

  4. משתמשים במסוף Google Cloud כדי ליצור תרשים של נתוני סדרת הזמנים. בחלונית Query results, לוחצים על הכרטיסייה Visualization. בחלונית Visualization configuration, בוחרים באפשרות Bar בשדה Visualization type:

    Result_visualization.

BigQuery DataFrames

לפני שתנסו את הדוגמה הזו, פעלו לפי הוראות ההגדרה של BigQuery DataFrames שמפורטות במאמר התחלה מהירה ב-BigQuery באמצעות BigQuery DataFrames. מידע נוסף זמין במאמרי העזרה של BigQuery DataFrames.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת ADC לסביבת פיתוח מקומית.

בדוגמה הבאה, bigquery-public-data.new_york.citibike_trips מציין שאתם שולחים שאילתה לטבלה citibike_trips במערך הנתונים new_york.

import bigframes.pandas as bpd

df = bpd.read_gbq("bigquery-public-data.new_york.citibike_trips")

features = bpd.DataFrame(
    {
        "num_trips": df.starttime,
        "date": df["starttime"].dt.date,
    }
)
num_trips = features.groupby(["date"]).count()

num_trips.plot.line()

התוצאה אמורה להיראות כך: Result_visualization

יצירת מודל של סדרת זמנים

יצירת מודל של סדרת זמנים באמצעות נתוני הנסיעות של NYC Citi Bike.

שאילתת GoogleSQL הבאה יוצרת מודל שחוזה את המספר הכולל של נסיעות יומיות באופניים. ההצהרה CREATE MODEL יוצרת ומאמנת מודל בשם bqml_tutorial.nyc_citibike_arima_model.

#standardSQL
CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model
  OPTIONS (
    model_type = 'ARIMA_PLUS',
    time_series_timestamp_col = 'date',
    time_series_data_col = 'num_trips',
    time_series_id_col = 'start_station_id')
AS
SELECT
  EXTRACT(DATE FROM starttime) AS date,
  COUNT(*) AS num_trips,
  start_station_id
FROM
  `bigquery-public-data`.new_york.citibike_trips
WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
GROUP BY date, start_station_id;

הסעיף OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) מציין שאתם יוצרים מודל של סדרת זמנים שמבוסס על ARIMA. כברירת מחדל, auto_arima=TRUE, כך שהאלגוריתם של auto.ARIMA מכוונן באופן אוטומטי את ההיפר-פרמטרים במודלים של ARIMA_PLUS. האלגוריתם מתאים עשרות מודלים מועמדים ובוחר את המודל הטוב ביותר עם קריטריון המידע של אקאיקה (AIC) הנמוך ביותר. בנוסף, מכיוון שערך ברירת המחדל הוא data_frequency='AUTO_FREQUENCY', תהליך האימון מסיק באופן אוטומטי את תדירות הנתונים של סדרת הזמן של הקלט. ההצהרה CREATE MODEL משתמשת ב-decompose_time_series=TRUE כברירת מחדל, כך שגם החלקים של ההיסטוריה וגם החלקים של התחזית של סדרת הזמנים נשמרים במודל. הגדרת הפרמטר time_series_id_col = 'start_station_id' גורמת למודל להתאים ולחזות כמה סדרות זמנים באמצעות שאילתה אחת שמבוססת על start_station_id. אתם יכולים להשתמש במידע הזה כדי להבין טוב יותר איך מתבצעת התחזית של סדרת הזמן, על ידי אחזור הרכיבים הנפרדים של סדרת הזמן, כמו תקופות עונתיות.

מריצים את השאילתה CREATE MODEL כדי ליצור ולאמן את המודל:

  1. במסוף Google Cloud , לוחצים על הלחצן Compose new query.

  2. מזינים את שאילתת GoogleSQL הבאה בעורך השאילתות.

    #standardSQL
    CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model
    OPTIONS (
      model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_id')
    AS
    SELECT
    EXTRACT(DATE FROM starttime) AS date,
    COUNT(*) AS num_trips,
    start_station_id
    FROM
    `bigquery-public-data`.new_york.citibike_trips
    WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
    GROUP BY date, start_station_id;
  3. לוחצים על Run.

    השאילתה מסתיימת תוך כ-80 שניות, ואז אפשר לגשת למודל (nyc_citibike_arima_model). בגלל שהשאילתה משתמשת בהצהרת CREATE MODEL כדי ליצור מודל, אין תוצאות לשאילתה.

חיזוי סדרת הזמנים והצגת התוצאות באופן חזותי

כדי להסביר איך מתבצעת התחזית של סדרת הזמנים, אפשר להציג באופן חזותי את כל הרכיבים של סדרת הזמנים המשנית, כמו עונתיות ומגמה, באמצעות הפונקציה ML.FORECAST.

לשם כך, בצע את הצעדים הבאים:

  1. במסוף Google Cloud , לוחצים על הלחצן Compose new query.

  2. מזינים את שאילתת GoogleSQL הבאה בעורך השאילתות.

    #standardSQL
    SELECT
    forecast_timestamp AS forecast_timestamp,
    start_station_id AS start_station_id,
    history_value AS history_value,
    forecast_value AS forecast_value
    FROM
    (
      (
         SELECT
         DATE(forecast_timestamp) AS forecast_timestamp,
         NULL AS history_value,
         forecast_value AS forecast_value,
         start_station_id AS start_station_id,
         FROM
         ML.FORECAST(
            MODEL bqml_tutorial.`nyc_citibike_arima_model`,
            STRUCT(
               365 AS horizon,
               0.9 AS confidence_level))
      )
      UNION ALL
      (
         SELECT
         DATE(date_name) AS forecast_timestamp,
         num_trips AS history_value,
         NULL AS forecast_value,
         start_station_id AS start_station_id,
         FROM
         (
            SELECT
               EXTRACT(DATE FROM starttime) AS date_name,
               COUNT(*) AS num_trips,
               start_station_id AS start_station_id
            FROM
               `bigquery-public-data`.new_york.citibike_trips
            WHERE
               starttime > '2014-07-11'
               AND starttime < '2015-02-11'
            GROUP BY
               date_name, start_station_id
         )
      )
    )
    WHERE start_station_id = 79
    ORDER BY
    forecast_timestamp, start_station_id
  3. לוחצים על Run. תוצאות השאילתה דומות לתוצאות הבאות:

    BQUI_chart.

  4. משתמשים במסוף Google Cloud כדי ליצור תרשים של נתוני סדרת הזמנים. בחלונית Query results, לוחצים על הכרטיסייה Visualization:

    Result_visualization.

בתרשים אפשר לראות שהערכים החזויים של המספר הכולל של נסיעות Citi Bike ביום שבהן start_station_id=79 הם מספרים שליליים, וזה לא שימושי. שימוש במודל עם מגבלות משפר את הנתונים החזויים.

יצירת מודל של סדרת זמנים עם מגבלות

יצירת מודל של סדרת זמנים עם מגבלות, באמצעות נתוני הנסיעות של NYC Citi Bike.

שאילתת GoogleSQL הבאה יוצרת מודל שחוזה את המספר הכולל של נסיעות יומיות באופניים. ההצהרה CREATE MODEL יוצרת ומאמנת מודל בשם bqml_tutorial.nyc_citibike_arima_model_with_limits. ההבדל העיקרי בין המודל הזה לבין המודל שיצרתם קודם הוא הוספת האפשרות forecast_limit_lower_bound=0. האפשרות הזו גורמת למודל לחזות רק ערכים שגדולים מ-0, על סמך הערכים בעמודה שצוינה בארגומנט time_series_data_col, במקרה הזה num_trips.

#standardSQL
CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model
   OPTIONS (
      model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_id',
      forecast_limit_lower_bound = 0)
   AS
   SELECT
   EXTRACT(DATE FROM starttime) AS date,
   COUNT(*) AS num_trips,
   start_station_id
   FROM
   `bigquery-public-data`.new_york.citibike_trips
   WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
   GROUP BY date, start_station_id;

מריצים את השאילתה CREATE MODEL כדי ליצור ולאמן את המודל:

  1. במסוף Google Cloud , לוחצים על הלחצן Compose new query.

  2. מזינים את שאילתת GoogleSQL הבאה בעורך השאילתות.

    #standardSQL
    CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model
    OPTIONS (
      model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_id',
      forecast_limit_lower_bound = 0)
    AS
    SELECT
    EXTRACT(DATE FROM starttime) AS date,
    COUNT(*) AS num_trips,
    start_station_id
    FROM
    `bigquery-public-data`.new_york.citibike_trips
    WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
    GROUP BY date, start_station_id;
  3. לוחצים על Run.

    השאילתה מסתיימת תוך כ-100 שניות, ואז אפשר לגשת למודל (nyc_citibike_arima_model_with_limits). מכיוון שהשאילתה משתמשת בהצהרת CREATE MODEL כדי ליצור מודל, אין תוצאות לשאילתה.

חיזוי סדרת הזמנים באמצעות המודל עם המגבלות

  1. במסוף Google Cloud , לוחצים על הלחצן Compose new query.

  2. מזינים את שאילתת GoogleSQL הבאה בעורך השאילתות.

    #standardSQL
    SELECT
    forecast_timestamp AS forecast_timestamp,
    start_station_id AS start_station_id,
    history_value AS history_value,
    forecast_value AS forecast_value
    FROM
    (
      (
         SELECT
         DATE(forecast_timestamp) AS forecast_timestamp,
         NULL AS history_value,
         forecast_value AS forecast_value,
         start_station_id AS start_station_id,
         FROM
         ML.FORECAST(
            MODEL bqml_tutorial.`nyc_citibike_arima_model`,
            STRUCT(
               365 AS horizon,
               0.9 AS confidence_level))
      )
      UNION ALL
      (
         SELECT
         DATE(date_name) AS forecast_timestamp,
         num_trips AS history_value,
         NULL AS forecast_value,
         start_station_id AS start_station_id,
         FROM
         (
            SELECT
               EXTRACT(DATE FROM starttime) AS date_name,
               COUNT(*) AS num_trips,
               start_station_id AS start_station_id
            FROM
               `bigquery-public-data`.new_york.citibike_trips
            WHERE
               starttime > '2014-07-11'
               AND starttime < '2015-02-11'
            GROUP BY
               date_name, start_station_id
         )
      )
    )
    WHERE start_station_id = 79
    ORDER BY forecast_timestamp, start_station_id
  3. לוחצים על Run.

    BQUI_chart.

  4. משתמשים במסוף Google Cloud כדי ליצור תרשים של נתוני סדרת הזמנים. בחלונית Query results, לוחצים על הכרטיסייה Visualization:

    Result_visualization.

מודל ARIMA PLUS מזהה שהמספר הכולל של נסיעות יומיות ב-Citi Bike שבהן start_station_id=79 הולך ופוחת. ערכי החיזוי העתידיים יתאימו למגמה הזו, וככל שמתקדמים בזמן, ערכי החיזוי יהיו קטנים יותר באופן יחסי. בתרשים מוצגים ערכי החיזוי של המספר הכולל של נסיעות Citi Bike ביום שבהן start_station_id=79 הם מספרים חיוביים, וזה שימושי יותר. המודל עם המגבלות מזהה שהמספר הכולל של נסיעות Citi Bike ביום שבהן start_station_id=79 הולך ופוחת, אבל הוא עדיין נותן ערכי חיזוי משמעותיים.

כפי שמוצג במדריך הזה, האפשרויות forecast_limit_lower_bound ו-forecast_limit_upper_bound יכולות לעזור לכם לקבל ערכי חיזוי משמעותיים יותר בתרחישים דומים לזה שמוצג כאן, כמו חיזוי מחירי מניות או נתוני מכירות עתידיים.

מחיקת מערך הנתונים

מחיקת הפרויקט תסיר את כל מערכי הנתונים ואת כל הטבלאות בפרויקט. אם אתם מעדיפים להשתמש שוב בפרויקט, אתם יכולים למחוק את קבוצת הנתונים שיצרתם במדריך הזה:

  1. אם צריך, פותחים את הדף של BigQuery במסוףGoogle Cloud .

    כניסה לדף BigQuery

  2. בניווט, לוחצים על מערך הנתונים bqml_tutorial שיצרתם.

  3. לוחצים על מחיקת מערך הנתונים בצד שמאל של החלון. הפעולה הזו מוחקת את מערך הנתונים, את הטבלה ואת כל הנתונים.

  4. בתיבת הדו-שיח Delete dataset, מאשרים את פקודת המחיקה על ידי הקלדת שם מערך הנתונים (bqml_tutorial) ולוחצים על Delete.

מחיקת הפרויקט

כדי למחוק את הפרויקט:

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

המאמרים הבאים