1. סקירה כללית
בשיעור ה-Lab הזה תעברו על תהליך עבודה מלא של למידת מכונה ב-GCP. מתוך סביבת מחברת של Cloud AI Platform, תטמיעו נתונים ממערך נתונים ציבורי של 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
עוברים אל 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 שייבאנו בתחילת המחברת כדי לפצל את הנתונים שלנו לקבוצות אימון ובדיקה:
x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)
עכשיו אפשר ליצור ולאמן את המודל.
5. הסבר קצר על XGBoost
XGBoost הוא פריימוורק ללמידת מכונה שמשתמש בעצי החלטה ובחיזוק גרדיאנט כדי לבנות מודלים לחיזוי. השיטה מבוססת על שילוב של כמה עצי החלטה על סמך הציון שמשויך לצמתי עלים שונים בעץ.
התרשים הבא הוא המחשה פשוטה של רשת עצים משולבת עבור מודל שמעריך אם מישהו יאהב משחק מחשב ספציפי (התרשים הזה מופיע במסמכי XGBoost):

למה אנחנו משתמשים ב-XGBoost למודל הזה? למרות שמחקרים הראו שרשתות עצביות מסורתיות משיגות את הביצועים הכי טובים בנתונים לא מובנים כמו תמונות וטקסט, עצי החלטה משיגים בדרך כלל ביצועים טובים מאוד בנתונים מובנים כמו מערך הנתונים של המשכנתאות שבו נשתמש ב-codelab הזה.
6. יצירה, אימון והערכה של מודל XGBoost
שלב 1: הגדרת מודל XGBoost ואימון שלו
קל ליצור מודל ב-XGBoost. נשתמש במחלקה XGBRegressor כדי ליצור את המודל, ורק צריך להעביר את הפרמטר objective המתאים למשימה הספציפית שלנו. כאן אנחנו משתמשים במודל רגרסיה כי אנחנו מנסים לחזות ערך מספרי (משקל התינוק). אם במקום זאת היינו מחלקים את הנתונים לקטגוריות כדי לקבוע אם משקל התינוק היה יותר מ-6 פאונד או פחות מ-6 פאונד, היינו משתמשים במודל סיווג.
במקרה הזה, נשתמש ב-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. פריסת מודל ב-Cloud AI Platform
המודל שלנו פועל באופן מקומי, אבל יהיה נחמד אם נוכל להשתמש בו כדי ליצור תחזיות מכל מקום (לא רק ממחברת ה-Jupyter הזו!). בשלב הזה נבצע פריסה לענן.
שלב 1: יוצרים קטגוריית Cloud Storage עבור המודל שלנו
קודם נגדיר כמה משתני סביבה שנשתמש בהם בהמשך ה-codelab. ממלאים את הערכים שלמטה בשם של פרויקט בענן של Google Cloud, בשם של קטגוריה של 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. כשנפרוס את המודל, נציין את הקובץ הזה ב-Cloud 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:

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