یک مدل XGBoost را در پلتفرم Cloud AI بسازید، آموزش دهید، و استقرار دهید
درباره این codelab
1. نمای کلی
در این آزمایشگاه، یک گردش کار کامل ML در GCP را طی خواهید کرد. از محیط Cloud AI Platform Notebooks، دادهها را از مجموعه داده عمومی BigQuery دریافت میکنید، مدل XGBoost را میسازید و آموزش میدهید، و مدل را برای پیشبینی در پلتفرم هوش مصنوعی مستقر میکنید.
آنچه شما یاد می گیرید
شما یاد خواهید گرفت که چگونه:
- یک مجموعه داده BigQuery را در نوت بوک های پلتفرم هوش مصنوعی دریافت و تجزیه و تحلیل کنید
- یک مدل XGBoost بسازید
- مدل XGBoost را در پلتفرم هوش مصنوعی مستقر کنید و پیشبینی کنید
کل هزینه اجرای این آزمایشگاه در Google Cloud حدود 1 دلار است.
2. محیط خود را تنظیم کنید
برای اجرای این کد لبه به یک پروژه Google Cloud Platform با فعال بودن صورتحساب نیاز دارید. برای ایجاد یک پروژه، دستورالعمل های اینجا را دنبال کنید.
مرحله 1: Cloud AI Platforms Models API را فعال کنید
به بخش مدلهای پلتفرم هوش مصنوعی در Cloud Console خود بروید و اگر قبلاً فعال نشده است روی Enable کلیک کنید.
مرحله ۲: Compute Engine API را فعال کنید
به Compute Engine بروید و اگر قبلاً فعال نشده است Enable را انتخاب کنید. برای ایجاد نمونه نوت بوک خود به این نیاز دارید.
مرحله 3: یک نمونه نوت بوک پلتفرم هوش مصنوعی ایجاد کنید
به بخش AI Platform Notebooks در Cloud Console خود بروید و روی New Instance کلیک کنید. سپس آخرین نوع نمونه پایتون را انتخاب کنید:
از گزینه های پیش فرض استفاده کنید و سپس روی ایجاد کلیک کنید. پس از ایجاد نمونه، Open JupyterLab را انتخاب کنید:
مرحله 4: XGBoost را نصب کنید
پس از باز شدن نمونه JupyterLab، باید بسته XGBoost را اضافه کنید.
برای انجام این کار، ترمینال را از لانچر انتخاب کنید:
سپس برای نصب آخرین نسخه XGBoost که توسط پلتفرم هوش مصنوعی پشتیبانی می شود، موارد زیر را اجرا کنید:
pip3 install xgboost==0.82
پس از انجام این کار، یک نمونه پایتون 3 Notebook را از راهانداز باز کنید. برای شروع در دفترچه یادداشت خود آماده هستید!
مرحله 5: بسته های پایتون را وارد کنید
در اولین سلول نوت بوک، موارد زیر را وارد کنید و سلول را اجرا کنید. می توانید با فشار دادن دکمه فلش سمت راست در منوی بالا یا فشار دادن دستور-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 مجموعه داده های زیادی را برای کاوش شما در دسترس عموم قرار داده است. برای این آزمایشگاه، از مجموعه داده natality استفاده خواهیم کرد. این شامل اطلاعات تقریباً هر تولد در ایالات متحده در یک دوره زمانی 40 ساله است، از جمله وزن تولد کودک، و اطلاعات جمعیت شناختی والدین نوزاد. ما از زیرمجموعه ای از ویژگی ها برای پیش بینی وزن تولد نوزاد استفاده خواهیم کرد.
مرحله 1: داده های BigQuery را در نوت بوک ما دانلود کنید
ما از کتابخانه کلاینت پایتون برای BigQuery برای دانلود داده ها در Pandas DataFrame استفاده خواهیم کرد. مجموعه داده اصلی 21 گیگابایت است و شامل 123 میلیون ردیف است. برای ساده نگه داشتن کارها، فقط از 10000 ردیف از مجموعه داده استفاده می کنیم.
کوئری را بسازید و 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
پاندا انجام دهیم:
df['is_male'].value_counts()
به نظر می رسد مجموعه داده تقریباً 50/50 بر اساس جنسیت متعادل است.
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 برای این مدل استفاده می کنیم؟ در حالی که نشان داده شده است که شبکههای عصبی سنتی بر روی دادههای بدون ساختار مانند تصاویر و متن بهترین عملکرد را دارند، درختهای تصمیم اغلب بر روی دادههای ساختاریافته مانند مجموعه دادههای وام مسکن که در این مجموعه کد استفاده خواهیم کرد، عملکرد بسیار خوبی دارند.
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
ما مدل خود را به صورت محلی کار کردهایم، اما خوب است اگر بتوانیم از هر جایی (نه فقط از این دفترچه!) روی آن پیشبینی کنیم. در این مرحله ما آن را در فضای ابری مستقر خواهیم کرد.
مرحله 1: یک سطل Cloud Storage برای مدل خود ایجاد کنید
اجازه دهید ابتدا چند متغیر محیطی را تعریف کنیم که در بقیه قسمتهای Codelab از آنها استفاده خواهیم کرد. مقادیر زیر را با نام پروژه Google Cloud خود، نام سطل فضای ذخیرهسازی ابری که میخواهید ایجاد کنید (باید در سطح جهانی منحصربهفرد باشد) و نام نسخه اولین نسخه مدل خود را پر کنید:
# 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 را به این فایل نشان خواهیم داد.
این دستور gsutil
را از داخل نوت بوک خود اجرا کنید تا یک سطل ایجاد کنید:
!gsutil mb $MODEL_BUCKET
مرحله 2: فایل مدل را در Cloud Storage کپی کنید
در مرحله بعد، فایل مدل ذخیره شده XGBoost خود را در فضای ذخیره سازی ابری کپی می کنیم. دستور 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
در حین اجرا، بخش مدلهای کنسول پلتفرم هوش مصنوعی خود را بررسی کنید. شما باید نسخه جدید خود را در حال استقرار در آنجا ببینید:
هنگامی که استقرار با موفقیت کامل شد، علامت تیک سبز رنگی را می بینید که اسپینر بارگیری در آن قرار دارد. استقرار باید 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. پاکسازی
اگر می خواهید به استفاده از این نوت بوک ادامه دهید، توصیه می شود در صورت عدم استفاده آن را خاموش کنید. از رابط کاربری Notebooks در Cloud Console خود، نوت بوک را انتخاب کنید و سپس Stop را انتخاب کنید:
اگر میخواهید همه منابعی را که در این آزمایشگاه ایجاد کردهاید حذف کنید، بهجای توقف، نمونه نوتبوک را به سادگی حذف کنید.
با استفاده از منوی پیمایش در Cloud Console، به Storage بروید و هر دو سطل را که برای ذخیره دارایی های مدل خود ایجاد کرده اید حذف کنید.