إنشاء نموذج لرصد الاحتيال على Cloud AI Platform باستخدام TensorFlow Enterprise وBigQuery

1. نظرة عامة

في هذا التمرين العملي، ستنقل مجموعة بيانات BigQuery مباشرةً وتدرّب نموذجًا لرصد الاحتيال باستخدام TensorFlow Enterprise على منصة AI Platform من Google Cloud.

ما ستتعرّف عليه

ستتعرَّف على كيفية:

  • تحليل البيانات على BigQuery
  • نقل البيانات باستخدام أداة ربط BigQuery في TensorFlow Enterprise
  • إنشاء نموذج للتعليم المعمّق لرصد الاحتيال باستخدام مجموعة بيانات غير متوازنة

2. تحليل البيانات في BigQuery

يجب أن يكون لديك مشروع على Google Cloud Platform مع تفعيل الفوترة لتتمكّن من تنفيذ هذا الدرس العملي. لإنشاء مشروع، اتّبِع التعليمات هنا.

الخطوة 1: الوصول إلى مجموعة البيانات العامة في BigQuery

اتّبِع هذا الرابط للوصول إلى مجموعات البيانات المتاحة للجميع في BigQuery من خلال وحدة تحكّم Google Cloud.

في "شجرة الموارد" (Resources Tree) في أسفل يمين الصفحة، ستظهر لك قائمة بمجموعات البيانات. تنقَّل بين مجموعات البيانات المتاحة إلى أن تعثر على ml-datasets، ثم اختَر جدول ulb-fraud-detection ضِمنها:

d5e78261514a90ef.png

انقر على كل علامة تبويب لمعرفة المزيد عن مجموعة البيانات:

  • تعرض علامة التبويب المخطط أنواع البيانات.
  • توضّح علامة التبويب التفاصيل أنّ هذه مجموعة بيانات غير متوازنة تتضمّن 284,407 معاملات، منها 492 معاملة احتيالية.
  • تعرض علامة التبويب معاينة السجلات من مجموعة البيانات.

الخطوة 2: طلب البحث في الجدول

توضّح علامة التبويب "التفاصيل" ما يلي عن البيانات:

  • الوقت هو عدد الثواني بين المعاملة الأولى في مجموعة البيانات ووقت المعاملة المحدّدة.
  • V1-V28 هي أعمدة تم تحويلها باستخدام تقنية لخفض الأبعاد تُعرف باسم PCA، وقد أخفت هذه التقنية هوية البيانات.
  • المبلغ هو مبلغ المعاملة.

لنلقِ نظرة عن كثب من خلال النقر على جدول طلبات البحث لتشغيل طلب بحث:

581e596426a98383.png

عدِّل العبارة لإضافة علامة النجمة (*) لعرض جميع الأعمدة، ثم انقر على تنفيذ.

SELECT * FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection` LIMIT 1000

الخطوة 3: تحليل البيانات

يوفّر BigQuery عددًا من الدوال الإحصائية. لنلقِ نظرة على كيفية ارتباط البيانات بالمتغيّر المستهدف Class.

SELECT CORR(Time,Class) as TimeCorr, CORR(V1,Class) as V1Corr, CORR(V2,Class) as V2Corr, CORR(Amount,Class) as AmountCorr FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`

e1e98a8315b62e9e.png

سيوفّر الارتباط نطاقًا من -1 (مرتبط بشكل سلبي) إلى 1 (مرتبط بشكل إيجابي)، مع اعتبار 0 قيمة مستقلة.

يُرجى العِلم أنّ V1 وV2 مرتبطتان بشكل طفيف بالمتغير المستهدَف (حوالي -0.1 و0 .1 على التوالي).

لا نرى ارتباطًا كبيرًا بالوقت. قد يشير الارتباط السلبي الطفيف إلى أنّ هناك عددًا أقل من المعاملات الاحتيالية بمرور الوقت في مجموعة البيانات.

المبلغ لديه ارتباط أقلّ، ما يشير إلى أنّ المعاملات الاحتيالية من المرجّح أن تحدث بشكل طفيف في مبالغ المعاملات الأعلى.

الخطوة 4: احتساب القيم المتوسطة لتوسيع نطاق الميزات

يمكن أن يساعد تطبيع قيم الميزات في تسريع عملية التقارب في الشبكة العصبية. ويتمثل أحد المخططات الشائعة في توسيط القيم حول 0 بانحراف عادي يبلغ 1. سيستردّ الاستعلام التالي القيم المتوسطة. ليس من الضروري حفظ النتيجة، لأنّنا سنحصل على مقتطف رمز لذلك لاحقًا.

ستلاحظ أيضًا أنّ طلب البحث يتضمّن عبارة WHERE مثيرة للاهتمام. سنتناول ذلك في القسم التالي عند شرح كيفية تقسيم البيانات بين مجموعات التدريب والاختبار.

SELECT
   AVG(Time), AVG(V1), AVG(V2), AVG(V3), AVG(V4), AVG(V5), AVG(V6), AVG(V7), AVG(V8),
   AVG(V9), AVG(V10),AVG(V11), AVG(V12), AVG(V13), AVG(V14), AVG(V15), AVG(V16),
   AVG(V17), AVG(V18), AVG(V19), AVG(V20), AVG(V21), AVG(V22), AVG(V23), AVG(V24),
   AVG(V25), AVG(V26), AVG(V27),AVG(V28), AVG(Amount)
FROM
   `bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE
   MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),
   SAFE_CAST(Amount AS STRING)))),10) < 8

الخطوة 5: تقسيم البيانات

من الشائع استخدام 3 مجموعات بيانات عند إنشاء نموذج تعلُّم آلي:

  • التدريب: يُستخدم لإنشاء النموذج من خلال تعديل المَعلمات بشكل متكرّر
  • التحقّق من الصحة: يُستخدم لتقييم ما إذا كان النموذج يفرط في التخصيص من خلال التحقّق من بيانات مستقلة أثناء عملية التدريب
  • الاختبار: يُستخدم بعد إنشاء النموذج لتقييم الدقة

في هذا الدرس التطبيقي حول الترميز، سنستخدم تقسيمًا بنسبة 80/10/10 للتدريب والتحقّق والاختبار.

سنضع كل مجموعة بيانات في جدول خاص بها في BigQuery. الخطوة الأولى هي إنشاء "مجموعة بيانات" في BigQuery، وهي عبارة عن حاوية للجداول ذات الصلة. بعد اختيار مشروعك، انقر على إنشاء مجموعة بيانات.

1084d9f5edbf760b.png

بعد ذلك، أنشئ مجموعة بيانات باسم tfe_codelab لتضمين جداول التدريب والتحقّق والاختبار.

e5b8646ebdf5f272.png

الآن، سننفّذ 3 طلبات بحث للتدريب والاختبار والتحقّق من الصحة، وسنحفظ البيانات ضمن مجموعة البيانات الجديدة tfe_codelab.

في "محرّر طلب البحث"، شغِّل طلب بحث لإنشاء بيانات التدريب:

SELECT *
FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),SAFE_CAST(Amount AS STRING)))),10) < 8

عند اكتمال طلب البحث، احفظ النتائج في جدول BigQuery.

49d20c9b4b62f6a7.png

ضمن مجموعة البيانات tfe_codelab التي أنشأتها للتو، سمِّ الجدول ulb_fraud_detection_train واحفظ البيانات.

6d83cf113a0682e1.png

تقسّم عبارة WHERE البيانات أولاً عن طريق حساب قيمة تجزئة في عمودَين. بعد ذلك، يتم اختيار الصفوف التي يكون فيها باقي قيمة التجزئة عند قسمتها على 10 أقل من 80، ما يمنحنا نسبة %80.

لنكرّر الآن العملية نفسها لمجموعات التحقّق والاختبار باستخدام طلبات بحث مشابهة تختار% 10 من البيانات لكلّ منها.

التحقّق من الصحة

SELECT *
FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),SAFE_CAST(Amount AS STRING)))),10) = 8

احفظ نتائج طلب البحث هذا في جدول باسم ulb_fraud_detection_val.

الاختبار

SELECT *
FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),SAFE_CAST(Amount AS STRING)))),10) = 9

احفظ نتائج طلب البحث هذا في جدول باسم ulb_fraud_detection_test.

3- إعداد بيئة "دفتر الملاحظات"

بعد أن قدّمنا مقدمة موجزة عن البيانات، لننتقل الآن إلى إعداد بيئة تطوير النموذج.

الخطوة 1: تفعيل واجهات برمجة التطبيقات

يستخدم موصِّل BigQuery واجهة BigQuery Storage API. ابحث عن BigQuery Storage API في وحدة التحكّم وفعِّل واجهة برمجة التطبيقات إذا كانت غير مفعّلة حاليًا.

9895a2fd3cdf8f8c.png

الخطوة 2: إنشاء مثيل من AI Platform Notebooks

انتقِل إلى قسم "دفاتر ملاحظات AI Platform" في Cloud Console وانقر على إنشاء مثيل جديد. بعد ذلك، اختَر أحدث نوع مثيل TensorFlow Enterprise 1.x بدون وحدات معالجة الرسومات:

35301141e9fd3f44.png

استخدِم الخيارات التلقائية، ثم انقر على إنشاء. بعد إنشاء المثيل، انقر على فتح JupyterLab:

3b801f8ff3db0f2f.png

بعد ذلك، أنشئ دفتر ملاحظات Python 3 من JupyterLab:

58523671a252b95a.png

4. استيعاب السجلات من BigQuery

الخطوة 1: استيراد حِزم Python

في الخلية الأولى من دفتر الملاحظات، أضِف عمليات الاستيراد التالية وشغِّل الخلية. يمكنك تشغيله من خلال الضغط على زر السهم المتّجه لليسار في القائمة العلوية أو الضغط على command-enter:

import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers as layers

from tensorflow_io.bigquery import BigQueryClient

import functools

tf.enable_eager_execution()

الخطوة 2: تحديد الثوابت

لنحدّد بعد ذلك بعض الثوابت لاستخدامها في المشروع. غيِّر GCP_PROJECT_ID إلى رقم تعريف المشروع الفعلي الذي تستخدمه. يمكنك المتابعة وتنفيذ خلايا جديدة أثناء إنشائها.

GCP_PROJECT_ID = '<YOUR_PROJECT_ID>'
DATASET_GCP_PROJECT_ID = GCP_PROJECT_ID # A copy of the data is saved in the user project
DATASET_ID = 'tfe_codelab'
TRAIN_TABLE_ID = 'ulb_fraud_detection_train'
VAL_TABLE_ID = 'ulb_fraud_detection_val'
TEST_TABLE_ID = 'ulb_fraud_detection_test'

FEATURES = ['Time','V1','V2','V3','V4','V5','V6','V7','V8','V9','V10','V11','V12','V13','V14','V15','V16','V17','V18','V19','V20','V21','V22','V23','V24','V25','V26','V27','V28','Amount']
LABEL='Class'
DTYPES=[tf.float64] * len(FEATURES) + [tf.int64]

الخطوة 3: تحديد الدوال المساعدة

والآن، لنحدّد بعض الدوال. تقرأ الدالة read_session() البيانات من جدول BigQuery. أما الدالة extract_labels() فهي دالة مساعدة لفصل عمود التصنيف عن بقية الأعمدة، حتى تكون مجموعة البيانات بالتنسيق الذي تتوقّعه الدالة keras.model_fit() لاحقًا.

client = BigQueryClient()

def read_session(TABLE_ID):
    return client.read_session(
        "projects/" + GCP_PROJECT_ID, DATASET_GCP_PROJECT_ID, TABLE_ID, DATASET_ID,
        FEATURES + [LABEL], DTYPES, requested_streams=2
)

def extract_labels(input_dict):
  features = dict(input_dict)
  label = tf.cast(features.pop(LABEL), tf.float64)
  return (features, label)

الخطوة 4: استيعاب البيانات

أخيرًا، لننشئ كل مجموعة بيانات ثم نطبع الدفعة الأولى من مجموعة بيانات التدريب. يُرجى العِلم أنّنا حدّدنا BATCH_SIZE بقيمة 32. هذه مَعلمة مهمة ستؤثر في سرعة التدريب ودقته.

BATCH_SIZE = 32

raw_train_data = read_session(TRAIN_TABLE_ID).parallel_read_rows().map(extract_labels).batch(BATCH_SIZE)
raw_val_data = read_session(VAL_TABLE_ID).parallel_read_rows().map(extract_labels).batch(BATCH_SIZE)
raw_test_data = read_session(TEST_TABLE_ID).parallel_read_rows().map(extract_labels).batch(BATCH_SIZE)

next(iter(raw_train_data)) # Print first batch

5- إنشاء نموذج

الخطوة 1: المعالجة المُسبقة للبيانات

لننشئ أعمدة ميزات لكل ميزة في مجموعة البيانات. في مجموعة البيانات هذه، جميع الأعمدة من النوع numeric_column، ولكن هناك عدد من أنواع الأعمدة الأخرى (مثل categorical_column).

وكما ذكرنا سابقًا، سنعمل أيضًا على تسوية البيانات لتكون متمركزة حول الصفر، وذلك لكي تتقارب الشبكة بشكل أسرع. لقد حسبنا مسبقًا متوسط كل ميزة لاستخدامه في هذا الحساب.

MEANS = [94816.7387536405, 0.0011219465482001268, -0.0021445914636999603, -0.002317402958335562,
         -0.002525792169927835, -0.002136576923287782, -3.7586818983702984, 8.135919975738768E-4,
         -0.0015535579268265718, 0.001436137140461279, -0.0012193712736681508, -4.5364970422902533E-4,
         -4.6175444671576083E-4, 9.92177789685366E-4, 0.002366229151475428, 6.710217226762278E-4,
         0.0010325807119864225, 2.557260815835395E-4, -2.0804190062322664E-4, -5.057391100818653E-4,
         -3.452114767842334E-6, 1.0145936326270006E-4, 3.839214074518535E-4, 2.2061197469126577E-4,
         -1.5601580596677608E-4, -8.235017846415852E-4, -7.298316615408554E-4, -6.898459943652376E-5,
         4.724125688297753E-5, 88.73235686453587]

def norm_data(mean, data):
  data = tf.cast(data, tf.float32) * 1/(2*mean)
  return tf.reshape(data, [-1, 1])

numeric_columns = []

for i, feature in enumerate(FEATURES):
  num_col = tf.feature_column.numeric_column(feature, normalizer_fn=functools.partial(norm_data, MEANS[i]))
  numeric_columns.append(num_col)

numeric_columns

الخطوة 2: إنشاء النموذج

نحن الآن جاهزون لإنشاء نموذج. سنقدّم الأعمدة التي أنشأناها للتو إلى الشبكة. بعد ذلك، سنجمّع النموذج. نضيف مقياس مساحة تحت المنحنى (AUC) للدقة/الاستدعاء، وهو مفيد لمجموعات البيانات غير المتوازنة.

model = keras.Sequential([
    tf.keras.layers.DenseFeatures(numeric_columns),
    layers.Dense(64, activation='relu'),
    layers.Dense(64, activation='relu'),
    layers.Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy', tf.keras.metrics.AUC(curve='PR')])

الخطوة 3: تدريب النموذج

هناك عدد من الأساليب لمعالجة البيانات غير المتوازنة، بما في ذلك أخذ عيّنات زائدة (إنشاء بيانات جديدة في الفئة الأقل تمثيلاً) وأخذ عيّنات ناقصة (تقليل البيانات في الفئة الأكثر تمثيلاً).

لأغراض هذا الدرس التطبيقي، لنستخدِم أسلوبًا يركّز بشكل كبير على الخسارة عند تصنيف الفئة الأقلية بشكل خاطئ. سنحدّد مَعلمة class_weight عند التدريب ونعطي الوزن "1" (احتيال) أهمية أكبر، لأنّه أقل شيوعًا.

سنستخدم 3 دورات (عمليات تمرير البيانات) في هذا الدرس التطبيقي ليكون التدريب أسرع. في سيناريو واقعي، نريد تشغيله لفترة كافية إلى أن نتوقف عن رؤية زيادات في دقة مجموعة التحقّق.

CLASS_WEIGHT = {
    0: 1,
    1: 100
}
EPOCHS = 3

train_data = raw_train_data.shuffle(10000)
val_data = raw_val_data
test_data = raw_test_data

model.fit(train_data, validation_data=val_data, class_weight=CLASS_WEIGHT, epochs=EPOCHS)

الخطوة 4: تقييم النموذج

يمكن تطبيق الدالة evaluate() على بيانات الاختبار التي لم يسبق للنموذج رؤيتها لتقديم تقييم موضوعي. لحسن الحظ، خصّصنا بيانات اختبار لهذا الغرض.

model.evaluate(test_data)

الخطوة 5: الاستكشاف

في هذا المختبر، أوضحنا كيفية استيعاب مجموعة بيانات كبيرة من BigQuery مباشرةً في نموذج TensorFlow Keras. وقد شرحنا أيضًا جميع خطوات إنشاء نموذج. أخيرًا، تعرّفنا على بعض الطرق للتعامل مع مشاكل التصنيف غير المتوازن.

لا تتردد في مواصلة تجربة بنى وأساليب مختلفة لمجموعة البيانات غير المتوازنة، لمعرفة ما إذا كان بإمكانك تحسين الدقة.

6. تنظيف

إذا أردت مواصلة استخدام دفتر الملاحظات هذا، ننصحك بإيقافه عندما لا يكون قيد الاستخدام. من واجهة مستخدم Notebooks في Cloud Console، اختَر دفتر الملاحظات، ثم انقر على إيقاف:

57213ef2edad9257.png

إذا أردت حذف جميع المراجع التي أنشأتها في هذا المختبر، ما عليك سوى حذف مثيل دفتر الملاحظات بدلاً من إيقافه.

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