חיזוי לדירוג סרטים עם BQML באמצעות SQL

1. מבוא

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

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

מה תפַתחו

תיצורו

  • מערך נתונים ב-BigQuery שיכיל את הטבלה ואת רכיבי המודל
  • מודל BigQuery ML לחיזוי דירוג הסרט באמצעות שאילתות SQL
  • פריסה של המודל במרשם המודלים של Vertex AI

דרישות

  • דפדפן, כמו Chrome או Firefox
  • פרויקט ב-Google Cloud שבו החיוב מופעל

2. יצירת הפרויקט

  1. בדף לבחירת הפרויקט במסוף Google Cloud, בוחרים או יוצרים פרויקט ב-Google Cloud.
  2. הקפידו לוודא שהחיוב מופעל בפרויקט שלכם ב-Cloud. כך בודקים אם החיוב מופעל בפרויקט
  3. עוברים אל BigQuery כדי להפעיל את ה-API. אפשר גם לפתוח את ממשק המשתמש של BigQuery באינטרנט ישירות על ידי הזנת כתובת ה-URL הבאה בדפדפן: https://console.cloud.google.com/bigquery

3. הפעלת Cloud Shell

  1. נשתמש ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud ומגיעה עם bq טעון מראש: במסוף Cloud, לוחצים על Activate Cloud Shell (הפעלת Cloud Shell) בפינה הימנית העליונה: 6757b2fb50ddcc2d.png
  2. אחרי שתתחברו ל-Cloud Shell, אמורה להופיע הודעה על כך שהאימות כבר בוצע והפרויקט כבר מוגדר לפי מזהה הפרויקט שלכם. מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שהאימות בוצע:
gcloud auth list
  1. מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שהפקודה gcloud מכירה את הפרויקט
gcloud config list project
  1. אם הפרויקט לא מוגדר, משתמשים בפקודה הבאה כדי להגדיר אותו:
gcloud config set project <PROJECT_ID>

במסמכי העזרה מפורטות הפקודות של gcloud והשימוש בהן.

4. הכנת נתוני אימון

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

5. יצירת מערך הנתונים וטעינה שלו

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

  1. ב-Cloud Shell, משתמשים בפקודה bq mk כדי ליצור מערך נתונים בשם 'movies'.
bq mk --location=<<LOCATION>> movies

מגדירים את location לאזור (asia-south1).

  1. מוודאים שקובץ הנתונים (‎.csv) מוכן. מריצים את הפקודות הבאות ב-Cloud Shell כדי לשכפל את המאגר ולעבור לפרויקט:
git clone <<repository link>>

cd movie-score
  1. משתמשים בפקודה bq load כדי לטעון את קובץ ה-CSV לטבלה ב-BigQuery (שימו לב שאפשר גם להעלות ישירות מממשק המשתמש של BigQuery):
bq load --source_format=CSV --skip_leading_rows=1 movies.movies_score \
./movies_bq_src.csv \ Id:numeric,name:string,rating:string,genre:string,year:numeric,released:string,score:string,director:string,writer:string,star:string,country:string,budget:numeric,company:string,runtime:numeric,data_cat:string

תיאור האפשרויות: –source_format=CSV – המערכת משתמשת בפורמט הנתונים של CSV בזמן הניתוח של קובץ הנתונים. ‎–skip_leading_rows=1 – דילוג על השורה הראשונה בקובץ ה-CSV כי היא שורת כותרת. Movies.movies – הארגומנט המיקומי הראשון – מגדיר לאיזו טבלה צריך לטעון את הנתונים. ‎./movies.csv – הארגומנט השני שמוגדר לפי מיקום – קובע איזה קובץ יש לטעון. בנוסף לקבצים מקומיים, אפשר להשתמש בפקודה bq load כדי לטעון קבצים מ-Cloud Storage באמצעות מזהי URI מסוג gs://my_bucket/path/to/file. סכימה, שאפשר להגדיר בקובץ סכימה של JSON או כרשימה מופרדת בפסיקים (השתמשתי ברשימה מופרדת בפסיקים). מעולה! נתוני ה-CSV שלנו נטענים עכשיו בטבלה movies.movies.

  1. שולחים שאילתה באחת מ-3 הדרכים הבאות:

יש שלוש דרכים ליצור אינטראקציה עם BigQuery, וננסה שתיהן: א. ממשק המשתמש של BigQuery באינטרנט ב. הפקודה bq c. API

SELECT name, rating, genre, runtime FROM movies.movies_score limit 3;

השתמשתי ב-BigQuery Web SQL Workspace כדי להריץ שאילתות. סביבת העבודה של SQL נראית כך:

109a0b2c7155e9b3.png

באמצעות הפקודה bq:

bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movies.movies_score limit 3;

6. חיזוי הדירוג של סרט בסולם של 1 עד 10

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

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

בחירת נתוני האימון

כבר פיצלנו את נתוני הסרטים (בפורמט CSV) ל-3 קטגוריות בטבלה באמצעות השדה 'data_cat', שמכיל אחד מ-3 הערכים – TRAIN,‏ TEST ו-PREDICT. פיצול מערך הנתונים למטרות בדיקה ואימון הוא היבט חשוב של המודל. מידע נוסף על חלוקת מערכי נתונים זמין במסמכי העזרה.

יצירת מודל הרגרסיה הלוגיסטית

אפשר להשתמש בהצהרה CREATE MODEL עם האפשרות 'LOGISTIC_REG' כדי ליצור ולבצע אימון של מודל רגרסיה לוגיסטית.

מריצים את השאילתה הבאה בסביבת העבודה של SQL בממשק המשתמש של BigQuery באינטרנט:

CREATE OR REPLACE MODEL
  `movies.movies_score_model`
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
   data_split_method='NO_SPLIT',
    input_label_cols=[‘score']
  ) AS
SELECT
  * EXCEPT(id, data_cat)
FROM
  ‘movies.movies_score'
WHERE
  data_cat = 'TRAIN';

פרטי השאילתה:

  1. משפט CREATE MODEL מאמן מודל באמצעות נתוני האימון שבמשפט ה-SELECT
  2. הקלוזה OPTIONS מציינת את סוג המודל ואת אפשרויות האימון. כאן, האפשרות LOGISTIC_REG מציינת סוג של מודל רגרסיה לוגיסטית. אין צורך לציין מודל רגרסיה לוגיסטית בינארית לעומת מודל רגרסיה לוגיסטית מרובה-כיתות: BigQuery ML יכול לקבוע איזה מודל לאמן על סמך מספר הערכים הייחודיים בעמודת התווית
  3. data_split_method=‘NO_SPLIT' מאלץ את BQML לאמן את הנתונים בהתאם לתנאי השאילתה (data_cat = ‘TRAIN'). כמו כן, חשוב לזכור שעדיף להשתמש ב-'AUTO_SPLIT' באפשרות הזו כדי לאפשר למסגרת (או לשירות במקרה הזה) לבצע רנדומיזציה של חלוקת המחיצות של חלוקות האימון/הבדיקה
  4. האפשרות input_label_cols מציינת באיזו עמודה בהצהרת ה-SELECT יש להשתמש כעמודת התווית. כאן, עמודת התווית היא score, כך שהמודל ילמד איזה מתוך 10 הערכים של score הוא הסביר ביותר על סמך הערכים האחרים שמופיעים בכל שורה.
  5. האפשרות auto_class_weights=TRUE מאזנת את תוויות הכיתה בנתוני האימון. כברירת מחדל, נתוני האימון לא משוקלים. אם האיזון בין התוויות בנתוני האימון לא תקין, יכול להיות שהמודל ילמד לחזות את סיווג התוויות הפופולרי ביותר בצורה משמעותית יותר.
  6. משפט ה-SELECT שולח שאילתה לטבלה טענו באמצעות נתוני ה-CSV. תנאי WHERE מסנן את השורות בטבלת הקלט כך שבשלב הזה נבחרת רק מערך הנתונים TRAIN.

אחרי היצירה, הנתונים הבאים יופיעו בקטע SCHEMA של BigQuery SQL Workspace:

תוויות

93efd0c1a7883690.png

תכונות

8c539338df1a9652.png

הערכת מודל הרגרסיה הלוגיסטית

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

SELECT
  *
FROM
  ML.EVALUATE (MODEL movies.movies_score_model,
    (
    SELECT
      *
    FROM
      movies.movies_score
    WHERE
      data_cat= ‘TEST'
    )
  )

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

b54b0ebd6514a498.png

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

מדדים מרכזיים במבט מהיר:

דיוק – מהו היחס בין הזיהויים החיוביים שהיו נכונים בפועל? דיוק = תוצאה חיובית אמיתית / (תוצאה חיובית אמיתית + תוצאה חיובית כוזבת) זיכרון – מהו היחס של תוצאות חיוביות אמיתיות שזוהו בצורה נכונה? זיכרון = חיזוי חיובי נכון / (חיזוי חיובי נכון + חיזוי שלילי שגוי) דיוק – מדד להערכת מודלים של סיווג. המדד הזה מייצג את החלק של החיזויים שהמודל אכן ניחם נכון. דיוק = מספר החיזויים הנכונים / מספר החיזויים הכולל

חיזוי דירוג הסרט באמצעות ML.PREDICT

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

SELECT
  *
FROM
  ML.PREDICT (MODEL movies.movies_score_model,
    (
    SELECT
      *
    FROM
      movies.movies_score
    WHERE
      data_cat= ‘PREDICT'
     )
  )

לפניכם קטע מהתוצאות:

1efb91967acc1f0c.png

תוצאת המודל מציגה את הציון הצפוי של הסרט בסולם של 1 עד 10 (סיווג). יכול להיות שאתם תוהים למה יש כמה שורות של תחזיות לכל סרט. הסיבה לכך היא שהמודל החזיר את התוויות החזויות האפשריות ואת ההסתברות להופעה של כל אחת מהן בסדר יורד.

ניתוח התוצאות הצפויות והמודל

בנוסף, אתם יכולים לבצע שני שלבי ניתוח חשובים כחלק מתוצאות החיזוי:

  1. כדי להבין למה המודל מניב את תוצאות החיזוי האלה, אפשר להשתמש בפונקציה ML.EXPLAIN_PREDICT.
  2. כדי לדעת אילו תכונות הן החשובות ביותר לקביעת טווח ההכנסה באופן כללי, אפשר להשתמש בפונקציה ML.GLOBAL_EXPLAIN.

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

7. חיזוי דירוג הסרט באמצעות BigQuery AutoML

AutoML הוא פתרון מצוין אם אתם רוצים לאפשר לשירות BigQuery ליצור את המודל בשבילכם ולהירגע עד שתוצאות המודל ייוצרו. היכולת של AUTOML זמינה ישירות ב-BQML‏ (model_type=AUTOML_CLASSIFIER או AUTOML_REGRESSOR), וקל יותר להפעיל אותה אם הנתונים כבר נמצאים ב-BigQuery.

CREATE OR REPLACE MODEL movies.auto_movies
       OPTIONS(model_type='AUTOML_CLASSIFIER',
               input_label_cols=['score'],
               budget_hours=1.0)
AS 
SELECT
  * EXCEPT(id, data_cat)
FROM
  movies.movies_score;

אחרי שיוצרים את המודל, אפשר לבצע את השלבים של EVALUATE, ‏ PREDICT ו-EXPLAIN_PREDICT בדיוק כמו שציינו במודל BQML בהתאמה אישית. מידע נוסף על BigQuery AutoML זמין במסמכי העזרה.

8. פריסה של מודלים של BQML למרשם המודלים של Vertex AI בלחיצה אחת

מעכשיו אפשר לראות את כל המודלים של למידת המכונה במרשם המודלים של Vertex AI, וכך קל יותר לארגון לנהל ולפרוס מודלים. האפשרות הזו כוללת מודלים שנוצרו באמצעות BigQuery ML,‏ AutoML ומודלים שהותאמו אישית. לשם כך:

CREATE OR REPLACE MODEL
  `movies.movies_score_model`
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
   data_split_method='NO_SPLIT',
   model_registry='vertex_ai',
  vertex_ai_model_version_aliases=['logistic_reg', 'experimental'],
    input_label_cols=[‘score']
  ) AS
SELECT
  * EXCEPT(id, data_cat)
FROM
  ‘movies.movies_score'
WHERE
  data_cat = 'TRAIN';

צריך לכלול את האפשרות model_registry="vertex_ai" בשאילתה CREATE MODEL כדי ש-BigQuery ML יוכל לבחור אילו מודלים הוא רוצה לרשום באופן מפורש ב-Vertex AI Model Registry. מידע נוסף זמין בבלוג הזה.

9. סיכום

תוך פחות מ-30 דקות, אנחנו:

  1. הגדרת BigQuery כמסד הנתונים של פרויקט ניתוח הנתונים
  2. יצירה של מודל חיזוי בהתאמה אישית באמצעות שאילתות SQL של נתוני BigQuery בלבד, ללא קידוד אחר
  3. יצרתם מודל BQ Auto ML באמצעות שאילתות SQL בלבד
  4. פריסת מודל BQML במרשם המודלים של Vertex AI

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

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

  1. נכנסים לדף Manage resources במסוף Google Cloud.
  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על 'מחיקה'.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

11. מזל טוב

מעולה! יצרתם מודל חיזוי של ציון סרט באמצעות BQML בהתאמה אישית ו-AutoML, ופרסתם את המודל ב-Vertex AI Model Registry – והכול באמצעות SQL בלבד.