1. סקירה כללית
בשיעור ה-Lab הזה תעברו על תהליך העבודה המלא של למידת מכונה ב-GCP. בסביבת Cloud AI Platform Notebooks תטמיעו נתונים ממערך נתונים ציבורי ב-BigQuery, תפתחו ותאמנים מודל XGBoost, ותפרסו את המודל ב-AI Platform לצורך חיזוי.
מה לומדים
נסביר לכם איך:
- הטמעה וניתוח של מערך נתונים של BigQuery ב-notebooks של AI Platform
- בניית מודל XGBoost
- פריסת מודל XGBoost ב-AI Platform וקבלת חיזויים
העלות הכוללת של הפעלת שיעור ה-Lab הזה ב-Google Cloud היא כ-$1.
2. הגדרת הסביבה
כדי להריץ את ה-Codelab הזה צריך פרויקט ב-Google Cloud Platform שהחיוב מופעל בו. כדי ליצור פרויקט, יש לפעול לפי ההוראות האלה.
שלב 1: הפעלת Cloud AI Platform Models API
עוברים לקטע 'מודלים של AI Platform במסוף Cloud ולוחצים על 'הפעלה' אם הוא עדיין לא מופעל.
שלב 2: מפעילים את Compute Engine API
עוברים אל Compute Engine ובוחרים באפשרות Enable (הפעלה) אם היא לא מופעלת עדיין. תצטרכו את הקישור הזה כדי ליצור מכונה של ה-notebook.
שלב 3: יצירת מכונה של AI Platform Notebooks
עוברים אל הקטע 'notebooks של AI Platform' במסוף Cloud ולוחצים על New Instance. לאחר מכן, בוחרים את סוג המכונה העדכני ביותר של Python:
משתמשים באפשרויות ברירת המחדל ואז לוחצים על יצירה. אחרי שיוצרים את המכונה, בוחרים באפשרות Open JupyterLab:
שלב 4: מתקינים את XGBoost
אחרי שמכונת JupyterLab נפתחת, צריך להוסיף את חבילת XGBoost.
כדי לעשות זאת, בוחרים באפשרות Terminal במרכז האפליקציות:
אחר כך מריצים את הפקודה הבאה כדי להתקין את הגרסה האחרונה של XGBoost שנתמכת על ידי AI Platform:
pip3 install xgboost==0.82
בסיום, פותחים מופע של Python 3 Notebook במרכז האפליקציות. עכשיו אתם יכולים להתחיל לעבוד ב-notebook.
שלב 5: מייבאים חבילות Python
בתא הראשון של ה-notebook, מוסיפים את פעולות הייבוא הבאות ומריצים את התא. אפשר להריץ אותו על ידי לחיצה על לחצן החץ ימינה בתפריט העליון או על ידי הקשה על מקש 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 ל-notebook שלנו
אנחנו נשתמש בספריית הלקוח של Python ל-BigQuery כדי להוריד את הנתונים ל-Pandas DataFrame. מערך הנתונים המקורי הוא 21GB ומכיל 123 מיליון שורות. כדי לפשט את הדברים, נשתמש רק ב-10,000 שורות ממערך הנתונים.
בונים את השאילתה וצופים בתצוגה מקדימה של ה-DataFrame שנוצר באמצעות הקוד הבא. כאן אנחנו מקבלים 4 תכונות ממערך הנתונים המקורי, יחד עם משקל התינוק (הדברים שהמודל שלנו יחזה). מערך הנתונים קיים שנים רבות, אבל לצורך המודל הזה נשתמש רק בנתונים מהתקופה שאחרי 2,000:
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()
בעמודה הזו מוצגים הערכים הממוצעים, סטיית התקן, המינימום והמדדים האחרים בעמודות המספריות. לסיום, נקבל נתונים על העמודה הבוליאנית שמציינת את מין התינוק. אפשר לעשות זאת באמצעות Pandas אמצעי תשלום אחד (value_counts
):
df['is_male'].value_counts()
נראה שמערך הנתונים כמעט מאוזן 50/50 ממגדר.
4. הכנת הנתונים לאימון
בחלק הזה נחלק את הנתונים לערכות אימון ובדיקה כדי להכין אותם לאימון המודל שלנו.
שלב 1: מחלצים את עמודת התווית
קודם כול משחררים שורות עם ערכי null ממערך הנתונים ומארגנים את הנתונים:
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 Learning, שייבאנו בתחילת ה-notebook, כדי לפצל את הנתונים שלנו לקבוצות אימון ובדיקות:
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 ק"ג, נשתמש במודל סיווג.
במקרה הזה נשתמש ב-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
יש לנו את המודל שלנו לעבוד באופן מקומי, אבל נשמח אם נוכל ליצור חיזויים עליו מכל מקום (לא רק מה-notebook הזה!). בשלב הזה נפרוס אותו בענן.
שלב 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
בשלב הבא נעתיק ל-Cloud Storage את קובץ המודל השמור של XGBoost. מריצים את פקודת gsutil הבאה:
!gsutil cp ./model.bst $MODEL_BUCKET
נכנסים לדפדפן האחסון במסוף Cloud כדי לוודא שהקובץ הועתק:
שלב 3: יצירה ופריסה של המודל
הפקודה הבאה ב-gcloud של ai-platform
תיצור מודל חדש בפרויקט שלכם. נתקשר לדף הזה בשם 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
בזמן שהבדיקה מתבצעת, כדאי לבדוק את קטע המודלים במסוף 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)
החיזוי של המודל אמור להופיע בפלט. משקל התינוק בפועל בשתי הדוגמאות האלה הוא 1.9 ו-8.1 פאונד בהתאמה.
8. הסרת המשאבים
אם ברצונך להמשיך להשתמש ב-notebook הזה, מומלץ להשבית אותו כשהוא לא בשימוש. בממשק המשתמש של Notebooks במסוף Cloud, בוחרים את ה-notebook ואז לוחצים על Stop (עצירה):
כדי למחוק את כל המשאבים שיצרתם בשיעור ה-Lab הזה, תוכלו פשוט למחוק את המכונה של ה-notebook במקום לעצור אותה.
באמצעות תפריט הניווט במסוף Cloud, עוברים לקטע 'אחסון' ומוחקים את שתי הקטגוריות שיצרתם לצורך אחסון הנכסים של המודלים.