۱. مرور کلی
در این آزمایشگاه، شما یک گردش کار کامل یادگیری ماشین را در GCP بررسی خواهید کرد. از یک محیط Cloud AI Platform Notebooks، دادهها را از یک مجموعه داده عمومی BigQuery دریافت خواهید کرد، یک مدل XGBoost را ساخته و آموزش میدهید و مدل را برای پیشبینی در پلتفرم AI مستقر میکنید.
آنچه یاد میگیرید
شما یاد خواهید گرفت که چگونه:
- دریافت و تحلیل مجموعه دادههای BigQuery در نوتبوکهای پلتفرم هوش مصنوعی
- ساخت یک مدل XGBoost
- مدل XGBoost را روی پلتفرم هوش مصنوعی مستقر کنید و پیشبینیها را دریافت کنید
هزینه کل اجرای این آزمایشگاه در گوگل کلود حدود ۱ دلار است.
۲. محیط خود را راهاندازی کنید
برای اجرای این codelab به یک پروژه Google Cloud Platform با قابلیت پرداخت صورتحساب نیاز دارید. برای ایجاد یک پروژه، دستورالعملهای اینجا را دنبال کنید.
مرحله ۱: فعال کردن API مدلهای پلتفرم هوش مصنوعی ابری
به بخش مدلهای پلتفرم هوش مصنوعی در کنسول ابری خود بروید و اگر از قبل فعال نشده است، روی فعال کردن کلیک کنید.

مرحله ۲: فعال کردن رابط برنامهنویسی کاربردی موتور محاسبات
به Compute Engine بروید و اگر از قبل فعال نشده است، آن را فعال کنید . برای ایجاد نمونه نوتبوک خود به این مورد نیاز خواهید داشت.
مرحله ۳: ایجاد یک نمونه از نوتبوکهای پلتفرم هوش مصنوعی
به بخش AI Platform Notebooks در کنسول ابری خود بروید و روی New Instance کلیک کنید. سپس آخرین نوع نمونه پایتون را انتخاب کنید:

از گزینههای پیشفرض استفاده کنید و سپس روی Create کلیک کنید. پس از ایجاد نمونه، Open JupyterLab را انتخاب کنید:
مرحله ۴: نصب XGBoost
پس از باز شدن نمونه JupyterLab، باید بسته XGBoost را اضافه کنید.
برای انجام این کار، ترمینال را از لانچر انتخاب کنید:

سپس دستور زیر را برای نصب آخرین نسخه XGBoost پشتیبانی شده توسط AI Platform اجرا کنید:
pip3 install xgboost==0.82
پس از اتمام این کار، یک نمونه Python 3 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
۳. بررسی مجموعه داده BigQuery
بیگکوئری مجموعه دادههای زیادی را برای کاوش شما در دسترس عموم قرار داده است. برای این آزمایش، ما از مجموعه دادههای مربوط به تولد استفاده خواهیم کرد. این مجموعه شامل دادههای تقریباً هر تولد در ایالات متحده در یک دوره زمانی ۴۰ ساله، از جمله وزن کودک هنگام تولد و اطلاعات جمعیتشناختی والدین نوزاد است. ما از زیرمجموعهای از ویژگیها برای پیشبینی وزن هنگام تولد نوزاد استفاده خواهیم کرد.
مرحله ۱: دادههای BigQuery را در دفترچه یادداشت خود دانلود کنید
ما از کتابخانه کلاینت پایتون برای BigQuery برای دانلود دادهها در یک قاب داده Pandas استفاده خواهیم کرد. مجموعه داده اصلی ۲۱ گیگابایت حجم دارد و شامل ۱۲۳ میلیون ردیف است. برای ساده نگه داشتن همه چیز، ما فقط از ۱۰۰۰۰ ردیف از مجموعه داده استفاده خواهیم کرد.
کوئری را بسازید و با کد زیر، پیشنمایشی از DataFrame حاصل ارائه دهید. در اینجا ما ۴ ویژگی را از مجموعه داده اصلی به همراه وزن نوزاد (چیزی که مدل ما پیشبینی خواهد کرد) دریافت میکنیم. مجموعه داده مربوط به سالهای بسیار گذشته است، اما برای این مدل، ما فقط از دادههای پس از سال ۲۰۰۰ استفاده خواهیم کرد:
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()
به نظر میرسد که مجموعه دادهها تقریباً به صورت ۵۰/۵۰ بر اساس جنسیت متعادل شده است.
۴. دادهها را برای آموزش آماده کنید
در این بخش، دادهها را به مجموعههای آموزش و آزمایش تقسیم میکنیم تا برای آموزش مدل خود آماده شوند.
مرحله ۱: استخراج ستون برچسب
ابتدا ردیفهایی با مقادیر تهی را از مجموعه داده حذف کنید و دادهها را بُر بزنید:
df = df.dropna()
df = shuffle(df, random_state=2)
در مرحله بعد، ستون برچسب را در یک متغیر جداگانه استخراج کرده و یک DataFrame فقط با ویژگیهای خودمان ایجاد میکنیم:
labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])
حال اگر با اجرای data.head() پیشنمایشی از مجموعه دادههای ما را مشاهده کنید، باید چهار ویژگی مورد استفاده برای آموزش را مشاهده کنید.
مرحله ۲: تبدیل ویژگیهای دستهبندیشده به اعداد صحیح
از آنجایی که XGBoost نیاز دارد که همه دادهها عددی باشند، باید نحوه نمایش دادهها در ستون is_male را تغییر دهیم، که در حال حاضر رشتههای True/False است. میتوانیم این کار را به سادگی با تغییر نوع آن ستون انجام دهیم:
data['is_male'] = data['is_male'].astype(int)
مرحله ۳: تقسیم دادهها به مجموعههای آموزشی و آزمایشی
ما از ابزار train_test_split کتابخانه Scikit Learn که در ابتدای دفترچه یادداشت وارد کردیم، برای تقسیم دادهها به مجموعههای آموزش و تست استفاده خواهیم کرد:
x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)
حالا آمادهایم تا مدل خود را بسازیم و آموزش دهیم!
۵. یک شروع سریع با XGBoost
XGBoost یک چارچوب یادگیری ماشینی است که از درختهای تصمیمگیری و تقویت گرادیان برای ساخت مدلهای پیشبینی استفاده میکند. این چارچوب با ادغام چندین درخت تصمیمگیری بر اساس امتیاز مرتبط با گرههای برگ مختلف در یک درخت، کار میکند.
نمودار زیر تجسم سادهای از یک شبکه درختی گروهی برای مدلی است که ارزیابی میکند آیا کسی یک بازی کامپیوتری خاص را دوست خواهد داشت یا خیر (این از مستندات XGBoost است):

چرا از XGBoost برای این مدل استفاده میکنیم؟ در حالی که شبکههای عصبی سنتی نشان دادهاند که در دادههای بدون ساختار مانند تصاویر و متن بهترین عملکرد را دارند، درختهای تصمیم اغلب در دادههای ساختاریافته مانند مجموعه داده وام مسکن که در این آزمایشگاه کد از آن استفاده خواهیم کرد، عملکرد بسیار خوبی دارند.
۶. ساخت، آموزش و ارزیابی یک مدل XGBoost
مرحله ۱: تعریف و آموزش مدل XGBoost
ایجاد یک مدل در XGBoost ساده است. ما از کلاس XGBRegressor برای ایجاد مدل استفاده خواهیم کرد و فقط باید پارامتر objective مناسب را برای کار خاص خود ارسال کنیم. در اینجا ما از یک مدل رگرسیون استفاده میکنیم زیرا در حال پیشبینی یک مقدار عددی (وزن نوزاد) هستیم. اگر به جای آن، دادههای خود را برای تعیین اینکه آیا وزن نوزاد بیشتر یا کمتر از ۶ پوند است، دستهبندی میکردیم، از یک مدل طبقهبندی استفاده میکردیم.
در این حالت، ما از reg:squarederror به عنوان تابع هدف مدل خود استفاده خواهیم کرد.
کد زیر یک مدل XGBoost ایجاد میکند:
model = xgb.XGBRegressor(
objective='reg:linear'
)
شما میتوانید مدل را با یک خط کد آموزش دهید، متد fit() را فراخوانی کنید و دادههای آموزشی و برچسبها را به آن ارسال کنید.
model.fit(x_train, y_train)
مرحله ۲: مدل خود را روی دادههای آزمایشی ارزیابی کنید
اکنون میتوانیم از مدل آموزشدیده خود برای تولید پیشبینی روی دادههای آزمایشی با تابع predict() استفاده کنیم:
y_pred = model.predict(x_test)
بیایید ببینیم مدل روی ۲۰ مقدار اول از مجموعه تست ما چگونه عمل میکند. در زیر وزن پیشبینیشده نوزاد را به همراه وزن واقعی نوزاد برای هر مثال تست چاپ خواهیم کرد:
for i in range(20):
print('Predicted weight: ', y_pred[i])
print('Actual weight: ', y_test.iloc[i])
print()
مرحله ۳: مدل خود را ذخیره کنید
برای استقرار مدل، کد زیر را اجرا کنید تا آن را در یک فایل محلی ذخیره کنید:
model.save_model('model.bst')
۷. مدل را روی پلتفرم هوش مصنوعی ابری مستقر کنید
ما مدل خود را به صورت محلی کار میکنیم، اما خوب میشد اگر میتوانستیم از هر جایی (نه فقط این دفترچه یادداشت!) روی آن پیشبینی انجام دهیم. در این مرحله، آن را در فضای ابری مستقر خواهیم کرد.
مرحله ۱: ایجاد یک فضای ذخیرهسازی ابری برای مدل ما
بیایید ابتدا برخی از متغیرهای محیطی را که در ادامهی کد از آنها استفاده خواهیم کرد، تعریف کنیم. مقادیر زیر را با نام پروژهی گوگل کلود خود، نام باکت ذخیرهسازی ابری که میخواهید ایجاد کنید (باید به صورت سراسری منحصر به فرد باشد) و نام نسخهی اولین نسخهی مدل خود پر کنید:
# 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 خود ایجاد کنیم. هنگام استقرار، پلتفرم هوش مصنوعی ابری را به این فایل ارجاع خواهیم داد.
برای ایجاد یک سطل، دستور gsutil را از داخل نوتبوک خود اجرا کنید:
!gsutil mb $MODEL_BUCKET
مرحله ۲: فایل مدل را در فضای ذخیرهسازی ابری کپی کنید
در مرحله بعد، فایل مدل ذخیره شده XGBoost خود را در فضای ابری کپی خواهیم کرد. دستور gsutil زیر را اجرا کنید:
!gsutil cp ./model.bst $MODEL_BUCKET
برای تأیید کپی شدن فایل، به مرورگر ذخیرهسازی در کنسول ابری خود بروید:

مرحله ۳: ایجاد و استقرار مدل
دستور 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
در حالی که این برنامه در حال اجرا است، بخش مدلهای کنسول پلتفرم هوش مصنوعی خود را بررسی کنید. باید نسخه جدید خود را در آنجا مشاهده کنید:

وقتی عملیات با موفقیت انجام شد، یک علامت تیک سبز در محل بارگذاری چرخنده مشاهده خواهید کرد. عملیات استقرار باید ۲ تا ۳ دقیقه طول بکشد.
مرحله ۴: مدل پیادهسازی شده را آزمایش کنید
برای اطمینان از اینکه مدل پیادهسازیشده شما کار میکند، آن را با استفاده از 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)
شما باید پیشبینی مدل خود را در خروجی ببینید. وزن واقعی نوزاد برای این دو مثال به ترتیب ۱.۹ و ۸.۱ پوند است.
۸. پاکسازی
اگر میخواهید به استفاده از این دفترچه یادداشت ادامه دهید، توصیه میشود وقتی از آن استفاده نمیکنید، آن را خاموش کنید. از رابط کاربری دفترچه یادداشتها در کنسول ابری خود، دفترچه یادداشت را انتخاب کرده و سپس توقف را انتخاب کنید:

اگر میخواهید تمام منابعی را که در این آزمایشگاه ایجاد کردهاید حذف کنید، به جای متوقف کردن آن، کافیست نمونه نوتبوک را حذف کنید.
با استفاده از منوی ناوبری در کنسول ابری خود، به بخش ذخیرهسازی (Storage) بروید و هر دو باکتی را که برای ذخیره داراییهای مدل خود ایجاد کردهاید، حذف کنید.