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

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

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

במדריך הזה משתמשים בטבלאות הציבוריות של bigquery-public-data.wikipedia.pageviews_*.

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

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

עלויות

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

  • BigQuery: You incur costs for the data you process in BigQuery.

בעזרת מחשבון העלויות אתם יכולים להעריך את העלויות בהתאם לשימוש הצפוי.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

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

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

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

הכנת הנתונים של פעולות על ציר הזמן

צוברים את נתוני הצפיות בדף של Google I/O בוויקיפדיה לטבלה אחת, בקיבוץ לפי יום:

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית של עורך ה-SQL, מריצים את הצהרת ה-SQL הבאה:

    CREATE OR REPLACE TABLE `bqml_tutorial.googleio_page_views`
    AS
    SELECT
      DATETIME_TRUNC(datehour, DAY) AS date,
      SUM(views) AS views
    FROM
      `bigquery-public-data.wikipedia.pageviews_*`
    WHERE
      datehour >= '2017-01-01'
      AND datehour < '2023-01-01'
      AND title = 'Google_I/O'
    GROUP BY
      DATETIME_TRUNC(datehour, DAY)

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

יוצרים מודל שחוזה את מספר הצפיות היומיות בדף "Google I/O" בוויקיפדיה, על סמך נתוני הצפיות בדף לפני 2022, תוך התחשבות בחגים מובנים:

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית של עורך ה-SQL, מריצים את הצהרת ה-SQL הבאה:

    CREATE OR REPLACE MODEL `bqml_tutorial.forecast_googleio`
      OPTIONS (
        model_type = 'ARIMA_PLUS',
        holiday_region = 'US',
        time_series_timestamp_col = 'date',
        time_series_data_col = 'views',
        data_frequency = 'DAILY',
        horizon = 365)
    AS
    SELECT
      *
    FROM
      `bqml_tutorial.googleio_page_views`
    WHERE
      date < '2022-01-01';

הצגה חזותית של תוצאות התחזית

אחרי שיוצרים את המודל באמצעות החגים המובְנים, מאחדים את הנתונים המקוריים מהטבלה bqml_tutorial.googleio_page_views עם הערך החזוי מהפונקציה ML.EXPLAIN_FORECAST, ואז ממחישים אותם באופן חזותי באמצעות Data Studio:

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית של עורך ה-SQL, מריצים את הצהרת ה-SQL הבאה:

    SELECT
      original.date,
      original.views AS original_views,
      explain_forecast.time_series_adjusted_data
        AS adjusted_views_without_custom_holiday,
    FROM
      `bqml_tutorial.googleio_page_views` original
    INNER JOIN
      (
        SELECT
          *
        FROM
          ML.EXPLAIN_FORECAST(
            MODEL `bqml_tutorial.forecast_googleio`,
            STRUCT(365 AS horizon))
      ) explain_forecast
      ON
        TIMESTAMP(original.date)
        = explain_forecast.time_series_timestamp
    ORDER BY
      original.date;
  3. בחלונית Query results, לוחצים על Open in > Data Studio. ‫Data Studio נפתח בכרטיסייה חדשה.

  4. בכרטיסייה Data Studio, לוחצים על Add a chart ואז על התרשים של סדרת הזמנים:

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

    ממקמים את התרשים בדוח.

  5. בכרטיסייה Setup בחלונית Chart, לוחצים על Add metric ובוחרים באפשרות adjusted_views_without_custom_holiday:

    להוסיף עוד מדד.

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

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

    אפשר לראות שמודל החיזוי מזהה את המגמה הכללית בצורה די טובה. עם זאת, הוא לא מתעד את העלייה בתנועה שקשורה לאירועי Google I/O קודמים, והוא לא יכול ליצור תחזית מדויקת לגבי

    1. בקטעים הבאים מוסבר איך להתמודד עם חלק מהמגבלות האלה.

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

כפי שאפשר לראות בהיסטוריה של Google I/O, אירוע Google I/O התרחש בתאריכים שונים בין 2017 ל-2022. כדי להביא בחשבון את השינוי הזה, יוצרים מודל שחוזה את הצפיות בדף Google_I/O בוויקיפדיה עד 2022, על סמך נתוני הצפיות בדף מלפני 2022, ומשתמשים בחגים בהתאמה אישית כדי לייצג את אירוע Google I/O בכל שנה. במודל הזה, אתם גם מתאימים את חלון ההשפעה של החג כך שיכסה שלושה ימים סביב תאריך האירוע, כדי לתעד טוב יותר את התנועה הפוטנציאלית בדף לפני האירוע ואחריו.

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית של עורך ה-SQL, מריצים את הצהרת ה-SQL הבאה:

    CREATE OR REPLACE MODEL `bqml_tutorial.forecast_googleio_with_custom_holiday`
      OPTIONS (
        model_type = 'ARIMA_PLUS',
        holiday_region = 'US',
        time_series_timestamp_col = 'date',
        time_series_data_col = 'views',
        data_frequency = 'DAILY',
        horizon = 365)
    AS (
      training_data AS (
          SELECT
            *
          FROM
            `bqml_tutorial.googleio_page_views`
          WHERE
            date < '2022-01-01'
        ),
      custom_holiday AS (
          SELECT
            'US' AS region,
            'GoogleIO' AS holiday_name,
            primary_date,
            1 AS preholiday_days,
            2 AS postholiday_days
          FROM
            UNNEST(
              [
                DATE('2017-05-17'),
                DATE('2018-05-08'),
                DATE('2019-05-07'),
                -- cancelled in 2020 due to pandemic
                DATE('2021-05-18'),
                DATE('2022-05-11')])
              AS primary_date
        )
    );

הצגה חזותית של תוצאות התחזית

אחרי שיוצרים את המודל באמצעות חגים בהתאמה אישית, מאחדים את הנתונים המקוריים מהטבלה bqml_tutorial.googleio_page_views עם הערך החזוי מהפונקציה ML.EXPLAIN_FORECAST, ואז ממחישים אותם באופן חזותי באמצעות Data Studio:

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית של עורך ה-SQL, מריצים את הצהרת ה-SQL הבאה:

    SELECT
      original.date,
      original.views AS original_views,
      explain_forecast.time_series_adjusted_data
        AS adjusted_views_with_custom_holiday,
    FROM
      `bqml_tutorial.googleio_page_views` original
    INNER JOIN
      (
        SELECT
          *
        FROM
          ML.EXPLAIN_FORECAST(
            MODEL
              `bqml_tutorial.forecast_googleio_with_custom_holiday`,
            STRUCT(365 AS horizon))
      ) explain_forecast
      ON
        TIMESTAMP(original.date)
        = explain_forecast.time_series_timestamp
    ORDER BY
      original.date;
  3. בחלונית Query results, לוחצים על Explore data ואז על Explore with Data Studio. ‫Data Studio נפתח בכרטיסייה חדשה.

  4. בכרטיסייה Data Studio, לוחצים על Add a chart, לוחצים על תרשים סדרת זמנים וממקמים את התרשים בדוח.

  5. בכרטיסייה Setup בחלונית Chart, לוחצים על Add metric ובוחרים באפשרות adjusted_views_with_custom_holiday.

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

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

    כמו שאפשר לראות, החגים בהתאמה אישית שיפרו את הביצועים של מודל החיזוי. עכשיו הוא מתעד ביעילות את העלייה במספר הצפיות בדפים שנגרמה בעקבות Google I/O.

בדיקת פרטי החג

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

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית של עורך ה-SQL, מריצים את הצהרת ה-SQL הבאה:

    SELECT *
    FROM
      ML.HOLIDAY_INFO(
        MODEL `bqml_tutorial.forecast_googleio_with_custom_holiday`);

    בתוצאות מוצגים גם Google I/O וגם החגים המובנים ברשימת החגים:

    תוצאות מהפונקציה ML.HOLIDAY_INFO.

הערכת ההשפעות של החגים בהתאמה אישית

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

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית של עורך ה-SQL, מריצים את הצהרת ה-SQL הבאה:

    SELECT
      time_series_timestamp,
      holiday_effect_GoogleIO,
      holiday_effect_US_Juneteenth,
      holiday_effect_Christmas,
      holiday_effect_NewYear
    FROM
      ML.EXPLAIN_FORECAST(
        model
          `bqml_tutorial.forecast_googleio_with_custom_holiday`,
        STRUCT(365 AS horizon))
    WHERE holiday_effect != 0;

    התוצאות מראות ש-Google I/O תורם כמות גדולה של השפעת חג לתוצאות החזויות:

    תוצאות מהפונקציה ML.EXPLAIN_FORECAST.

השוואה בין ביצועי המודלים

משתמשים בפונקציה ML.EVALUATE כדי להשוות בין הביצועים של המודל הראשון שנוצר בלי חגים בהתאמה אישית לבין המודל השני שנוצר עם חגים בהתאמה אישית. כדי לראות את הביצועים של המודל השני בחיזוי של אירוע חג עתידי מותאם אישית, מגדירים את טווח התאריכים לשבוע של Google I/O בשנת 2022:

  1. נכנסים לדף BigQuery.

    כניסה ל-BigQuery

  2. בחלונית של עורך ה-SQL, מריצים את הצהרת ה-SQL הבאה:

    SELECT
      "original" AS model_type,
      *
    FROM
      ml.evaluate(
        MODEL `bqml_tutorial.forecast_googleio`,
        (
          SELECT
            *
          FROM
            `bqml_tutorial.googleio_page_views`
          WHERE
            date >= '2022-05-08'
            AND date < '2022-05-12'
        ),
        STRUCT(
          365 AS horizon,
          TRUE AS perform_aggregation))
    UNION ALL
    SELECT
      "with_custom_holiday" AS model_type,
      *
    FROM
      ml.evaluate(
        MODEL
          `bqml_tutorial.forecast_googleio_with_custom_holiday`,
        (
          SELECT
            *
          FROM
            `bqml_tutorial.googleio_page_views`
          WHERE
            date >= '2022-05-08'
            AND date < '2022-05-12'
        ),
        STRUCT(
          365 AS horizon,
          TRUE AS perform_aggregation));

    התוצאות מראות שהמודל השני מציע שיפור משמעותי בביצועים:

    תוצאות מהפונקציה ML.EXPLAIN_FORECAST.

הסרת המשאבים

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

    כניסה לדף Manage resources

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