1. بررسی اجمالی
در این آزمایشگاه، از ابزار What-if برای تجزیه و تحلیل یک مدل XGBoost که بر روی داده های مالی آموزش دیده و در پلتفرم Cloud AI مستقر شده است، استفاده خواهید کرد.
آنچه یاد می گیرید
شما یاد خواهید گرفت که چگونه:
- یک مدل XGBoost را بر روی مجموعه داده های وام مسکن عمومی در نوت بوک های پلتفرم هوش مصنوعی آموزش دهید
- مدل XGBoost را در پلتفرم هوش مصنوعی مستقر کنید
- مدل را با استفاده از ابزار What-if آنالیز کنید
کل هزینه اجرای این آزمایشگاه در Google Cloud حدود 1 دلار است.
2. پرایمر سریع XGBoost
XGBoost یک چارچوب یادگیری ماشینی است که از درخت های تصمیم گیری و تقویت گرادیان برای ساخت مدل های پیش بینی کننده استفاده می کند. این کار با ترکیب کردن چندین درخت تصمیم با هم بر اساس امتیاز مربوط به گره های برگ مختلف در یک درخت کار می کند.
نمودار زیر تجسمی از یک مدل درخت تصمیم ساده است که ارزیابی می کند که آیا یک بازی ورزشی باید بر اساس پیش بینی آب و هوا انجام شود یا خیر:
چرا از XGBoost برای این مدل استفاده می کنیم؟ در حالی که نشان داده شده است که شبکههای عصبی سنتی بر روی دادههای بدون ساختار مانند تصاویر و متن بهترین عملکرد را دارند، درختهای تصمیم اغلب بر روی دادههای ساختاریافته مانند مجموعه دادههای وام مسکن که در این مجموعه کد استفاده خواهیم کرد، عملکرد بسیار خوبی دارند.
3. محیط خود را راه اندازی کنید
برای اجرای این کد لبه به یک پروژه 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 کلیک کنید. سپس آخرین نوع نمونه TF Enterprise 2.x را بدون GPU انتخاب کنید:
از گزینه های پیش فرض استفاده کنید و سپس روی ایجاد کلیک کنید. پس از ایجاد نمونه، Open JupyterLab را انتخاب کنید:
مرحله 4: XGBoost را نصب کنید
پس از باز شدن نمونه JupyterLab، باید بسته XGBoost را اضافه کنید.
برای انجام این کار، ترمینال را از لانچر انتخاب کنید:
سپس برای نصب آخرین نسخه XGBoost که توسط پلتفرم Cloud AI پشتیبانی می شود، موارد زیر را اجرا کنید:
pip3 install xgboost==0.90
پس از انجام این کار، یک نمونه پایتون 3 Notebook را از راهانداز باز کنید. برای شروع در دفترچه یادداشت خود آماده هستید!
مرحله 5: بسته های پایتون را وارد کنید
در اولین سلول نوت بوک، موارد زیر را وارد کنید و سلول را اجرا کنید. می توانید با فشار دادن دکمه فلش سمت راست در منوی بالا یا فشار دادن دستور-enter آن را اجرا کنید:
import pandas as pd
import xgboost as xgb
import numpy as np
import collections
import witwidget
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.utils import shuffle
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder
4. داده ها را دانلود و پردازش کنید
ما از یک مجموعه داده وام مسکن از ffiec.gov برای آموزش مدل XGBoost استفاده خواهیم کرد. ما برخی از پیشپردازشها را روی مجموعه داده اصلی انجام دادهایم و نسخه کوچکتری را برای شما ایجاد کردهایم تا از آن برای آموزش مدل استفاده کنید. این مدل پیش بینی می کند که آیا یک درخواست وام مسکن خاص تایید می شود یا خیر .
مرحله 1: مجموعه داده از پیش پردازش شده را دانلود کنید
ما نسخه ای از مجموعه داده را در Google Cloud Storage برای شما در دسترس قرار داده ایم. با اجرای دستور gsutil
زیر در نوت بوک Jupyter می توانید آن را دانلود کنید:
!gsutil cp 'gs://mortgage_dataset_files/mortgage-small.csv' .
مرحله 2: مجموعه داده را با پانداها بخوانید
قبل از ایجاد Pandas DataFrame خود، دیکته ای از نوع داده هر ستون ایجاد می کنیم تا Pandas مجموعه داده ما را به درستی بخواند:
COLUMN_NAMES = collections.OrderedDict({
'as_of_year': np.int16,
'agency_code': 'category',
'loan_type': 'category',
'property_type': 'category',
'loan_purpose': 'category',
'occupancy': np.int8,
'loan_amt_thousands': np.float64,
'preapproval': 'category',
'county_code': np.float64,
'applicant_income_thousands': np.float64,
'purchaser_type': 'category',
'hoepa_status': 'category',
'lien_status': 'category',
'population': np.float64,
'ffiec_median_fam_income': np.float64,
'tract_to_msa_income_pct': np.float64,
'num_owner_occupied_units': np.float64,
'num_1_to_4_family_units': np.float64,
'approved': np.int8
})
سپس یک DataFrame ایجاد میکنیم و انواع دادههایی را که در بالا مشخص کردیم به آن ارسال میکنیم. در صورتی که مجموعه داده اصلی به روش خاصی مرتب شده باشد، مهم است که دادههایمان را به هم بزنیم. برای انجام این کار از یک ابزار sklearn
به نام shuffle
استفاده می کنیم که در سلول اول وارد کردیم:
data = pd.read_csv(
'mortgage-small.csv',
index_col=False,
dtype=COLUMN_NAMES
)
data = data.dropna()
data = shuffle(data, random_state=2)
data.head()
data.head()
به ما امکان می دهد پنج ردیف اول مجموعه داده خود را در Pandas پیش نمایش کنیم. پس از اجرای سلول بالا باید چیزی شبیه به این را ببینید:
اینها ویژگی هایی هستند که ما از آنها برای آموزش مدل خود استفاده خواهیم کرد. اگر تا انتها پیمایش کنید، آخرین ستون approved
را خواهید دید که همان چیزی است که ما پیشبینی میکنیم. مقدار 1
نشان می دهد که یک برنامه خاص تایید شده است و 0
نشان دهنده رد شدن آن است.
برای مشاهده توزیع مقادیر تایید شده / رد شده در مجموعه داده و ایجاد یک آرایه numpy از برچسب ها، موارد زیر را اجرا کنید:
# Class labels - 0: denied, 1: approved
print(data['approved'].value_counts())
labels = data['approved'].values
data = data.drop(columns=['approved'])
حدود 66٪ از مجموعه داده شامل برنامه های کاربردی تایید شده است.
مرحله 3: ایجاد ستون ساختگی برای مقادیر طبقه بندی شده
این مجموعه داده حاوی ترکیبی از مقادیر مقولهای و عددی است، اما XGBoost نیاز دارد که همه ویژگیها عددی باشند. به جای نمایش مقادیر طبقهبندی با استفاده از رمزگذاری یکطرفه ، برای مدل XGBoost ما از تابع get_dummies
Pandas استفاده خواهیم کرد.
get_dummies
یک ستون با چندین مقدار ممکن می گیرد و آن را به یک سری از ستون ها تبدیل می کند که هر کدام فقط 0 و 1 دارند. به عنوان مثال، اگر یک ستون "color" با مقادیر ممکن "آبی" و "قرمز" داشته باشیم، get_dummies
آن را به 2 ستون به نام های "color_blue" و "color_red" با تمام مقادیر 0 و 1 بولی تبدیل می کند.
برای ایجاد ستون های ساختگی برای ویژگی های دسته بندی ما، کد زیر را اجرا کنید:
dummy_columns = list(data.dtypes[data.dtypes == 'category'].index)
data = pd.get_dummies(data, columns=dummy_columns)
data.head()
وقتی این بار دادهها را پیشنمایش میکنید، ویژگیهای منفرد (مانند purchaser_type
در تصویر زیر) را خواهید دید که به چندین ستون تقسیم شدهاند:
مرحله 4: تقسیم داده ها به مجموعه های قطار و آزمایش
یک مفهوم مهم در یادگیری ماشین، تقسیم قطار/تست است. ما اکثریت داده های خود را می گیریم و از آن برای آموزش مدل خود استفاده می کنیم و بقیه را برای آزمایش مدل خود بر روی داده هایی که قبلاً دیده نشده است کنار می گذاریم.
کد زیر را به نوت بوک خود اضافه کنید که از تابع Scikit Learn train_test_split
برای تقسیم داده های ما استفاده می کند:
x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)
اکنون شما آماده ساخت و آموزش مدل خود هستید!
5. یک مدل XGBoost بسازید، آموزش دهید و ارزیابی کنید
مرحله 1: مدل XGBoost را تعریف و آموزش دهید
ایجاد یک مدل در XGBoost ساده است. ما از کلاس XGBClassifier
برای ایجاد مدل استفاده می کنیم و فقط باید پارامتر objective
مناسب را برای وظیفه طبقه بندی خاص خود پاس کنیم. در این مورد ما از reg:logistic
استفاده میکنیم زیرا یک مشکل طبقهبندی باینری داریم و میخواهیم مدل یک مقدار واحد در محدوده (0,1) خروجی دهد: 0
برای تایید نشده و 1
برای تایید.
کد زیر یک مدل XGBoost ایجاد می کند:
model = xgb.XGBClassifier(
objective='reg:logistic'
)
می توانید مدل را با یک خط کد آموزش دهید، متد fit()
را فراخوانی کرده و داده ها و برچسب های آموزشی را به آن ارسال کنید.
model.fit(x_train, y_train)
مرحله 2: دقت مدل خود را ارزیابی کنید
اکنون میتوانیم از مدل آموزشدیده خود برای تولید پیشبینیهای دادههای آزمایشی با تابع predict()
استفاده کنیم.
سپس از تابع accuracy_score
Scikit Learn برای محاسبه دقت مدل خود بر اساس نحوه عملکرد آن بر روی داده های آزمایشی خود استفاده خواهیم کرد. ما مقادیر حقیقت پایه را به همراه مقادیر پیش بینی شده مدل برای هر مثال در مجموعه آزمایشی خود ارسال می کنیم:
y_pred = model.predict(x_test)
acc = accuracy_score(y_test, y_pred.round())
print(acc, '\n')
شما باید دقت را در حدود 87٪ ببینید، اما دقت شما کمی متفاوت است زیرا همیشه عنصر تصادفی در یادگیری ماشین وجود دارد.
مرحله 3: مدل خود را ذخیره کنید
برای استقرار مدل، کد زیر را اجرا کنید تا آن را در یک فایل محلی ذخیره کنید:
model.save_model('model.bst')
6. استقرار مدل در پلتفرم 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 = 'xgb_mortgage'
اکنون ما آماده ایجاد یک سطل ذخیره سازی برای ذخیره فایل مدل 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 --region='global'
اکنون زمان استقرار مدل است. ما می توانیم این کار را با دستور gcloud انجام دهیم:
!gcloud ai-platform versions create $VERSION_NAME \
--model=$MODEL_NAME \
--framework='XGBOOST' \
--runtime-version=2.1 \
--origin=$MODEL_BUCKET \
--python-version=3.7 \
--project=$GCP_PROJECT \
--region='global'
در حین اجرا، بخش مدلهای کنسول پلتفرم هوش مصنوعی خود را بررسی کنید. شما باید نسخه جدید خود را در حال استقرار در آنجا ببینید:
هنگامی که استقرار با موفقیت کامل شد، علامت تیک سبز رنگی را می بینید که اسپینر بارگیری در آن قرار دارد. استقرار باید 2-3 دقیقه طول بکشد.
مرحله 4: مدل مستقر شده را آزمایش کنید
برای اینکه مطمئن شوید مدل مستقر شما کار میکند، آن را با استفاده از gcloud آزمایش کنید تا پیشبینی کنید. ابتدا یک فایل JSON را با اولین مثال از مجموعه آزمایشی ما ذخیره کنید:
%%writefile predictions.json
[2016.0, 1.0, 346.0, 27.0, 211.0, 4530.0, 86700.0, 132.13, 1289.0, 1408.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0]
مدل خود را با اجرای این کد تست کنید:
prediction = !gcloud ai-platform predict --model=xgb_mortgage --region='global' --json-instances=predictions.json --version=$VERSION_NAME --verbosity=none
print(prediction)
شما باید پیش بینی مدل خود را در خروجی ببینید. این مثال خاص تأیید شد، بنابراین باید مقداری نزدیک به 1 ببینید.
7. از ابزار What-if برای تفسیر مدل خود استفاده کنید
مرحله 1: تجسم ابزار What-if را ایجاد کنید
برای اتصال ابزار What-if به مدلهای پلتفرم هوش مصنوعی، باید آن را زیرمجموعهای از نمونههای آزمایشی خود به همراه مقادیر حقیقت پایه برای آن نمونهها ارسال کنید. بیایید یک آرایه Numpy از 500 نمونه آزمایشی خود به همراه برچسب های حقیقت پایه آنها ایجاد کنیم:
num_wit_examples = 500
test_examples = np.hstack((x_test[:num_wit_examples].values,y_test[:num_wit_examples].reshape(-1,1)))
راهاندازی ابزار What-if به سادگی ایجاد یک شیء WitConfigBuilder
و انتقال آن به مدل پلتفرم هوش مصنوعی است که میخواهیم تجزیه و تحلیل کنیم.
ما در اینجا از پارامتر اختیاری adjust_prediction
استفاده می کنیم زیرا ابزار What-if لیستی از امتیازات را برای هر کلاس در مدل ما انتظار دارد (در این مورد 2). از آنجایی که مدل ما فقط یک مقدار را از 0 به 1 برمی گرداند، در این تابع آن را به فرمت صحیح تبدیل می کنیم:
def adjust_prediction(pred):
return [1 - pred, pred]
config_builder = (WitConfigBuilder(test_examples.tolist(), data.columns.tolist() + ['mortgage_status'])
.set_ai_platform_model(GCP_PROJECT, MODEL_NAME, VERSION_NAME, adjust_prediction=adjust_prediction)
.set_target_feature('mortgage_status')
.set_label_vocab(['denied', 'approved']))
WitWidget(config_builder, height=800)
توجه داشته باشید که بارگیری تجسم یک دقیقه طول می کشد. هنگام بارگذاری، باید موارد زیر را مشاهده کنید:
محور y پیشبینی مدل را به ما نشان میدهد که 1
یک پیشبینی approved
با اطمینان بالا و 0
یک پیشبینی denied
با اطمینان بالا است. محور x فقط گسترش تمام نقاط داده بارگذاری شده است.
مرحله 2: نقاط داده فردی را کاوش کنید
نمای پیش فرض ابزار What-if تب ویرایشگر Datapoint است. در اینجا میتوانید روی هر نقطه دادهای کلیک کنید تا ویژگیهای آن را ببینید، مقادیر ویژگیها را تغییر دهید و ببینید که چگونه این تغییر بر پیشبینی مدل بر روی یک نقطه داده تأثیر میگذارد.
در مثال زیر ما یک نقطه داده نزدیک به آستانه 0.5 را انتخاب کردیم. درخواست وام مسکن مرتبط با این نقطه داده خاص از CFPB سرچشمه گرفته است. ما این ویژگی را به 0 تغییر دادیم و همچنین مقدار agency_code_Department of Housing and Urban Development (HUD)
به 1 تغییر دادیم تا ببینیم اگر این وام از HUD سرچشمه بگیرد، چه اتفاقی برای پیشبینی مدل میافتد:
همانطور که در قسمت پایین سمت چپ ابزار What-if می بینیم، تغییر این ویژگی به طور قابل توجهی پیش بینی approved
مدل را تا 32% کاهش داد. این می تواند نشان دهد که آژانسی که از آن وام گرفته شده تأثیر زیادی بر خروجی مدل دارد، اما برای اطمینان باید تجزیه و تحلیل بیشتری انجام دهیم.
در قسمت پایین سمت چپ UI، همچنین میتوانیم مقدار حقیقت پایه را برای هر نقطه داده ببینیم و آن را با پیشبینی مدل مقایسه کنیم:
مرحله 3: تحلیل خلاف واقع
سپس، روی هر نقطه داده کلیک کنید و نوار لغزنده Show nearest counterfactual datapoint را به سمت راست حرکت دهید:
با انتخاب این نقطه داده ای را به شما نشان می دهد که مشابه ترین مقادیر ویژگی را با ویژگی اصلی که انتخاب کرده اید، اما پیش بینی مخالف دارد. سپس می توانید در میان مقادیر ویژگی پیمایش کنید تا ببینید دو نقطه داده در کجا تفاوت دارند (تفاوت ها با رنگ سبز و پررنگ مشخص شده اند).
مرحله 4: به نمودارهای وابستگی جزئی نگاه کنید
برای اینکه ببینید هر ویژگی چگونه روی پیشبینیهای مدل به طور کلی تأثیر میگذارد، کادر نمودارهای وابستگی جزئی را علامت بزنید و مطمئن شوید که نمودارهای وابستگی جزئی سراسری انتخاب شده است:
در اینجا میتوانیم ببینیم که وامهایی که از HUD نشات میگیرند، احتمال رد شدن کمی بالاتر دارند. نمودار این شکل است زیرا کد آژانس یک ویژگی بولی است، بنابراین مقادیر فقط می توانند دقیقاً 0 یا 1 باشند.
applicant_income_thousands
یک ویژگی عددی است، و در نمودار وابستگی جزئی میتوانیم ببینیم که درآمد بالاتر کمی احتمال تایید شدن یک درخواست را افزایش میدهد، اما فقط تا حدود 200 هزار دلار. پس از 200 هزار دلار، این ویژگی تاثیری بر پیش بینی مدل ندارد.
مرحله 5: عملکرد کلی و عدالت را بررسی کنید
سپس به تب Performance & Fairness بروید. این آمار کلی عملکرد را در نتایج مدل در مجموعه داده ارائه شده، از جمله ماتریس های سردرگمی، منحنی های PR، و منحنی های ROC نشان می دهد.
برای مشاهده ماتریس سردرگمی، mortgage_status
به عنوان ویژگی Ground Truth انتخاب کنید:
این ماتریس سردرگمی پیش بینی های صحیح و نادرست مدل ما را به عنوان درصدی از کل نشان می دهد. اگر مربع های بله واقعی / بله پیش بینی شده و نه واقعی / نه پیش بینی شده را جمع کنید، باید دقتی مشابه مدل شما (حدود 87٪) جمع آوری کنید.
همچنین میتوانید با نوار لغزنده آستانه آزمایش کنید، امتیاز طبقهبندی مثبتی را که مدل باید قبل از تصمیمگیری به approved
برای وام بازگرداند، افزایش و کاهش دهید و ببینید که چگونه دقت، مثبت کاذب و منفی کاذب را تغییر میدهد. در این مورد، دقت در حدود آستانه 0.55 بالاترین میزان است.
سپس، در سمت چپ Slice by dropdown، loan_purpose_Home_purchase
را انتخاب کنید:
اکنون عملکرد دو زیرمجموعه دادههای خود را خواهید دید: بخش «0» زمانی را نشان میدهد که وام برای خرید خانه نیست، و قطعه «1» برای زمانی است که وام برای خرید خانه است. دقت، مثبت کاذب و نرخ منفی کاذب بین دو برش را بررسی کنید تا تفاوت عملکرد را جستجو کنید.
اگر ردیفها را برای مشاهده ماتریسهای سردرگمی گسترش دهید، میبینید که این مدل برای 70 درصد درخواستهای وام برای خرید خانه و تنها 46 درصد وامهایی که برای خرید خانه نیستند، «تأیید شده» را پیشبینی میکند (درصدهای دقیق برای خرید خانه متفاوت است. مدل شما):
اگر برابری جمعیتی را از دکمههای رادیویی سمت چپ انتخاب کنید، دو آستانه بهگونهای تنظیم میشوند که مدل پیشبینی میکند برای درصد مشابهی از متقاضیان در هر دو بخش approved
. این با دقت، مثبت کاذب و منفی کاذب برای هر برش چه می کند؟
مرحله 6: توزیع ویژگی را کاوش کنید
در نهایت، به تب Features در ابزار What-if بروید. این به شما توزیع مقادیر را برای هر ویژگی در مجموعه داده شما نشان می دهد:
می توانید از این برگه برای اطمینان از متعادل بودن مجموعه داده خود استفاده کنید. برای مثال، به نظر میرسد که وامهای بسیار کمی در مجموعه دادهها از آژانس خدمات مزرعه گرفته شده است. برای بهبود دقت مدل، ممکن است در صورت موجود بودن داده، وام های بیشتری از آن آژانس اضافه کنیم.
ما فقط چند ایده اکتشافی What-if Tool را در اینجا شرح داده ایم. با خیال راحت به بازی کردن با این ابزار ادامه دهید، مناطق زیادی برای کاوش وجود دارد!
8. پاکسازی
اگر می خواهید به استفاده از این نوت بوک ادامه دهید، توصیه می شود در صورت عدم استفاده آن را خاموش کنید. از رابط کاربری Notebooks در Cloud Console خود، نوت بوک را انتخاب کنید و سپس Stop را انتخاب کنید:
اگر میخواهید همه منابعی را که در این آزمایشگاه ایجاد کردهاید حذف کنید، بهجای توقف، نمونه نوتبوک را به سادگی حذف کنید.
با استفاده از منوی پیمایش در Cloud Console، به Storage بروید و هر دو سطل را که برای ذخیره دارایی های مدل خود ایجاد کرده اید حذف کنید.