1. סקירה כללית
בשיעור ה-Lab הזה תעברו על תהליך עבודה מלא של ML ב-GCP. בסביבת מחברת של Cloud AI Platform Notebooks, תבצעו הטמעה של נתונים ממערך נתונים ציבורי של BigQuery, תיצרו ותאמנו מודל XGBoost ותפרסו את המודל ב-AI Platform לצורך חיזוי.
מה תלמדו
במאמר הזה נסביר איך:
- הטמעה וניתוח של מערך נתונים ב-BigQuery ב-AI Platform Notebooks
- יצירת מודל XGBoost
- פריסת מודל XGBoost ב-AI Platform וקבלת חיזויים
העלות הכוללת להרצת שיעור ה-Lab הזה ב-Google Cloud היא בערך 1$.
2. הגדרת הסביבה
כדי להפעיל את ה-codelab הזה, צריך פרויקט ב-Google Cloud Platform שמופעל בו חיוב. כדי ליצור פרויקט, פועלים לפי ההוראות האלה.
שלב 1: הפעלת Cloud AI Platform Models API
עוברים אל AI Platform Models section במסוף Cloud ולוחצים על Enable אם הוא עדיין לא מופעל.

שלב 2: הפעלת Compute Engine API
עוברים אל Compute Engine ובוחרים באפשרות הפעלה אם הוא עדיין לא מופעל. תצטרכו את זה כדי ליצור את מופע המחברת.
שלב 3: יצירת מופע של AI Platform Notebooks
עוברים אל AI Platform Notebooks section ב-Cloud Console ולוחצים על New Instance. לאחר מכן בוחרים את סוג המכונה העדכני ביותר של Python:

משתמשים באפשרויות ברירת המחדל ולוחצים על יצירה. אחרי שהמופע נוצר, בוחרים באפשרות Open JupyterLab:
שלב 4: מתקינים את XGBoost
אחרי שפותחים את מופע JupyterLab, צריך להוסיף את חבילת XGBoost.
כדי לעשות את זה, בוחרים באפשרות Terminal (טרמינל) ממרכז האפליקציות:

לאחר מכן מריצים את הפקודה הבאה כדי להתקין את הגרסה העדכנית ביותר של XGBoost שנתמכת על ידי AI Platform:
pip3 install xgboost==0.82
אחרי שהפעולה הזו מסתיימת, פותחים מופע של Python 3 Notebook ממרכז האפליקציות. הכול מוכן להתחלת העבודה במחברת!
שלב 5: ייבוא חבילות Python
בתא הראשון של ה-Notebook, מוסיפים את הייבוא הבא ומריצים את התא. כדי להפעיל אותו, לוחצים על לחצן החץ ימינה בתפריט העליון או על Command-Enter:
import pandas as pd
import xgboost as xgb
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from google.cloud import bigquery
3. התנסות במערך הנתונים של BigQuery
ב-BigQuery יש מערכי נתונים רבים שזמינים לציבור לצורך מחקר. בשיעור ה-Lab הזה נשתמש במערך הנתונים של לידות. המאגר הזה מכיל נתונים על כמעט כל לידה בארה"ב במשך תקופה של 40 שנה, כולל משקל הלידה של הילד ומידע דמוגרפי על ההורים של התינוק. נשתמש בקבוצת משנה של התכונות כדי לחזות את משקל הלידה של תינוק.
שלב 1: הורדת נתוני BigQuery למחברת
נשתמש בספריית הלקוח של Python ל-BigQuery כדי להוריד את הנתונים ל-Pandas DataFrame. מערך הנתונים המקורי הוא בנפח 21GB ומכיל 123 מיליון שורות. כדי לפשט את התהליך, נשתמש רק ב-10,000 שורות ממערך הנתונים.
כדי ליצור את השאילתה ולצפות בתצוגה מקדימה של ה-DataFrame שמתקבל, משתמשים בקוד הבא. בדוגמה הזו אנחנו מקבלים 4 מאפיינים מקבוצת הנתונים המקורית, יחד עם משקל התינוק (הערך שהמודל ינבא). מערך הנתונים כולל נתונים מלפני שנים רבות, אבל במודל הזה נשתמש רק בנתונים משנת 2000 ואילך:
query="""
SELECT
weight_pounds,
is_male,
mother_age,
plurality,
gestation_weeks
FROM
publicdata.samples.natality
WHERE year > 2000
LIMIT 10000
"""
df = bigquery.Client().query(query).to_dataframe()
df.head()
כדי לקבל סיכום של המאפיינים המספריים במערך הנתונים, מריצים את הפקודה:
df.describe()
כאן מוצגים הממוצע, סטיית התקן, המינימום ומדדים אחרים של העמודות המספריות. לבסוף, נאסוף נתונים על העמודה הבוליאנית שמציינת את מין התינוק. אפשר לעשות את זה באמצעות השיטה value_counts של Pandas:
df['is_male'].value_counts()
נראה שמערך הנתונים מאוזן כמעט באופן שווה בין המגדרים.
4. הכנת הנתונים לאימון
בקטע הזה, נחלק את הנתונים למערכי אימון ובדיקה כדי להכין אותם לאימון המודל.
שלב 1: חילוץ עמודת התוויות
קודם כל, צריך להסיר מהנתונים שורות עם ערכים ריקים ולערבב את הנתונים:
df = df.dropna()
df = shuffle(df, random_state=2)
לאחר מכן, מחלצים את עמודת התוויות למשתנה נפרד ויוצרים DataFrame עם התכונות שלנו בלבד:
labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])
עכשיו, אם מריצים את הפקודה data.head() כדי לראות תצוגה מקדימה של מערך הנתונים, אמורים לראות את ארבע התכונות שבהן נשתמש לאימון.
שלב 2: המרת מאפיינים קטגוריים למספרים שלמים
מכיוון ש-XGBoost דורש שכל הנתונים יהיו מספריים, נצטרך לשנות את אופן הייצוג של הנתונים בעמודה is_male, שמוצגים כרגע כמחרוזות True / False. כדי לעשות את זה, פשוט משנים את הסוג של העמודה:
data['is_male'] = data['is_male'].astype(int)
שלב 3: פיצול הנתונים לקבוצות אימון ובדיקה
נשתמש בכלי השירות train_test_split של Scikit Learn שייבאנו בתחילת ה-notebook כדי לפצל את הנתונים שלנו לקבוצות אימון וקבוצת נתונים לבדיקה:
x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)
עכשיו אפשר ליצור ולאמן את המודל.
5. הסבר קצר על XGBoost
XGBoost הוא framework ללמידת מכונה שמשתמש בעצי החלטה ובחיזוק גרדיאנט כדי לבנות מודלים לחיזוי. השיטה מבוססת על שילוב של כמה עצי החלטה על סמך הציון שמשויך לצמתי עלים שונים בעץ.
התרשים הבא הוא המחשה פשוטה של רשת עצים משולבת עבור מודל שמעריך אם מישהו יאהב משחק מחשב ספציפי (התרשים הזה מופיע במסמכי XGBoost):

למה אנחנו משתמשים ב-XGBoost למודל הזה? למרות שמחקרים הראו שרשתות נוירונים מסורתיות משיגות את הביצועים הכי טובים בנתונים לא מובנים כמו תמונות וטקסט, עצי החלטה משיגים בדרך כלל ביצועים טובים מאוד בנתונים מובְנים כמו קבוצת הנתונים של המשכנתאות שבה נשתמש ב-Codelab הזה.
6. יצירה, אימון והערכה של מודל XGBoost
שלב 1: הגדרת מודל XGBoost ואימון שלו
קל ליצור מודל ב-XGBoost. נשתמש במחלקה XGBRegressor כדי ליצור את המודל, ורק צריך להעביר את הפרמטר objective המתאים למשימה הספציפית שלנו. כאן אנחנו משתמשים במודל רגרסיה כי אנחנו מנסים לחזות ערך מספרי (משקל התינוק). אם במקום זאת היינו מחלקים את הנתונים לקטגוריות כדי לקבוע אם משקל התינוק היה יותר או פחות מ-2.7 ק"ג, היינו משתמשים במודל סיווג.
במקרה הזה, נשתמש ב-reg:squarederror כיעד של המודל.
הקוד הבא ייצור מודל XGBoost:
model = xgb.XGBRegressor(
objective='reg:linear'
)
אפשר לאמן את המודל באמצעות שורת קוד אחת, להפעיל את השיטה fit() ולהעביר לה את נתוני האימון והתוויות.
model.fit(x_train, y_train)
שלב 2: הערכת המודל על נתוני בדיקה
עכשיו אפשר להשתמש במודל המאומן כדי ליצור תחזיות לגבי נתוני הבדיקה באמצעות הפונקציה predict():
y_pred = model.predict(x_test)
בואו נראה איך המודל פעל על 20 הערכים הראשונים מתוך קבוצת נתונים לבדיקה שלנו. למטה נדפיס את המשקל הצפוי של התינוק לצד המשקל בפועל של התינוק בכל דוגמה לבדיקה:
for i in range(20):
print('Predicted weight: ', y_pred[i])
print('Actual weight: ', y_test.iloc[i])
print()
שלב 3: שמירת המודל
כדי לפרוס את המודל, מריצים את הקוד הבא כדי לשמור אותו בקובץ מקומי:
model.save_model('model.bst')
7. פריסת המודל ב-AI Platform ב-Cloud
המודל שלנו פועל באופן מקומי, אבל יהיה נחמד אם נוכל ליצור חיזויים על סמך המודל מכל מקום (לא רק מהמחברת הזו!). בשלב הזה נבצע פריסה לענן.
שלב 1: יצירת קטגוריה של Cloud Storage עבור המודל
קודם נגדיר כמה משתני סביבה שנשתמש בהם בהמשך ה-codelab. ממלאים את הערכים הבאים בשם של פרויקט בענן של Google, בשם של קטגוריה של Cloud Storage שרוצים ליצור (חייב להיות ייחודי ברמה הגלובלית) ובשם הגרסה של הגרסה הראשונה של המודל:
# Update these to your own GCP project, model, and version names
GCP_PROJECT = 'your-gcp-project'
MODEL_BUCKET = 'gs://storage_bucket_name'
VERSION_NAME = 'v1'
MODEL_NAME = 'baby_weight'
עכשיו אפשר ליצור קטגוריית אחסון לאחסון קובץ המודל של XGBoost. כשנפרוס את AI Platform, נציין את הקובץ הזה.
מריצים את הפקודה gsutil מתוך ה-notebook כדי ליצור קטגוריה:
!gsutil mb $MODEL_BUCKET
שלב 2: מעתיקים את קובץ המודל ל-Cloud Storage
בשלב הבא, נעתיק את קובץ המודל השמור של XGBoost ל-Cloud Storage. מריצים את פקודת gsutil הבאה:
!gsutil cp ./model.bst $MODEL_BUCKET
כדי לוודא שהקובץ הועתק, נכנסים לדפדפן האחסון במסוף Cloud:

שלב 3: יוצרים ומפעילים את המודל
הפקודה הבאה של ai-platform gcloud תיצור מודל חדש בפרויקט שלכם. נקרא לזה xgb_mortgage:
!gcloud ai-platform models create $MODEL_NAME
עכשיו הגיע הזמן לפרוס את המודל. אפשר לעשות את זה באמצעות פקודת gcloud הבאה:
!gcloud ai-platform versions create $VERSION_NAME \
--model=$MODEL_NAME \
--framework='XGBOOST' \
--runtime-version=1.15 \
--origin=$MODEL_BUCKET \
--python-version=3.7 \
--project=$GCP_PROJECT
בזמן שהסקריפט פועל, בודקים את הקטע models במסוף של AI Platform. הגרסה החדשה אמורה להיות מוצגת בתהליך הפריסה:

כשהפריסה מסתיימת בהצלחה, סימן וי ירוק מופיע במקום סמל הטעינה. הפריסה אמורה להימשך 2-3 דקות.
שלב 4: בדיקת המודל שנפרס
כדי לוודא שהמודל שפרסתם פועל, אפשר לבדוק אותו באמצעות gcloud כדי ליצור חיזוי. קודם כל, שומרים קובץ JSON עם שתי דוגמאות מקבוצת הנתונים לבדיקה שלנו:
%%writefile predictions.json
[0.0, 33.0, 1.0, 27.0]
[1.0, 26.0, 1.0, 40.0]
כדי לבדוק את המודל, שומרים את הפלט של הפקודה הבאה ב-gcloud במשתנה ומדפיסים אותו:
prediction = !gcloud ai-platform predict --model=$MODEL_NAME --json-instances=predictions.json --version=$VERSION_NAME
print(prediction.s)
החיזוי של המודל אמור להופיע בפלט. המשקל האמיתי של התינוק בשתי הדוגמאות האלה הוא 0.86 ק"ג ו-3.67 ק"ג בהתאמה.
8. הסרת המשאבים
אם רוצים להמשיך להשתמש ב-notebook הזה, מומלץ להשבית אותו כשלא משתמשים בו. בממשק המשתמש של Notebooks במסוף Cloud, בוחרים את מחברת ה-Notebook ואז בוחרים באפשרות Stop:

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