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

1. מבוא

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

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

מה תפַתחו

תיצור

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

דרישות

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

2. יוצרים פרויקט

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

3. הפעלת Cloud Shell

  1. אתם תשתמשו ב-Cloud Shell, סביבת שורת הפקודה שרצה ב-Google Cloud וכוללת מראש את bq: במסוף Cloud, לוחצים על Activate 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. נתוני האימון בהכנה

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

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

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

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

מגדירים את המיקום כאזור (asia-south1).

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

cd movie-score
  1. אפשר להשתמש בפקודה טעינת bq כדי לטעון את קובץ ה-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 יכולה לטעון קבצים מ-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' כדי ליצור ולאמן מודל רגרסיה לוגיסטי.

מריצים את השאילתה הבאה ב-BigQuery Web UI SQL Workspace:

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. סעיף האפשרויות מציין את סוג המודל ואפשרויות האימון. כאן, האפשרות LOGISTIC_REG מציינת סוג של מודל רגרסיה לוגיסטית. אין צורך לציין מודל רגרסיה לוגיסטי בינארי לעומת מודל רגרסיה לוגיסטית רב-תחומית: BigQuery ML יכול לקבוע איזה מודל לאמן על סמך מספר הערכים הייחודיים בעמודת התווית.
  3. data_split_method=‘NO_SPLIT&#39; ומאלץ את BQML לאמן את הנתונים בהתאם לתנאי השאילתה (data_cat = 'TRAIN'). חשוב גם לשים לב שעדיף להשתמש בפונקציה 'auto_SPLIT' באפשרות הזו, כדי לאפשר למסגרת (או לשירות במקרה הזה) לבצע רנדומיזציה של המחיצה של קטעי הרכבת/הבדיקה
  4. האפשרותinput_label_cols מציינת איזו עמודה בהצהרה SELECT תשמש כעמודת התווית. כאן בעמודה של התווית יש ציון, כך שהמודל ילמד איזה מ-10 ערכי הציון הוא שסביר להניח שהוא מבוסס על הערכים האחרים שמופיעים בכל שורה
  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 מאחזרת את מדדי ההערכה שנגזרים במהלך האימון, ומשתמשת במערך הנתונים של ההערכה שנשמר באופן אוטומטי.

מדדי מפתח בקצרה:

דיוק - איזה חלק מהזיהויים החיוביים היה נכון בפועל? Precision = True Positive / (True Positive + False Positive) Recall – איזה שיעור של תוצאות חיוביות בפועל זוהה בצורה נכונה? לזכור = דיוק חיובי אמיתי / (חיובי אמיתי + שלילי שגוי) - מדד להערכת מודלים של סיווג, זהו החלק של החיזויים שהתקבלו במודל שלנו בפועל: דיוק = מספר החיזויים הנכונים / המספר הכולל של החיזויים

חיזוי סיווג הסרט באמצעות 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. תוכלו לקרוא מידע נוסף על הנושא בבלוג הזה.

9. סיכום

תוך פחות מ-30 דקות, תקבלו:

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

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

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

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

11. מזל טוב

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