חיזוי של סדרת זמן אחת באמצעות מודל רב-משתני

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

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

במדריך הזה נעשה שימוש בנתונים ממערך הנתונים שזמין לכולם bigquery-public-data.epa_historical_air_quality. קבוצת הנתונים הזו מכילה מידע על חומר חלקיקי (PM2.5), טמפרטורה ומהירות הרוח שנאסף מדי יום מכמה ערים בארה"ב.

מטרות

במדריך הזה מוסבר איך לבצע את הפעולות הבאות:

עלויות

במדריך הזה משתמשים ברכיבים של 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. ‫BigQuery מופעל באופן אוטומטי בפרויקטים חדשים. כדי להפעיל את BigQuery בפרויקט קיים, עוברים אל

    מפעילים את BigQuery API, אם הוא עדיין לא מופעל.

    התפקידים שנדרשים כדי להפעיל ממשקי API

    כדי להפעיל ממשקי API, צריך את ההרשאה serviceusage.services.enable. אם אתם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, אתם יכולים לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים?

    להפעלת ה-API

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

  • כדי ליצור את קבוצת הנתונים, אתם צריכים את ההרשאה 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.

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

כדי ליצור מערך נתונים ב-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-public-data.epa_historical_air_quality כדי לספק נתוני מזג אוויר יומיים. אתם יוצרים גם את העמודות הבאות כדי להשתמש בהן כמשתני קלט למודל:

  • ‫date: תאריך התצפית
  • ‫pm25 ערך ה-PM2.5 הממוצע לכל יום
  • ‫wind_speed: מהירות הרוח הממוצעת בכל יום
  • ‫temperature: הטמפרטורה המקסימלית בכל יום

בשאילתת GoogleSQL הבאה, הסעיף FROM bigquery-public-data.epa_historical_air_quality.*_daily_summary מציין שאתם שולחים שאילתה לטבלאות *_daily_summary במערך הנתונים epa_historical_air_quality. הטבלאות האלה הן טבלאות מחולקות למחיצות (Partitions).

כדי ליצור את טבלת נתוני הקלט:

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

    כניסה ל-BigQuery

  2. בעורך השאילתות, מדביקים את השאילתה הבאה ולוחצים על Run:

    CREATE TABLE `bqml_tutorial.seattle_air_quality_daily`
    AS
    WITH
      pm25_daily AS (
        SELECT
          avg(arithmetic_mean) AS pm25, date_local AS date
        FROM
          `bigquery-public-data.epa_historical_air_quality.pm25_nonfrm_daily_summary`
        WHERE
          city_name = 'Seattle'
          AND parameter_name = 'Acceptable PM2.5 AQI & Speciation Mass'
        GROUP BY date_local
      ),
      wind_speed_daily AS (
        SELECT
          avg(arithmetic_mean) AS wind_speed, date_local AS date
        FROM
          `bigquery-public-data.epa_historical_air_quality.wind_daily_summary`
        WHERE
          city_name = 'Seattle' AND parameter_name = 'Wind Speed - Resultant'
        GROUP BY date_local
      ),
      temperature_daily AS (
        SELECT
          avg(first_max_value) AS temperature, date_local AS date
        FROM
          `bigquery-public-data.epa_historical_air_quality.temperature_daily_summary`
        WHERE
          city_name = 'Seattle' AND parameter_name = 'Outdoor Temperature'
        GROUP BY date_local
      )
    SELECT
      pm25_daily.date AS date, pm25, wind_speed, temperature
    FROM pm25_daily
    JOIN wind_speed_daily USING (date)
    JOIN temperature_daily USING (date);

המחשה חזותית של נתוני הקלט

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

כדי להציג את נתוני סדרת הזמנים:

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

    כניסה ל-BigQuery

  2. בעורך השאילתות, מדביקים את השאילתה הבאה ולוחצים על Run:

    SELECT
      *
    FROM
      `bqml_tutorial.seattle_air_quality_daily`;
  3. כשהשאילתה מסתיימת, לוחצים על Open in > Data Studio. ‫Data Studio ייפתח בכרטיסייה חדשה. מבצעים את השלבים הבאים בכרטיסייה החדשה.

  4. ב-Looker Studio, לוחצים על Insert > Time series chart.

  5. בחלונית תרשים, בוחרים בכרטיסייה הגדרה.

  6. בקטע Metric, מוסיפים את השדות pm25,‏ temperature ו-wind_speed, ומסירים את מדד ברירת המחדל Record Count. התרשים שנוצר נראה כך:

    תרשים שמציג את מזג האוויר לאורך זמן.

    בתרשים אפשר לראות שלסדרת הזמנים של הקלט יש דפוס עונתי שבועי.

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

יוצרים מודל של סדרת זמנים כדי לחזות ערכים של חומר חלקיקי, כפי שהם מיוצגים בעמודה pm25, באמצעות ערכי העמודות pm25,‏ wind_speed ו-temperature כמשתני קלט. מאמנים את המודל על נתוני איכות האוויר מהטבלה bqml_tutorial.seattle_air_quality_daily, ובוחרים את הנתונים שנאספו בין 1 בינואר 2012 ל-31 בדצמבר 2020.

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

כדי ליצור את המודל:

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

    כניסה ל-BigQuery

  2. בעורך השאילתות, מדביקים את השאילתה הבאה ולוחצים על Run:

    CREATE OR REPLACE
      MODEL
        `bqml_tutorial.seattle_pm25_xreg_model`
      OPTIONS (
        MODEL_TYPE = 'ARIMA_PLUS_XREG',
        time_series_timestamp_col = 'date',  # Identifies the column that contains time points
        time_series_data_col = 'pm25')       # Identifies the column to forecast
    AS
    SELECT
      date,                                  # The column that contains time points
      pm25,                                  # The column to forecast
      temperature,                           # Temperature input to use in forecasting
      wind_speed                             # Wind speed input to use in forecasting
    FROM
      `bqml_tutorial.seattle_air_quality_daily`
    WHERE
      date
      BETWEEN DATE('2012-01-01')
      AND DATE('2020-12-31');

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

הערכת המודלים המועמדים

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

כדי להעריך את המודל:

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

    כניסה ל-BigQuery

  2. בעורך השאילתות, מדביקים את השאילתה הבאה ולוחצים על Run:

    SELECT
     *
    FROM
     ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.seattle_pm25_xreg_model`);

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

    מדדי הערכה למודל של סדרת הזמנים.

    עמודות הפלט non_seasonal_p,‏ non_seasonal_d,‏ non_seasonal_q ו-has_drift מגדירות מודל ARIMA בצינור עיבוד הנתונים לאימון. עמודות הפלט log_likelihood,‏ AIC ו-variance רלוונטיות לתהליך ההתאמה של מודל ARIMA.

    האלגוריתם של auto.ARIMA משתמש בבדיקת KPSS כדי לקבוע את הערך הכי טוב ל-non_seasonal_d, שבמקרה הזה הוא 1. כשהערך של non_seasonal_d הוא 1, האלגוריתם של auto.ARIMA מאמן 42 מודלים שונים של ARIMA במקביל. בדוגמה הזו, כל 42 המודלים המועמדים תקינים, ולכן הפלט מכיל 42 שורות, אחת לכל מודל ARIMA מועמד. במקרים שבהם חלק מהמודלים לא תקינים, הם לא נכללים בפלט. המודלים המועמדים האלה מוחזרים בסדר עולה לפי AIC. למודל בשורה הראשונה יש את ה-AIC הנמוך ביותר, והוא נחשב למודל הטוב ביותר. המודל הטוב ביותר נשמר כמודל הסופי, ומשמש כשמפעילים פונקציות כמו ML.FORECAST במודל.

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

    העמודות has_holiday_effect,‏ has_spikes_and_dips ו-has_step_changes מספקות מידע על נתוני הקלט של סדרת הזמנים, ולא קשורות למודל ARIMA. העמודות האלה מוחזרות כי הערך של האפשרות decompose_time_series בהצהרה CREATE MODEL הוא TRUE. גם בעמודות האלה יש ערכים זהים בכל שורות הפלט.

    בעמודה error_message מוצגות שגיאות שקרו במהלך תהליך ההתאמה של auto.ARIMA. אחת מהסיבות האפשריות לשגיאות היא שהעמודות שנבחרו (non_seasonal_p,‏ non_seasonal_d,‏ non_seasonal_q ו-has_drift) לא יכולות לייצב את הסדרה העתית. כדי לאחזר את הודעת השגיאה של כל המודלים המועמדים, מגדירים את האפשרות show_all_candidate_models ל-TRUE כשיוצרים את המודל.

    למידע נוסף על עמודות הפלט, ראו הפונקציה ML.ARIMA_EVALUATE.

בדיקת המקדמים של המודל

בודקים את המקדמים של מודל סדרת הזמנים באמצעות הפונקציה ML.ARIMA_COEFFICIENTS.

כדי לאחזר את המקדמים של המודל:

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

    כניסה ל-BigQuery

  2. בעורך השאילתות, מדביקים את השאילתה הבאה ולוחצים על Run:

    SELECT
     *
    FROM
     ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.seattle_pm25_xreg_model`);

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

    מקדמים למודל של סדרת הזמנים.

    בעמודת הפלט ar_coefficients מוצגים מקדמי המודל של החלק של הרגרסיה האוטומטית (AR) במודל ARIMA. באופן דומה, בעמודת הפלט ma_coefficients מוצגים מקדמי המודל של החלק של הממוצע הנע (MA) במודל ARIMA. שתי העמודות האלה מכילות ערכי מערך, שהאורכים שלהם שווים ל-non_seasonal_p ול-non_seasonal_q, בהתאמה. בפלט של הפונקציה ML.ARIMA_EVALUATE ראיתם שלמודל הכי טוב יש ערך non_seasonal_p של 0 וערך non_seasonal_q של 5. לכן, בפלט של ML.ARIMA_COEFFICIENTS, הערך של ar_coefficients הוא מערך ריק והערך של ma_coefficients הוא מערך של 5 רכיבים. הערך intercept_or_drift הוא האיבר הקבוע במודל ARIMA.

    עמודות הפלט processed_input,‏ weight ו-category_weights מציגות את המשקלים של כל מאפיין ואת נקודת החיתוך במודל הרגרסיה הלינארית. אם המאפיין הוא מספרי, המשקל מופיע בעמודה weight. אם המאפיין הוא מאפיין קטגורי, הערך של category_weights הוא מערך של ערכי struct, שבו כל ערך struct מכיל את השם והמשקל של קטגוריה נתונה.

    למידע נוסף על עמודות הפלט, ראו הפונקציה ML.ARIMA_COEFFICIENTS.

שימוש במודל לחיזוי נתונים

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

בשאילתת GoogleSQL הבאה, הסעיף STRUCT(30 AS horizon, 0.8 AS confidence_level) מציין שהשאילתה חוזה 30 נקודות זמן עתידיות, ויוצרת מרווח חיזוי עם רמת סמך של 80%.

כדי לחזות נתונים באמצעות המודל, פועלים לפי השלבים הבאים:

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

    כניסה ל-BigQuery

  2. בעורך השאילתות, מדביקים את השאילתה הבאה ולוחצים על Run:

    SELECT
      *
    FROM
      ML.FORECAST(
        MODEL `bqml_tutorial.seattle_pm25_xreg_model`,
        STRUCT(30 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            date,
            temperature,
            wind_speed
          FROM
            `bqml_tutorial.seattle_air_quality_daily`
          WHERE
            date > DATE('2020-12-31')
        ));

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

    תוצאות חזויות ממודל סדרת הזמן.

    שורות הפלט מסודרות בסדר כרונולוגי לפי הערך בעמודה forecast_timestamp. בחיזוי של סדרת זמנים, מרווח החיזוי, שמיוצג על ידי ערכי העמודות prediction_interval_lower_bound ו-prediction_interval_upper_bound, חשוב כמו ערך העמודה forecast_value. הערך forecast_value הוא נקודת האמצע של מרווח החיזוי. מרווח החיזוי תלוי בערכים של העמודות standard_error ו-confidence_level.

    למידע נוסף על עמודות הפלט, ראו הפונקציה ML.FORECAST.

הערכת הדיוק של התחזיות

מעריכים את דיוק החיזוי של המודל באמצעות הפונקציה ML.EVALUATE.

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

כדי להעריך את רמת הדיוק של המודל:

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

    כניסה ל-BigQuery

  2. בעורך השאילתות, מדביקים את השאילתה הבאה ולוחצים על Run:

    SELECT
      *
    FROM
      ML.EVALUATE(
        MODEL `bqml_tutorial.seattle_pm25_xreg_model`,
        (
          SELECT
            date,
            pm25,
            temperature,
            wind_speed
          FROM
            `bqml_tutorial.seattle_air_quality_daily`
          WHERE
            date > DATE('2020-12-31')
        ),
        STRUCT(
          TRUE AS perform_aggregation,
          30 AS horizon));

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

    מדדי הערכה של המודל.

    למידע נוסף על עמודות הפלט, ראו הפונקציה ML.EVALUATE.

הסבר על תוצאות התחזית

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

בדומה לפונקציה ML.FORECAST, הסעיף STRUCT(30 AS horizon, 0.8 AS confidence_level) שמשמש בפונקציה ML.EXPLAIN_FORECAST מציין שהשאילתה חוזה 30 נקודות זמן עתידיות ויוצרת רווח בר-סמך של 80% לחיזוי.

כדי להסביר את תוצאות המודל:

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

    כניסה ל-BigQuery

  2. בעורך השאילתות, מדביקים את השאילתה הבאה ולוחצים על Run:

    SELECT
      *
    FROM
      ML.EXPLAIN_FORECAST(
        MODEL `bqml_tutorial.seattle_pm25_xreg_model`,
        STRUCT(30 AS horizon, 0.8 AS confidence_level),
        (
          SELECT
            date,
            temperature,
            wind_speed
          FROM
            `bqml_tutorial.seattle_air_quality_daily`
          WHERE
            date > DATE('2020-12-31')
        ));

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

    תשע עמודות הפלט הראשונות של נתוני התחזית והסברי התחזית. עמודות הפלט העשירית עד השבע עשרה של נתוני התחזית וההסברים לתחזית. שש עמודות הפלט האחרונות של נתוני התחזית וההסברים לתחזית.

    שורות הפלט מסודרות בסדר כרונולוגי לפי הערך בעמודה time_series_timestamp.

    למידע נוסף על עמודות הפלט, ראו הפונקציה ML.EXPLAIN_FORECAST.

הסרת המשאבים

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

  • אתם יכולים למחוק את הפרויקט שיצרתם.
  • אפשר גם להשאיר את הפרויקט ולמחוק את מערך הנתונים.

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

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

  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.

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