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

1. نظرة عامة

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

المعلومات التي تطّلع عليها

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

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

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

ستحتاج إلى مشروع Google Cloud Platform مع تفعيل الفوترة لتشغيل هذا الدرس التطبيقي حول الترميز. لإنشاء مشروع، يُرجى اتّباع التعليمات هنا.

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

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

في شجرة الموارد في أسفل الجانب الأيسر، سترى قائمة بمجموعات البيانات. تنقَّل في مجموعات البيانات المتاحة حتى تعثر على ml-datasets، ثم اختَر جدول ulb-fraud-detection داخله:

d5e78261514a90ef.png

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

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

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

تخبرنا علامة تبويب التفاصيل بهذه البيانات:

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

لنلقي نظرة فاحصة بالنقر على جدول طلبات البحث لتشغيل طلب بحث:

581e596426a98383.png

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

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 واجهة Storage API في BigQuery. ابحث عن BigQuery Storage API في وحدة التحكّم وفعِّل واجهة برمجة التطبيقات إذا كانت غير مفعَّلة حاليًا.

9895a2fd3cdf8f8c.png

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

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

35301141e9fd3f44.png

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

3b801f8ff3db0f2f.png

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

58523671a252b95a.png

4. نقل السجلّات من BigQuery

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

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

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() هي دالة مساعدة لفصل عمود التصنيف عن الباقي، لكي تكون مجموعة البيانات بالتنسيق الذي تتوقعه الدالة extract_labels() لاحقًا.

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: البيانات قبل المعالجة

لننشئ أعمدة خصائص لكل خاصية في مجموعة البيانات. في مجموعة البيانات هذه بالتحديد، تكون جميع الأعمدة من نوع number_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: تقييم النموذج

يمكن تطبيق الدالة rating() لاختبار البيانات التي لم يسبق أن شاهدها النموذج لتقديم تقييم موضوعي. لحسن الحظ، خصصنا بيانات اختبارية لهذا الغرض!

model.evaluate(test_data)

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

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

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

6- تنظيف

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

57213ef2edad9257.png

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

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