1. نظرة عامة
في هذا التمرين العملي، ستتعرّف على سير عمل كامل للتعلم الآلي على "منصة Google Cloud". من بيئة Cloud AI Platform Notebooks، ستستوعب البيانات من مجموعة بيانات عامة في BigQuery، وتنشئ نموذج XGBoost وتدرّبه، ثم تنشر النموذج في "منصة الذكاء الاصطناعي" لإجراء عمليات التوقّع.
ما ستتعرّف عليه
ستتعرَّف على كيفية:
- نقل مجموعة بيانات BigQuery وتحليلها في "دفاتر ملاحظات AI Platform"
- إنشاء نموذج XGBoost
- نشر نموذج XGBoost على "منصة الذكاء الاصطناعي" والحصول على توقّعات
يبلغ إجمالي تكلفة تشغيل هذا الدرس التطبيقي على Google Cloud حوالي 1 دولار أمريكي.
2. إعداد البيئة
يجب أن يكون لديك مشروع على Google Cloud Platform مع تفعيل الفوترة لتتمكّن من تنفيذ هذا الدرس العملي. لإنشاء مشروع، اتّبِع التعليمات هنا.
الخطوة 1: تفعيل Cloud AI Platform Models API
انتقِل إلى قسم "AI Platform Models" في Cloud Console وانقر على "تفعيل" إذا لم تكن الميزة مفعَّلة بعد.

الخطوة 2: تفعيل واجهة برمجة التطبيقات Compute Engine API
انتقِل إلى Compute Engine وانقر على تفعيل إذا لم يكن مفعّلاً بعد. يجب توفير هذه المعلومات لإنشاء مثيل دفتر الملاحظات.
الخطوة 3: إنشاء مثيل AI Platform Notebooks
انتقِل إلى قسم "دفاتر ملاحظات AI Platform" في Cloud Console وانقر على إنشاء مثيل جديد. بعد ذلك، اختَر أحدث نوع مثيل Python:

استخدِم الخيارات التلقائية، ثم انقر على إنشاء. بعد إنشاء المثيل، انقر على فتح JupyterLab:
الخطوة 4: تثبيت XGBoost
بعد فتح مثيل JupyterLab، عليك إضافة حزمة XGBoost.
لإجراء ذلك، اختَر "الوحدة الطرفية" من مشغّل التطبيقات:

بعد ذلك، شغِّل الأمر التالي لتثبيت أحدث إصدار من XGBoost متوافق مع "منصة الذكاء الاصطناعي":
pip3 install xgboost==0.82
بعد اكتمال هذه العملية، افتح مثيلاً لدفتر ملاحظات Python 3 من مشغّل التطبيقات. أنت الآن جاهز للبدء في دفتر الملاحظات.
الخطوة 5: استيراد حِزم Python
في الخلية الأولى من دفتر الملاحظات، أضِف عمليات الاستيراد التالية وشغِّل الخلية. يمكنك تشغيله من خلال الضغط على زر السهم المتّجه لليسار في القائمة العلوية أو الضغط على 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 العديد من مجموعات البيانات للجميع لتتمكّن من استكشافها. في هذا الدرس التطبيقي، سنستخدم مجموعة بيانات الولادات. يحتوي هذا الملف على بيانات حول كل ولادة تقريبًا في الولايات المتحدة على مدار فترة زمنية تبلغ 40 عامًا، بما في ذلك وزن الطفل عند الولادة والمعلومات الديموغرافية عن والدَي الطفل. سنستخدم مجموعة فرعية من الميزات للتنبؤ بالوزن عند الولادة.
الخطوة 1: تنزيل بيانات BigQuery إلى دفتر الملاحظات
سنستخدم مكتبة برامج Python للعملاء في BigQuery لتنزيل البيانات إلى Pandas DataFrame. تبلغ سعة مجموعة البيانات الأصلية 21 غيغابايت وتحتوي على 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()
يبدو أنّ مجموعة البيانات متوازنة تقريبًا بنسبة 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، والذي يتضمّن حاليًا السلسلتَين "صحيح" و"خطأ". يمكننا إجراء ذلك ببساطة عن طريق تغيير نوع هذا العمود:
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 Platform
لقد نجحنا في تشغيل النموذج محليًا، ولكن سيكون من الرائع أن نتمكّن من إجراء توقّعات عليه من أي مكان (وليس فقط من دفتر الملاحظات هذا). في هذه الخطوة، سننفّذها على السحابة الإلكترونية.
الخطوة 1: إنشاء حزمة Cloud Storage للنموذج
لنبدأ أولاً بتحديد بعض متغيرات البيئة التي سنستخدمها في بقية الدرس التطبيقي حول الترميز. املأ القيم أدناه باسم مشروعك على 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 Platform عند النشر.
نفِّذ أمر gsutil التالي من داخل دفتر ملاحظاتك لإنشاء حزمة:
!gsutil mb $MODEL_BUCKET
الخطوة 2: نسخ ملف النموذج إلى Cloud Storage
بعد ذلك، سننسخ ملف النموذج المحفوظ XGBoost إلى Cloud Storage. نفِّذ أمر gsutil التالي:
!gsutil cp ./model.bst $MODEL_BUCKET
انتقِل إلى متصفِّح مساحة التخزين في Cloud Console للتأكّد من نسخ الملف:

الخطوة 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
أثناء تشغيل هذا البرنامج، اطّلِع على قسم النماذج في وحدة تحكّم AI Platform. من المفترض أن يظهر لك الإصدار الجديد الذي يتم نشره على النحو التالي:

عند اكتمال عملية النشر بنجاح، ستظهر لك علامة اختيار خضراء في المكان الذي يظهر فيه مؤشر التحميل. من المفترض أن تستغرق عملية النشر من دقيقتَين إلى 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، اختَر دفتر الملاحظات، ثم انقر على إيقاف:

إذا أردت حذف جميع المراجع التي أنشأتها في هذا المختبر، ما عليك سوى حذف مثيل دفتر الملاحظات بدلاً من إيقافه.
باستخدام قائمة "التنقّل" في Cloud Console، انتقِل إلى "مساحة التخزين" واحذف الحزمتَين اللتين أنشأتهما لتخزين مواد عرض النموذج.