1. نظرة عامة
في هذا التمرين، ستستخدم أجهزة AI Platform Notebook لإنشاء وتدريب نموذج لتحديد المعاملات الاحتيالية، وفهم توقّعات النموذج باستخدام حزمة تطوير البرامج (SDK) للذكاء الاصطناعي الموضَّح. إنّ رصد الاحتيال هو نوع من رصد الحالات الشاذة خاص بالخدمات المالية، ويطرح بعض التحديات المثيرة للاهتمام لنماذج تعلُّم الآلة: مجموعات البيانات غير المتوازنة بطبيعتها والحاجة إلى شرح نتائج أحد النماذج.
المعلومات التي تطّلع عليها
وستتعرّف على كيفية:
- التعامل مع مجموعات البيانات غير المتوازنة
- إنشاء نموذج لرصد الاحتيال وتقييمه باستخدام tf.keras في أداة AI Platform Notebook
- استخدام حزمة تطوير البرامج (SDK) للذكاء الاصطناعي (AI) القابلة للشرح من ورقة الملاحظات لفهم سبب تصنيف النموذج للمعاملات على أنّها احتيالية
- نشر النموذج على منصة AI Platform مع التفسيرات والحصول على توقّعات وتفسيرات للنموذج المنشور
تبلغ التكلفة الإجمالية لتشغيل هذا التمرين على Google Cloud حوالي $1.
2. أهمية رصد عمليات الاحتيال
يمكن أن يكون رصد القيم الشاذة مرشحًا جيدًا لتعلُّم الآلة لأنه غالبًا ما يصعب كتابة سلسلة من العبارات المستندة إلى القواعد لتحديد القيم المتطرفة في البيانات. إنّ رصد الاحتيال هو نوع من أنواع رصد عمليات الاحتيال، ويطرح تحديَين مهمَّين في ما يتعلّق بتعلّم الآلة:
- مجموعات البيانات غير متوازنة جدًا: بما أنّ القيم الشاذة هي أيضًا حالات شاذة، لا يتوفّر الكثير منها. يعمل تعلُّم الآلة بشكل أفضل عندما تكون مجموعات البيانات متوازنة، لذلك يمكن أن تصبح الأمور معقدة عندما تشكل القيم الاستثنائية أقل من 1٪ من بياناتك.
- تحتاج إلى شرح النتائج: إذا كنت تبحث عن نشاط احتيالي، قد تحتاج إلى معرفة سبب وضع النظام علامة على شيء ما على أنه احتيالي بدلاً من الاكتفاء بقول كلامه. يمكن أن تساعد أدوات التفسير في ذلك.
3- إعداد البيئة
ستحتاج إلى مشروع Google Cloud Platform مع تفعيل الفوترة لتشغيل هذا الدرس التطبيقي حول الترميز. لإنشاء مشروع، يُرجى اتّباع التعليمات هنا.
الخطوة 1: تفعيل Cloud AI Platform models API
انتقِل إلى قسم "نماذج منصة الذكاء الاصطناعي" (AI) في Cloud Console وانقر على "تفعيل" إذا لم يسبق لك تفعيله.
الخطوة 2: تفعيل Compute Engine API
انتقِل إلى Compute Engine واختَر تفعيل إذا لم يسبق لك تفعيله. ستحتاج إلى هذا لإنشاء مثيل دفتر الملاحظات.
الخطوة 3: إنشاء مثيل من AI Platform Notebook
انتقِل إلى قسم AI Platform Notebooks في Cloud Console وانقر على New Instance (مثيل جديد). بعد ذلك، اختَر نوع المثيل TensorFlow Enterprise 2.1 بدون وحدات معالجة الرسومات:
استخدِم الخيارات التلقائية، ثم انقر على إنشاء. بعد إنشاء المثيل، اختَر فتح JupyterLab:
عند فتح المثيل، اختَر ورقة ملاحظات Python 3 من مشغّل التطبيقات:
الخطوة 4: استيراد حِزم Python
أنشِئ خلية جديدة واستورِد المكتبات التي سنستخدمها في هذا الدرس التطبيقي:
import itertools
import numpy as np
import pandas as pd
import tensorflow as tf
import json
import matplotlib as mpl
import matplotlib.pyplot as plt
import explainable_ai_sdk
from sklearn.utils import shuffle
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import StandardScaler
from tensorflow import keras
from explainable_ai_sdk.metadata.tf.v2 import SavedModelMetadataBuilder
4. تنزيل البيانات ومعالجتها
سنستخدم مجموعة البيانات التي تم إنشاؤها اصطناعيًا من Kaggle لتدريب نموذجنا. وتتضمن مجموعة البيانات الأصلية 6.3 مليون صف، منها 8 آلاف معاملات احتيالية، أي ما يمثل 0.1% فقط من مجموعة البيانات بأكملها!
الخطوة 1: تنزيل مجموعة بيانات Kaggle وقراءتها باستخدام Pandas
لقد جعلنا مجموعة بيانات Kaggle متاحة لك في Google Cloud Storage. يمكنك تنزيله من خلال تنفيذ الأمر gsutil
التالي في دفتر ملاحظات Jupyter:
!gsutil cp gs://financial_fraud_detection/fraud_data_kaggle.csv .
بعد ذلك، دعنا نقرأ مجموعة البيانات كـ Pandas DataFrame ونعاينها:
data = pd.read_csv('fraud_data_kaggle.csv')
data = data.drop(columns=['type'])
data.head()
من المفترض أن يظهر لك هذا في المعاينة:
الخطوة 2: حساب البيانات غير المتوازنة
كما ذكرنا أعلاه، تحتوي مجموعة البيانات الآن على 99.9٪ من الأمثلة غير الاحتيالية. وإذا طبقنا نموذجًا على البيانات كما هو، فمن المحتمل أن يصل النموذج إلى دقة بنسبة 99.9% من خلال تخمين أن كل معاملة ليست عملية احتيال، وذلك فقط لأن 99.9% من البيانات هي حالات غير احتيالية.
هناك عدد قليل من الأساليب المختلفة للتعامل مع البيانات غير المتوازنة. سنستخدم هنا أسلوبًا يطلق عليه تقليل العيّنات. يُقصد بتقليل العينات استخدام نسبة صغيرة فقط من الصف الأكبر في التدريب. في هذه الحالة، يعتبر مصطلح "غير الاحتيال" وهي الفئة الأكبر لأنها تمثل 99.9% من البيانات.
لخفض حجم مجموعة البيانات، سنأخذ ما يقارب 8 آلاف مثال من الأمثلة الاحتيالية وعينة عشوائية من حوالي 31 ألف من القضايا غير الاحتيالية. بهذه الطريقة، ستحتوي مجموعة البيانات الناتجة على 25٪ من حالات الاحتيال، مقارنةً بنسبة .1٪ التي كانت لدينا من قبل.
أولاً، قسِّم البيانات إلى إطارَي DataFrame، أحدهما للاحتيال والآخر لغير الاحتيال (سنستفيد من ذلك لاحقًا في الدرس التطبيقي حول الترميز عندما ننشر نموذجنا):
fraud = data[data['isFraud'] == 1]
not_fraud = data[data['isFraud'] == 0]
ثم خذ عينة عشوائية من الحالات غير الاحتيالية. ونستخدم نسبة% 005 .لأنّ ذلك سيعطينا نسبة تقسيم 25/75 من المعاملات الاحتيالية / غير الاحتيالية. باستخدام ذلك، يمكنك إعادة تجميع البيانات معًا والتشغيل العشوائي. لتبسيط الأمور، سنزيل أيضًا بعض الأعمدة التي لن نستخدمها للتدريب:
# Take a random sample of non fraud rows
not_fraud_sample = not_fraud.sample(random_state=2, frac=.005)
# Put it back together and shuffle
df = pd.concat([not_fraud_sample,fraud])
df = shuffle(df, random_state=2)
# Remove a few columns (isFraud is the label column we'll use, not isFlaggedFraud)
df = df.drop(columns=['nameOrig', 'nameDest', 'isFlaggedFraud'])
# Preview the updated dataset
df.head()
الآن لدينا مجموعة بيانات أكثر توازنًا. مع ذلك، إذا لاحظنا أنّ نموذجنا يتقارب الدقة بنسبة% 75 تقريبًا، هناك احتمال كبير بأن يخمن "عدم الاحتيال". في كل حالة.
الخطوة 3: تقسيم البيانات إلى مجموعات تدريب واختبار
آخر شيء يجب فعله قبل إنشاء نموذجنا هو تقسيم البيانات. سنستخدم قسمة اختبار التطبيق 80/20:
train_test_split = int(len(df) * .8)
train_set = df[:train_test_split]
test_set = df[train_test_split:]
train_labels = train_set.pop('isFraud')
test_labels = test_set.pop('isFraud')
*هـ. ج: لوبيز روخاس ، إيه. "إلمير" و"إس. أكسلسون. "PaySim: محاكي الشؤون المالية على الأجهزة الجوّالة لرصد عمليات الاحتيال". في: ندوة النمذجة والمحاكاة الأوروبية الثامنة والعشرين-EMSS، لارنكا، قبرص. 2016
5- إنشاء نموذج tf.keras وتدريبه وتقييمه
سننشئ المحتوى باستخدام tf.keras API من TensorFlow. يستند رمز النموذج في هذا القسم إلى هذا البرنامج التعليمي المتوفّر في مستندات TensorFlow. أولاً، سنعمل على تسوية البيانات، ثم نُنشئ نموذجنا ونُدرِّبه، باستخدام مَعلمة class_weight
لحساب عدم توازن البيانات المتبقي.
الخطوة 1: تسوية البيانات
عند تدريب نموذج على البيانات الرقمية، من المهم تسوية البيانات، خاصة إذا كان كل عمود يقع في نطاق مختلف. يمكن أن يساعد ذلك في منع الخسارة من الانفجار أثناء التدريب. يمكننا تسوية بياناتنا بما يلي:
scaler = StandardScaler()
train_set = scaler.fit_transform(train_set) # Only normalize on the train set
test_set = scaler.transform(test_set)
# clip() ensures all values fall within the range [-5,5]
# useful if any outliers remain after normalizing
train_set = np.clip(train_set, -5, 5)
test_set = np.clip(test_set, -5, 5)
بعد ذلك، لنعاين بياناتنا التي تمت تسويتها:
train_set
الخطوة 2: تحديد ترجيحات الفئات
عند تقليل عيّنات البيانات، كنّا لا نزال نرغب في الاحتفاظ بمجموعة فرعية من المعاملات غير الاحتيالية، حتى لا نخسر معلومات عن تلك المعاملات، ولهذا السبب لم نوفّر توازنًا مثاليًا في البيانات. ولأنّ مجموعة البيانات لا تزال غير متوازنة، ويهمّنا كثيرًا تحديد المعاملات الاحتيالية بشكل صحيح، نريد أن يولي النموذج أهمية أكبر للأمثلة الاحتيالية في مجموعة البيانات.
تتيح لنا معلَمة Keras class_weight
أن نحدّد بالضبط مقدار الأهمية الذي نريد تقديم أمثلة من كل فئة بناءً على عدد مرّات حدوثها في مجموعة البيانات:
weight_for_non_fraud = 1.0 / df['isFraud'].value_counts()[0]
weight_for_fraud = 1.0 / df['isFraud'].value_counts()[1]
class_weight = {0: weight_for_non_fraud, 1: weight_for_fraud}
سنستخدم هذا المتغير عندما نُدرّب النموذج في الخطوة التالية.
الخطوة 3: تدريب النموذج وتقييمه
سننشئ النموذج باستخدام واجهة برمجة تطبيقات النموذج المتسلسل Keras، والتي تتيح لنا تعريف النموذج كحزمة من الطبقات. هناك عدد من المقاييس التي سنتتبعها أثناء التدريب، والتي ستساعدنا في فهم مستوى أداء نموذجنا في كل فئة في مجموعة البيانات.
METRICS = [
keras.metrics.TruePositives(name='tp'),
keras.metrics.FalsePositives(name='fp'),
keras.metrics.TrueNegatives(name='tn'),
keras.metrics.FalseNegatives(name='fn'),
keras.metrics.BinaryAccuracy(name='accuracy'),
keras.metrics.Precision(name='precision'),
keras.metrics.Recall(name='recall'),
keras.metrics.AUC(name='auc'),
]
def make_model(metrics = METRICS):
model = keras.Sequential([
keras.layers.Dense(
16, activation='relu',
input_shape=(train_set.shape[-1],)),
keras.layers.Dropout(0.5),
keras.layers.Dense(1, activation='sigmoid'),
])
model.compile(
optimizer=keras.optimizers.Adam(lr=1e-3),
loss=keras.losses.BinaryCrossentropy(),
metrics=metrics)
return model
بعد ذلك، سنقوم بتعريف بعض المتغيرات العمومية لاستخدامها أثناء التدريب إلى جانب بعض معلمات الإيقاف المبكر.
EPOCHS = 100
BATCH_SIZE = 512
early_stopping = tf.keras.callbacks.EarlyStopping(
monitor='val_auc',
verbose=1,
patience=10,
mode='max',
restore_best_weights=True)
وأخيرًا، سنسمي الدالة التي حددناها أعلاه لإنشاء النموذج:
model = make_model()
model.summary()
يمكننا تدريب نموذجنا باستخدام طريقة fit()
، من خلال إدخال المعلَمات المحدّدة أعلاه:
results = model.fit(
train_set,
train_labels,
batch_size=BATCH_SIZE,
epochs=EPOCHS,
callbacks = [early_stopping],
validation_data=(test_set, test_labels),
class_weight=class_weight)
سيستغرق التدريب بضع دقائق.
الخطوة 4: عرض مقاييس النماذج
والآن بعد أن أصبح لدينا نموذج مدرّب، لنرى كيف كان أداء النموذج من خلال رسم مقاييس مختلفة خلال فترات التدريب:
mpl.rcParams['figure.figsize'] = (12, 10)
colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
def plot_metrics(history):
metrics = ['loss', 'auc', 'precision', 'recall']
for n, metric in enumerate(metrics):
name = metric.replace("_"," ").capitalize()
plt.subplot(2,2,n+1)
plt.plot(history.epoch, history.history[metric], color=colors[0], label='Train')
plt.plot(history.epoch, history.history['val_'+metric],
color=colors[0], linestyle="--", label='Val')
plt.xlabel('Epoch')
plt.ylabel(name)
if metric == 'loss':
plt.ylim([0, plt.ylim()[1]])
elif metric == 'auc':
plt.ylim([0.8,1])
else:
plt.ylim([0,1])
plt.legend()
plot_metrics(results)
يجب أن تبدو الرسوم البيانية مشابهة لما يلي (لكن لن تكون متطابقة تمامًا):
الخطوة 5: طباعة مصفوفة الالتباس
وتشكّل مصفوفة التشويش طريقة رائعة لعرض طريقة أداء النموذج في مجموعة بيانات الاختبار. وسوف يظهر لنا بالنسبة إلى كل فئة، النسبة المئوية لأمثلة الاختبار التي تنبأ بها نموذجنا بشكل صحيح أو غير صحيح. تقدم مكتبة ساي كيت ليرن بعض الأدوات المساعدة لإنشاء مصفوفات الالتباس ورسمها، والتي سنستخدمها هنا.
استوردنا الأداة confusion_matrix
في بداية ورقة الملاحظات. لاستخدامها، سنقوم أولاً بإنشاء قائمة بتنبؤات النموذج. وسنعمل هنا على تقريب القيم الناتجة من نموذجنا بحيث تتطابق هذه القوائم مع قائمة تصنيفات الحقيقة الواقعية:
predicted = model.predict(test_set)
y_pred = []
for i in predicted.tolist():
y_pred.append(int(round(i[0])))
نحن جاهزون الآن لإضافة ذلك إلى طريقة confusion_matrix
، بالإضافة إلى تصنيفات الحقائق العملية:
cm = confusion_matrix(test_labels.values, y_pred)
print(cm)
وهذا يوضح لنا الأعداد المطلقة لتنبؤات نموذجنا الصحيحة وغير الصحيحة في مجموعة الاختبار. يوضح الرقم في أعلى اليمين عدد الأمثلة من مجموعة الاختبار التي تم توقُّعها بشكل صحيح باعتبارها غير احتيالية. يشير الرقم الظاهر في أسفل يسار الصفحة إلى العدد الصحيح الذي تم توقّعه على أنه احتيالي (نحن نولي أهمية كبيرة لهذا الرقم). ويمكنك أن ترى أنها تنبأ بمعظم العينات بشكل صحيح لكل فئة.
ولتسهيل عملية التحليل، تم تعديل الدالة plot_confusion_matrix
من مستندات ساي كيت ليرن. حدد هذه الدالة هنا:
def plot_confusion_matrix(cm, classes,
normalize=False,
title='Confusion matrix',
cmap=plt.cm.Blues):
"""
This function prints and plots the confusion matrix.
Normalization can be applied by setting `normalize=True`.
"""
plt.imshow(cm, interpolation='nearest', cmap=cmap)
plt.title(title)
plt.colorbar()
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, rotation=45)
plt.yticks(tick_marks, classes)
if normalize:
cm = np.round(cm.astype('float') / cm.sum(axis=1)[:, np.newaxis], 3)
thresh = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
plt.text(j, i, cm[i, j],
horizontalalignment="center",
color="white" if cm[i, j] > thresh else "black")
plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')
وننشئ المخطط بتمريره بالبيانات من النموذج. نحن بصدد ضبط القيمة normalize
على True
هنا لكي تعرض مصفوفة التشويش عدد عبارات البحث المقترحة الصحيحة وغير الصحيحة كنِسب مئوية:
classes = ['not fraud', 'fraud']
plot_confusion_matrix(cm, classes, normalize=True)
من المفترض أن تظهر لك رسالة مشابهة (ستختلف الأرقام نفسها):
يمكننا هنا أن نرى أن النموذج تنبأ بحوالي 85% من 1594 معاملة احتيالية من مجموعة الاختبار بشكل صحيح. تجدر الإشارة إلى أنّ التركيز في هذا التمرين لا ينصب على جودة النموذج، فإذا كنت تطبّق نموذج اكتشاف احتيال في مرحلة الإنتاج، من الأفضل أن تكون دقة النموذج أعلى من 85% في فئة الاحتيال. يهدف هذا التمرين إلى تعريفك بالأدوات المتعلقة بشرح النماذج المُدرَّبة على مجموعات البيانات غير المتوازنة.
تاليًا، سنستخدم حزمة تطوير البرامج (SDK) للذكاء الاصطناعي الموضّحة للتعرّف على الميزات التي يعتمد عليها نموذجنا لتقديم هذه التوقّعات.
6- استخدام حزمة تطوير البرامج (SDK) للذكاء الاصطناعي الموضَّح
توفّر حزمة تطوير البرامج (SDK) للذكاء الاصطناعي (AI) القابلة للشرح طرقًا مفيدة للحصول على تفسيرات عن نموذجك. ويتم تثبيت هذا النظام مسبقًا في مثيلات منصة Tensorflow AI Platform Notebook، وقد تم استيراده في ورقة الملاحظات في بداية الدرس. باستخدام حزمة SDK، يمكننا الحصول على سمات الميزات من نموذجنا ضمن مثيل ورقة الملاحظات، ما يعني أنّنا لسنا بحاجة إلى نشر نموذجنا على السحابة الإلكترونية لاستخدامه.
في هذا القسم، سنصدِّر النموذج الذي درَّبناه للتو كنموذج Tensorflow SaveModel، ثم نوجِّه حزمة تطوير البرامج (SDK) إلى مواد عرض النموذج المحفوظة للحصول على تفسيرات.
الخطوة 1: تصدير النموذج المدرَّب
أولاً، لنحفظ النموذج في دليل في مثيل دفتر الملاحظات:
model_dir = 'fraud_model'
tf.saved_model.save(model, model_dir)
في حال إعادة تحميل عرض المجلد في الشريط الجانبي الأيمن في ورقة الملاحظات، من المفترض أن يظهر لك دليل جديد تم إنشاؤه باسم fraud_model/
.
الخطوة 2: الحصول على البيانات الوصفية للشرح باستخدام حزمة تطوير البرامج (SDK)
بعد ذلك، سنوجِّه حزمة تطوير البرامج (SDK) للذكاء الاصطناعي الموضَّح إلى هذا الدليل. سيؤدي ذلك إلى إنشاء البيانات الوصفية اللازمة للحصول على تفسيرات النموذج. تعرض طريقة get_metadata()
البيانات الوصفية التي تستنتجها حزمة SDK من نموذجك، مثل أسماء الإدخالات:
model_builder = SavedModelMetadataBuilder(model_dir)
metadata = model_builder.get_metadata()
print(metadata)
تساعدنا التفسيرات في الإجابة على السؤال: "لماذا اعتقد نموذجنا أن هذا احتيال؟"
الخطوة 3: تحديد المتوقع لنموذجنا
بالنسبة إلى البيانات الجدولية، تعمل خدمة الذكاء الاصطناعي الموضَّح من خلال عرض قيم تحديد المصدر لكل ميزة. تشير هذه القيم إلى مدى تأثير خاصية معينة في التنبؤ. لنفترض أن مبلغ معاملة معينة قد تسبب في زيادة احتمالية الاحتيال المتوقعة بنسبة 0.2% في النموذج. قد تفكر "0.2٪ بالنسبة إلى ماذا؟؟". هذا يقودنا إلى مفهوم الخط القاعدي.
إن المتوقع لنموذجنا هو في الأساس ما تقارنه به. فنحن نختار القيمة المرجعية لكل ميزة في نموذجنا، ومن ثم يصبح التنبؤ الأساسي القيمة التي يتوقعها النموذج عند تعيين الميزات عند خط الأساس.
يعتمد اختيار خط أساس على مهمة التوقع التي تحلها. بالنسبة إلى الميزات العددية، من الشائع استخدام القيمة المتوسطة لكل ميزة في مجموعة البيانات كخط أساس. ومع ذلك، في حالة اكتشاف الاحتيال، فهذا ليس ما نرغب فيه. يهمنا توضيح الحالات التي يصنّف فيها نموذجنا المعاملة على أنّها احتيالية. وهذا يعني أن الحالة المرجعية التي نريد مقارنتها هي معاملات غير احتيالية.
لحساب ذلك، سنستخدم القيم المتوسطة للمعاملات غير الاحتيالية في مجموعة البيانات كمرجع. يمكننا الحصول على المتوسط باستخدام not_fraud_sample
DataFrame الذي استخلصناه أعلاه، وقياسه ليتطابق مع المُدخلات المتوقّعة لنموذجنا:
not_fraud_sample = not_fraud_sample.drop(columns=['nameOrig', 'nameDest', 'isFlaggedFraud', 'isFraud'])
baseline = scaler.transform(not_fraud_sample.values)
baseline = np.clip(baseline, -5, 5)
baseline_values = np.median(baseline, axis=0)
تجدر الإشارة إلى أننا لسنا بحاجة إلى تحديد خط أساس. وإذا لم يتم ذلك، ستستخدم حزمة تطوير البرامج (SDK) القيمة 0 كخط أساس لكل قيمة إدخال يتوقّعها نموذجنا. في حالة استخدام اكتشاف الاحتيال، يكون من المنطقي تحديد خط أساس، وهو ما سيتم تنفيذه أدناه:
input_name = list(metadata['inputs'])[0]
model_builder.set_numeric_metadata(input_name, input_baselines=[baseline_values.tolist()], index_feature_mapping=df.columns.tolist()[:6])
model_builder.save_metadata(model_dir)
باستخدام الطريقة save_metadata()
أعلاه، تم إنشاء ملف في دليل النموذج المسمى explanation_metadata.json
. في دفتر ملاحظاتك، انتقل إلى الدليل campaign_model/ للتأكد من إنشاء هذا الملف. يحتوي هذا على البيانات الوصفية التي ستستخدمها حزمة تطوير البرامج (SDK) لإنشاء عمليات تحديد مصدر الميزات.
الخطوة 4: الحصول على تفسيرات النماذج
نحن جاهزون الآن للحصول على إحالات الميزات للأمثلة الفردية. ولتنفيذ ذلك، سننشئ أولاً مرجعًا محليًا لنموذجنا باستخدام حزمة SDK:
local_model = explainable_ai_sdk.load_model_from_local_path(
model_dir,
explainable_ai_sdk.SampledShapleyConfig()
)
بعد ذلك، دعونا نحصل على توقّعات وتفسيرات عن نموذجنا من مثال معاملة يجب تصنيفها على أنّها احتيالية:
fraud_example = [0.722,0.139,-0.114,-0.258,-0.271,-0.305]
response = local_model.explain([{input_name: fraud_example}])
response[0].visualize_attributions()
يجب أن يؤدي تشغيل هذا إلى إنشاء تصور يبدو كما يلي:
في هذا المثال، كان الرصيد الأولي للحساب قبل إجراء المعاملة هو أكبر مؤشر على الاحتيال، مما أدى إلى رفع توقّع النموذج من المتوقع بمقدار أكثر من 0.5. كان مبلغ المعاملة والرصيد الناتج في حساب الوجهة والخطوة الأهم من بين المؤشرات الرئيسية التالية. في مجموعة البيانات، تشير "الخطوة" يمثّل وحدة زمنية (الخطوة الواحدة تساوي ساعة واحدة). يمكن أن تكون قيم تحديد المصدر سالبة أيضًا.
"خطأ تقريبي" المطبوع فوق التصورات تتيح لك معرفة مدى ثقتك في التفسير. وبشكلٍ عام، يعني وجود خطأ يزيد عن% 5 أنّك قد لا تتمكّن من الاعتماد على إحالات الميزة. تذكر أن تفسيراتك تكون جيدة فقط مثل بيانات التدريب والنموذج الذي استخدمته. يمكن أن يؤدي تحسين بيانات التدريب أو النموذج أو تجربة نموذج مرجعي مختلف إلى تقليل الخطأ التقريبي.
ويمكنك أيضًا تقليل هذا الخطأ من خلال زيادة عدد الخطوات المستخدمة في طريقة الشرح. يمكنك تغيير ذلك باستخدام حزمة تطوير البرامج (SDK) عن طريق إضافة مَعلمة path_count
إلى إعدادات الشرح (القيمة التلقائية هي 10 إذا لم تحدّد):
local_model = explainable_ai_sdk.load_model_from_local_path(
model_dir,
explainable_ai_sdk.SampledShapleyConfig(path_count=20)
)
هناك المزيد الذي يمكنك عمله باستخدام الذكاء الاصطناعي الموضَّح في هذا النموذج. بعض الأفكار تشمل:
- إرسال العديد من الأمثلة إلى نموذجنا وتقييم متوسط قيم الإحالة لمعرفة ما إذا كانت بعض الميزات أكثر أهمية بشكل عام. يمكننا استخدام ذلك لتحسين نموذجنا وربما إزالة الميزات غير المهمة.
- العثور على نتائج موجبة خاطئة يُبلغ عنها النموذج بأنّها عمليات احتيال ولكنّها تمثّل معاملات غير احتيالية، وفحص قيم تحديد المصدر الخاصة بها
- استخدام أساس مختلف ومعرفة مدى تأثير ذلك على قيم الإحالة
🎉 تهانينا. 🎉
لقد تعلّمت كيفية احتساب البيانات غير المتوازنة، وتدريب نموذج TensorFlow لرصد المعاملات الاحتيالية، واستخدام حزمة تطوير البرامج (SDK) للذكاء الاصطناعي الموضَّح للاطّلاع على الميزات التي يعتمد عليها نموذجك أكثر من غيرها لتقديم توقّعات فردية. يمكنك التوقف هنا إذا أردت. يهدف استخدام حزمة تطوير البرامج (SDK) في ورقة ملاحظات إلى تبسيط عملية تطوير النموذج من خلال منحك إمكانية الوصول إلى التفسيرات قبل نشر أي نموذج. فبعد الانتهاء من إنشاء نموذج يرضيك، قد يتم استخدامه للحصول على توقعات على نطاق واسع. إذا كان ذلك ينطبق عليك، انتقِل إلى الخطوة الاختيارية التالية. في حال الانتهاء، انتقِل مباشرةً إلى خطوة تنظيف البيانات.
7. اختياري: نشر النموذج في ميزة التوقّع في AI Platform
في هذه الخطوة، ستتعرَّف على كيفية نشر نموذجك في أداة التوقّع في AI Platform.
الخطوة 1: انسخ دليل النموذج المحفوظ إلى حزمة Cloud Storage.
من خلال خطوات حزمة تطوير البرامج (SDK) التي طبّقناها سابقًا، ستحصل على كل ما تحتاجه لنشر نموذجك في AI Platform. للاستعداد للنشر، عليك وضع مواد العرض SaveModel الخاصة بك وشرح البيانات الوصفية في حزمة Cloud Storage والتي يمكن لخدمة الذكاء الاصطناعي الموضَّح الاطّلاع عليها.
للقيام بذلك، سنقوم بتعريف بعض متغيرات البيئة. املأ القيم أدناه باسم مشروعك على Google Cloud واسم الحزمة التي تريد إنشاءها (يجب أن تكون فريدة عالميًا).
# Update these to your own GCP project and model
GCP_PROJECT = 'your-gcp-project'
MODEL_BUCKET = 'gs://storage_bucket_name'
نحن الآن جاهزون لإنشاء حزمة تخزين لتخزين مواد عرض نموذج TensorFlow التي تم تصديرها. سنوجّه منصة AI Platform إلى هذه الحزمة عندما ننشر النموذج.
نفِّذ الأمر gsutil
التالي من ورقة الملاحظات لإنشاء حزمة:
!gsutil mb -l 'us-central1' $MODEL_BUCKET
بعد ذلك، انسخ دليل النموذج المحلي في هذه الحزمة:
!gsutil -m cp -r ./$model_dir/* $MODEL_BUCKET/explanations
الخطوة 2: نشر النموذج
بعد ذلك، سنحدد بعض المتغيرات التي سنستخدمها في أوامر النشر:
MODEL = 'fraud_detection'
VERSION = 'v1'
model_path = MODEL_BUCKET + '/explanations'
يمكننا إنشاء النموذج باستخدام الأمر gcloud التالي:
!gcloud ai-platform models create $MODEL --region=us-central1
نحن الآن جاهزون لنشر أول إصدار من هذا النموذج باستخدام gcloud. سيستغرق نشر الإصدار من 5 إلى 10 دقائق تقريبًا:
!gcloud beta ai-platform versions create $VERSION \
--model $MODEL \
--origin $model_path \
--runtime-version 2.1 \
--framework TENSORFLOW \
--python-version 3.7 \
--machine-type n1-standard-4 \
--explanation-method 'sampled-shapley' \
--num-paths 10 \
--region=us-central1
في العلامة origin
، نمرر في موقع Cloud Storage للنموذج المحفوظ وملف البيانات الوصفية. يستخدم الذكاء الاصطناعي الموضَّح حاليًا طريقتَين مختلفتَين للتفسير للنماذج الجدولية. هنا نستخدم عينة من Shapley. تشير المعلمة num-paths
إلى عدد المسارات التي تم أخذ عينات منها لكل ميزة من ميزات الإدخال. وبشكلٍ عام، كلما كان النموذج أكثر تعقيدًا، زادت الحاجة إلى خطوات تقريبية للوصول إلى تقارب معقول.
للتأكّد من نشر النموذج بشكل صحيح، يمكنك تشغيل الأمر gcloud التالي:
!gcloud ai-platform versions describe $VERSION --model $MODEL --region=us-central1
يجب أن تكون الولاية READY
.
الخطوة 3: الحصول على توقّعات وتفسيرات بشأن النموذج المنشور
ولأغراض التوضيح، نولي أهمية كبرى لشرح الحالات التي يتنبأ فيها نموذجنا بالاحتيال. سنُرسل إلى نموذجنا 5 أمثلة اختبار تمثل جميعها معاملات احتيالية.
سنستخدم Google Cloud CLI للحصول على توقعات. شغّل الرمز التالي للحصول على مؤشرات جميع أمثلة الاحتيال من مجموعة الاختبار:
fraud_indices = []
for i,val in enumerate(test_labels):
if val == 1:
fraud_indices.append(i)
بعد ذلك سنحفظ 5 أمثلة بالتنسيق الذي يتوقعه نموذجنا، ونكتبها في ملف:
num_test_examples = 5
instances = []
for i in range(num_test_examples):
ex = test_set[fraud_indices[i]]
instances.append({input_name: ex.tolist()})
with open('prediction.json', 'a') as outputfile:
json.dump({"instances": instances}, outputfile)
يمكننا إرسال هذه الأمثلة الخمسة إلى نموذجنا باستخدام gcloud:
!gcloud beta ai-platform explain \
--model=$MODEL \
--version=$VERSION \
--region='us-central1' \
--json-request=prediction.json
في استجابة JSON، ستظهر لك قيم تحديد المصدر لكل ميزة في هذه الأمثلة. ويتضمّن مفتاح example_score
لكل مثال توقّع النموذج، وهو في هذه الحالة النسبة المئوية لمدى احتمال أن تكون معاملة معيّنة احتيالية.
8. تنظيف
إذا أردت مواصلة استخدام ورقة الملاحظات هذه، ننصحك بإيقافها عندما لا تكون قيد الاستخدام. من واجهة مستخدم Notebooks في Cloud Console، اختَر ورقة الملاحظات ثم انقر على إيقاف:
إذا كنت ترغب في حذف جميع الموارد التي أنشأتها في هذا التمرين المعملي، فاحذف مثيل دفتر الملاحظات بدلاً من إيقافه.
باستخدام قائمة التنقّل في Cloud Console، انتقِل إلى "مساحة التخزين" واحذف كلتا المجموعتَين اللتين أنشأتهما لتخزين مواد عرض نموذجك.