תחזיות של סדרת זמנים באמצעות Vertex AI ו-BigQuery ML

1. סקירה כללית

בשיעור ה-Lab הזה תלמדו איך ליצור מודל לחיזוי סדרות עיתיות באמצעות TensorFlow, ואז תלמדו איך לפרוס את המודלים האלה באמצעות Vertex AI.

מה תלמדו

במאמר הזה נסביר איך:

  • ביצוע טרנספורמציה של נתונים כדי שאפשר יהיה להשתמש בהם במודל ML
  • הצגה חזותית של נתונים ועיון בהם
  • שימוש ב-BigQuery ML ליצירת מודל לחיזוי סדרות זמן
  • פיתוח מודל לחיזוי סדרות זמן באמצעות TensorFlow עם ארכיטקטורות LSTM ו-CNN

2. מבוא לחיזוי סדרות עיתיות

ה-Codelab הזה מתמקד ביישום של טכניקות לחיזוי סדרות עיתיות באמצעות Google Cloud Platform. זה לא קורס כללי בנושא חיזוי סדרות עיתיות, אבל סקירה קצרה של המושגים עשויה לעזור למשתמשים שלנו.

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

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

85af6a1ff05c69f2.png

רכיבים

אפשר לפרק סדרת זמן לרכיבים:

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

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

6e8d45bbbbc388ec.png

סטציונריות

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

לדוגמה, בתרשים הבא של ריכוז CO2 אפשר לראות דפוס שנתי חוזר עם מגמת עלייה. ( מקור)

ab82857e2e7d0b89.png

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

c936381ab1095528.png

שימוש בנתוני סדרות זמן ללמידת מכונה

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

d667a941dbd470f5.png

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

3. הגדרת סביבת Notebook

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

שלב 1: הפעלת ממשקי API

המחבר של BigQuery משתמש ב-BigQuery Storage API. מחפשים את BigQuery Storage API במסוף ומפעילים את ה-API אם הוא מושבת.

9895a2fd3cdf8f8c.png

שלב 2: יצירת notebook ב-Vertex AI Workbench

עוברים אל Vertex AI Workbench section במסוף Cloud ולוחצים על New Notebook. לאחר מכן בוחרים את סוג ה-notebook האחרון של TensorFlow Enterprise 2.x without GPUs:

4e7b73eabf2bc061.png

משתמשים באפשרויות ברירת המחדל ולוחצים על יצירה. אחרי שהמופע נוצר, בוחרים באפשרות Open JupyterLab:

18c9f3c462aafaee.png

לאחר מכן, יוצרים קובץ notebook של Python 3 מ-JupyterLab:

58523671a252b95a.png

שלב 3: הורדת חומרי המעבדה

כדי ליצור חלון Terminal חדש מממשק JupyterLab: לוחצים על File (קובץ) -> New (חדש) -> Terminal (טרמינל).

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

git clone https://github.com/GoogleCloudPlatform/training-data-analyst

4. ניתוח והמחשה של נתונים

בקטע הזה תלמדו:

  • יצירת שאילתה שמקבצת נתונים לסדרת זמן
  • מילוי ערכים חסרים
  • המחשת נתונים
  • פירוק של סדרות עיתיות לרכיבי מגמה ועונתיות

שלב 1

ב-Vertex AI Workbench, מנווטים אל training-data-analyst/courses/ai-for-time-series/notebooks ופותחים את 01-explore.ipynb.

שלב 2

מנקים את כל התאים ב-notebook (Edit > Clear All Outputs), משנים את ההגדרות של האזור, הפרויקט והמאגר באחד מהתאים הראשונים, ואז מריצים את התאים אחד אחרי השני.

שלב 3

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

55839e7bc0427915.png

5. יצירת מודל באמצעות תחזית של סדרת זמנים ב-BigQuery

בקטע הזה תלמדו:

  • ייבוא נתוני סדרות זמן לטבלה ב-BigQuery
  • יצירת מודל של סדרת זמנים באמצעות תחביר BQML
  • איך מעריכים את פרמטרים המודל ואת רמת הדיוק שלו
  • חיזוי באמצעות המודל

שלב 1

ניצור טבלה ב-BigQuery עם הנתונים הגולמיים מקובץ ה-CSV שבדקנו. נתחיל בהורדה של קובץ ה-CSV מסביבת ה-notebook.

בספרייה training-data-analyst/courses/ai-for-time-series/notebooks/data, לוחצים לחיצה ימנית על cta_ridership.csv ובוחרים באפשרות הורדה כדי להוריד אותו לסביבה המקומית.

שלב 2

בשלב הבא, נטען את הנתונים האלה לטבלה ב-BigQuery.

עוברים אל BigQuery במסוף (אפשר לחפש או להשתמש בקישור הזה):

649e7ab1c44b75e8.png

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

281b97020cd52f29.png

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

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

ad47810d44cfb289.png

באפשרויות ליצירת טבלה, בוחרים:

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

213e4177e9e79544.png

שלב 3

עכשיו הגיע הזמן ליצור את המודל שלנו. ‫BigQuery ML מספק תחביר פשוט שדומה ל-SQL, ומאפשר ליצור מגוון רחב של סוגי מודלים.

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

CREATE OR REPLACE MODEL
  `demo.cta_ridership_model` OPTIONS(MODEL_TYPE='ARIMA',
    TIME_SERIES_TIMESTAMP_COL='service_date',
    TIME_SERIES_DATA_COL='total_rides',
    HOLIDAY_REGION='us') AS
SELECT
  service_date, total_rides
FROM
  `demo.cta_ridership`

כדי להבין את התחביר, נסביר את הרכיבים העיקריים שלו:

CREATE OR REPLACE MODEL
demo.cta_ridership_model

ההצהרה הזו יוצרת את המודל. יש וריאציות של ההצהרה הזו, למשל CREATE MODEL, אבל בחרנו להחליף כאן מודל קיים עם אותו שם.

OPTIONS(MODEL_TYPE=‘ARIMA' ... )

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

TIME_SERIES_TIMESTAMP_COL=‘service_date'

העמודה עם פרטי התאריך והשעה

TIME_SERIES_DATA_COL=‘total_rides'

עמודת הנתונים

HOLIDAY_REGION=‘us'

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

AS SELECT ... FROM ...

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

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

שלב 4

בואו נלמד עוד על המודל שלנו. אחרי שהאימון יסתיים, נריץ שאילתה נוספת, ונחליף את הדמו אם צריך:

SELECT
  *
FROM
  ML.EVALUATE(MODEL `demo.cta_ridership_model`)

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

תוכלו לראות את הפרמטרים p,‏ d ו-q של מודל ARIMA, וגם את העונתיות שהתגלתה במודל. במקרה הזה, המודל העליון כולל גם עונתיות שבועית וגם עונתיות שנתית.

5b5b1e129c70a340.png

שלב 5

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

מדביקים או מקלידים את הטקסט הבא (מחליפים את demo אם צריך):

SELECT
  *
FROM
  ML.FORECAST(MODEL `demo.cta_ridership_model`,
    STRUCT(7 AS horizon))

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

b8a7f22657dc2d27.png

עבודה מצוינת: יצרנו מודל של סדרת זמן באמצעות כמה שאילתות BQML בלבד.

6. יצירת מודל חיזוי בהתאמה אישית

בקטע הזה תלמדו:

  • הסרת ערכים חריגים מהנתונים
  • ביצוע חיזוי עם מספר שלבים
  • הכללת תכונות נוספות במודל של סדרת זמן
  • מידע על ארכיטקטורות של רשתות נוירונים מלאכותיות לחיזוי סדרות עיתיות: LSTM ו-CNN
  • מידע על מודלים סטטיסטיים, כולל Holt-Winters Exponential Smoothing
  • מודלים של Ensemble

שלב 1

ב-Vertex AI Workbench, מנווטים אל training-data-analyst/courses/ai-for-time-series/notebooks ופותחים את 02-model.ipynb.

שלב 2

מנקים את כל התאים ב-notebook (Edit > Clear All Outputs), משנים את ההגדרות של האזור, הפרויקט והמאגר באחד מהתאים הראשונים, ואז מריצים את התאים אחד אחרי השני.

שלב 3

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

a528df58f4e6d372.png

7. אימון וחיזוי בענן

בקטע הזה תלמדו:

  • הכנת נתונים ומודלים לאימון בענן
  • אימון המודל ומעקב אחרי התקדמות העבודה באמצעות AI Platform Training
  • חיזוי באמצעות המודל עם AI Platform Predictions

שלב 1

ב-Vertex AI Workbench, מנווטים אל training-data-analyst/courses/ai-for-time-series/notebooks ופותחים את 03-cloud-training.ipynb.

שלב 2

מנקים את כל התאים ב-notebook (Edit > Clear All Outputs), משנים את ההגדרות של האזור, הפרויקט והמאגר באחד מהתאים הראשונים, ואז מריצים את התאים אחד אחרי השני.

שלב 3

בקטע הקודם, אימנו מודל וביצענו איתו חיזוי, והכול בתוך מחברת Workbench. בקטע הזה הדגמנו איך להשתמש ב-Python SDK for Vertex AI מתוך ה-notebook כדי להשתמש בשירותי Vertex AI לאימון ולפריסה.

a3f6b5dc895a24fb.png

8. האתגר

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

לא נספק הוראות מפורטות, רק כמה רמזים (אם תרצו!).

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

שלב 1

נתחיל בהסבר על מערך הנתונים.

קודם כל, ניגשים לקבוצת הנתונים City of New York 311 Service Requests.

כדי להכיר טוב יותר את הנתונים, כדאי לנסות כמה מהשאילתות לדוגמה שמופיעות בתיאור של מערך הנתונים:

  • מה מספר הבקשות למוקד 311 שקשורות למשאיות גלידה?
  • באילו ימים מתקבלות הכי הרבה בקשות למוקד 311 שקשורות למסיבות?

בממשק המשתמש של BigQuery, בוחרים באפשרות יצירת שאילתה כדי לראות איך לגשת למערך הנתונים. שימו לב שהשאילתה של הצהרת הבחירה היא מ-bigquery-public-data.new_york_311.311_service_requests.

שלב 2

הכול מוכן. בקטע הזה, מבצעים שינויים במחברת Explore and Visualize כדי לעבוד עם הנתונים האלה.

רמזים

  • משכפלים את מחברת 01-explore.ipynb ומתחילים לעבוד ממנה.
  • כדי לנתח את הנתונים, אפשר לנסות את השאילתה הזו:
from google.cloud import bigquery as bq

sql = """
SELECT * FROM `bigquery-public-data.new_york_311.311_service_requests` LIMIT 5
"""

client = bq.Client(project=PROJECT)
df = client.query(sql).to_dataframe()

df.head()
  • כדי לקבל את מספר האירועים לפי חודש, משתמשים בשאילתה הזו:
SELECT
  COUNT(unique_key) as y,
  DATE_TRUNC(DATE(created_date), month) as ds  
FROM `bigquery-public-data.new_york_311.311_service_requests`
GROUP by ds ORDER BY ds asc
  • מעדכנים את משתני העמודה בקטע הקבועים. בשאילתה שלמעלה, עמודת היעד היא y ועמודת התאריך היא ds. אין תכונות נוספות.
  • מומלץ לשנות את שם הקובץ שבו מייצאים את הנתונים למעבדה הבאה.
  • מייצאים את הנתונים באמצעות: df.to_csv(YOUR-EXPORT-FILENAME, index=False)

שלב 3

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

הערות:

  • משכפלים את מחברת 02-model.ipynb ומתחילים לעבוד ממנה.
  • מעדכנים את הפרמטרים של מערך הנתונים:
  • מעדכנים את הפרמטרים target_col ו-ts_col כך שיתאימו למערך הנתונים החדש.
  • מעדכנים את הפרמטרים של המודל:
  • תדירות חודשית (הקוד לתחילת חודש הוא MS)
  • שלבי קלט: 12 (חלון המבט לאחור הוא 12 חודשים)
  • שלבי הפלט: 3 (חיזוי ל-3 חודשים קדימה)
  • עונות: 12 (עונתיות היא 12 חודשים)
  • אם שיניתם את שם קובץ הקלט במחברת הקודמת, צריך לשנות אותו גם כאן.
  • אם מריצים את השאילתה באמצע החודש, הסכום החודשי הכולל של החודש האחרון יהיה נמוך בהרבה מהצפוי. לכן, לצורך שיעור ה-Lab הזה, נסיר את החודש האחרון מקבוצת הנתונים באמצעות הפקודה: df = df[:-1]
  • לא נראה שיש חריגים ברורים בנתונים, אז אפשר לדלג על התאים האלה או להוסיף להם הערה.
  • משנים את יחידות ה-LSTM, את המסננים של ה-CNN ואת גודל הליבה של המודל החדש.

9. הסרת המשאבים

אם רוצים להמשיך להשתמש ב-notebook הזה, מומלץ להשבית אותו כשלא משתמשים בו. בממשק המשתמש של Workbench במסוף Cloud, בוחרים את מחברת ה-Notebook ואז בוחרים באפשרות Stop:

57213ef2edad9257.png

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

בתפריט הניווט במסוף Cloud, עוברים אל Storage ומוחקים את שתי הקטגוריות שיצרתם כדי לאחסן את נכסי המודל (אזהרה: מבצעים את הפעולה הזו רק אם יצרתם קטגוריות חדשות רק בשביל המעבדה הזו).