توقُّع الاحتيال والتحليل الجغرافي المكاني لدرس تطبيقي حول الترميز الخاص بمجموعة بيانات الخدمات المصرفية للبيع بالتجزئة

1. مقدمة

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

وبعد ذلك، يمكنك استخدام BQML لإنشاء نموذج انحدار لوجستي للتنبؤ بما إذا كانت المعاملة احتيالية استنادًا إلى بيانات التدريب التي نقدّمها. تتمثل إحدى الميزات الرائعة لـ BQ ML في أنها تعتني بالفرط، بحيث لا تؤثر بيانات التدريب لدينا على أداء النموذج في البيانات الجديدة. وأخيرًا، تقوم بإنشاء ثلاث عينات من المعاملات ذات خصائص مختلفة وتنبأ بما إذا كانت احتيالية أم لا تستخدم النموذج.

ما سوف تتعلمه

في هذه الميزة الاختبارية، ستتعرّف على كيفية تنفيذ المهام التالية:

  • تحميل مجموعة البيانات من حزمة Google Cloud Storage
  • إنشاء بيانات التدريب
  • إنشاء نموذج الانحدار اللوجستي وتدريبه
  • استخدام النموذج للتنبؤ بما إذا كانت عينة المعاملات احتيالية أم لا
  • حدِّد المعاملات الاحتيالية من خلال الرمز البريدي باستخدام التحليل الجغرافي المكاني

2. تحميل مجموعة بيانات من حزمة GCS

في هذه المهمة، يمكنك إنشاء مجموعة بيانات تسمى bq_demo وتحميلها مع بيانات الخدمات المصرفية للبيع بالتجزئة من حزمة GCS. سيؤدي هذا الإجراء إلى حذف أي بيانات حالية موجودة من قبل في جداولك.

فتح Cloud Shell

  1. في Cloud Console، في شريط الأدوات العلوي الأيسر، انقر على الزر "تفعيل Cloud Shell".

3c0c949fe3626208.png

  1. بعد تحميل Cloud Shell، اكتب:
bq rm -r -f -d bq_demo
bq rm -r -f -d bq_demo_shared
bq mk --dataset bq_demo
bq load --replace --autodetect --source_format=CSV bq_demo.account gs://retail-banking-looker/account
bq load --replace --autodetect --source_format=CSV bq_demo.base_card gs://retail-banking-looker/base_card
bq load --replace --autodetect --source_format=CSV bq_demo.card gs://retail-banking-looker/card
bq load --replace --autodetect --source_format=CSV bq_demo.card_payment_amounts gs://retail-banking-looker/card_payment_amounts
bq load --replace --autodetect --source_format=CSV bq_demo.card_transactions gs://retail-banking-looker/card_transactions
bq load --replace --autodetect --source_format=CSV bq_demo.card_type_facts gs://retail-banking-looker/card_type_facts
bq load --replace --autodetect --source_format=CSV bq_demo.client gs://retail-banking-looker/client
bq load --replace --autodetect --source_format=CSV bq_demo.disp gs://retail-banking-looker/disp
bq load --replace --autodetect --source_format=CSV bq_demo.loan gs://retail-banking-looker/loan
bq load --replace --autodetect --source_format=CSV bq_demo.order gs://retail-banking-looker/order
bq load --replace --autodetect --source_format=CSV bq_demo.trans gs://retail-banking-looker/trans
  1. وبعد الانتهاء، انقر على X لإغلاق الوحدة الطرفية في Cloud Shell. لقد حمَّلت مجموعة بيانات من حزمة Google Cloud Storage بنجاح.

3- إنشاء بيانات التدريب

طلب بحث عن المعاملات الاحتيالية لكل نوع بطاقة

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

[المناقشة التنافسية: على عكس بعض المنافسين، لا يتطلب BigQuery تصدير البيانات في مستودع البيانات إلى حزمة تخزين وتشغيل خوارزميات تعلُّم الآلة ثم نسخ النتائج إلى قاعدة البيانات. ويمكن تنفيذ كل هذه الإجراءات، ما يحافظ على أمان البيانات ولا يؤدي إلى "توسع البيانات".]

  1. افتح وحدة تحكم BigQuery:

في Google Cloud Console، اختَر قائمة التنقل > BigQuery.

dfdbd753a900e349.png

  1. يتم فتح مربع رسالة "مرحبًا بك في BigQuery" في Cloud Console. يوفر مربع الرسالة هذا رابطًا إلى دليل البدء السريع وملاحظات الإصدار.

انقر على "تم".

يتم فتح وحدة تحكم BigQuery.

2982953ee582e477.png

  1. تشغيل الاستعلام في محرر الاستعلام:
SELECT c.type, count(trans_id) as fraud_transactions
FROM bq_demo.card_transactions AS t 
JOIN bq_demo.card c ON t.cc_number = c.card_number
WHERE t.is_fraud=1
GROUP BY type

ولكن ماذا لو استطعنا استخدام هذه البيانات للتنبؤ بالمعاملات الاحتيالية حتى قبل أن يلاحظ العميل؟ تعلُّم الآلة ليس للخبراء فقط. باستخدام BigQuery، يمكن للمحلّلين تشغيل نماذج تعلُّم الآلة العالمية مباشرةً على بيانات مستودع البيانات باستخدام لغة الاستعلامات البنيوية (SQL).

إنشاء بيانات التدريب

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

تشغيل الاستعلام في محرر الاستعلام:

CREATE OR REPLACE TABLE bq_demo.training_data as (
  SELECT
    card_transactions.trans_id  AS trans_id,
    card_transactions.is_fraud  AS is_fraud,
    --amount for transaction: higher amounts are more likely to be fraud
    cast(card_transactions.amount as FLOAT64)  AS card_transactions_amount,
    --distance from the customers home: further distances are more likely to be fraud
    ST_DISTANCE((ST_GEOGPOINT((cast(card_transactions.merchant_lon as FLOAT64)),
            (cast(card_transactions.merchant_lat as FLOAT64)))), (ST_GeogPoint((cast(SPLIT(client.address,'|')[OFFSET(4)] as float64)),
            (cast(SPLIT(client.address,'|')[OFFSET(3)] as float64)))))  AS card_transactions_transaction_distance,
    --hour that transaction occured: fraud occurs in middle of night (usually between midnight and 4 am)
    EXTRACT(HOUR FROM TIMESTAMP(CONCAT(card_transactions.trans_date,' ',card_transactions.trans_time)) ) AS card_transactions_transaction_hour_of_day
  FROM bq_demo.card_transactions  AS card_transactions
  LEFT JOIN bq_demo.card  AS card ON card.card_number = card_transactions.cc_number
  LEFT JOIN bq_demo.disp  AS disp ON card.disp_id = disp.disp_id
  LEFT JOIN bq_demo.client  AS client ON disp.client_id = client.client_id );

ضمن "النتائج" انقر فوق "الانتقال إلى الجدول" ومن المفترض أن تظهر لك النتيجة التالية:

c03442924d2dc7f3.png

4. إنشاء النموذج وتدريبه

استخدام BQML لإنشاء نموذج انحدار لوجستي للتنبؤ بما إذا كانت المعاملة احتيالية استنادًا إلى بيانات التدريب التي تم إنشاؤها في الخطوة السابقة. تتمثل إحدى الميزات الرائعة لـ BQML في أنها تعتني بفرط التخصيص، بحيث لا تؤثر بيانات التدريب الخاصة بنا على أداء النموذج في البيانات الجديدة.

تشغيل الاستعلام في محرر الاستعلام:

CREATE OR REPLACE MODEL bq_demo.fraud_prediction
    OPTIONS(model_type='logistic_reg', labels=['is_fraud']) AS
    SELECT * EXCEPT(trans_id)
    FROM bq_demo.training_data
    WHERE (is_fraud = 1) OR 
            (is_fraud = 0 AND rand() <= 
                (SELECT SUM(is_fraud)/COUNT(*) FROM bq_demo.training_data));

عرض تفاصيل النموذج

ضمن "النتائج"، انقر على "الانتقال إلى النموذج".

9417986e0fa45427.png

من المفترض أن تظهر لك علامات التبويب "Schema" و"Training" و"التقييم".

ضمن علامة التبويب "التدريب"، من المفترض أن يظهر لك ما يلي:

cb6b11a01816ba74.png

ضمن "علامة التبويب "التقييم"، من المفترض أن يظهر لك ما يلي:

ff47d42700a79544.png

ضمن "علامة تبويب المخطط"، من المفترض أن يظهر لك ما يلي:

edfd13025ed64705.png

5- استخدام النموذج للتنبؤ بالاحتيال

والآن، يمكننا استخدام النموذج للتنبؤ بما إذا كانت إحدى المعاملات قد تنطوي على احتيال أم لا. سنُنشئ 3 نماذج للمعاملات ذات الخصائص المختلفة.

تشغيل الاستعلام التالي في محرر الاستعلام:

SELECT * FROM ML.PREDICT(MODEL bq_demo.fraud_prediction, (
  SELECT '001' as trans_id, 500.00 as card_transactions_amount, 600 as card_transactions_transaction_distance, 2 as card_transactions_transaction_hour_of_day
    UNION ALL
  SELECT '002' as trans_id, 5.25 as card_transactions_amount, 2 as card_transactions_transaction_distance, 13 as card_transactions_transaction_hour_of_day
    UNION ALL
  SELECT '003' as trans_id, 175.50 as card_transactions_amount, 45 as card_transactions_transaction_distance, 10 as card_transactions_transaction_hour_of_day
  ), STRUCT(0.55 AS threshold)
);

من المفترض أن تظهر لك نتائج على النحو التالي:

c3c25d3652e45c9c.png

فكما ترى، يكاد يكون من المؤكد أن المعاملة الأولى احتيالية استنادًا إلى النموذج الذي نستخدمه، في حين نتوقع ألا تكون المعاملات الثانية والثالثة احتيالية. وقد تم ضبط الحدّ الأدنى على %55، بدلاً من النسبة التلقائية البالغة %50. ويمكننا تطبيق نموذجنا ببيانات إضافية أو إضافة سمات أخرى لتحسين الدقّة.

6- حدِّد المعاملات الاحتيالية من خلال الرمز البريدي باستخدام التحليل الجغرافي المكاني

يحتوي BigQuery على دعم كبير للبيانات الجغرافية المكانية. في ما يلي مثال يستخدم دالة GIS ST_WITHIN لتحديد الرمز البريدي وفقًا لخط العرض وخط الطول لمعاملات التجّار باستخدام مجموعة بيانات عامة من حدود الرمز البريدي.

قم بتشغيل التعليمة البرمجية التالية في محرر الاستعلام:

WITH trans_by_zip as (
  SELECT
    card_transactions.trans_id,
    zip_code AS merchant_zip,
    city as merchant_city,
    county as merchant_county,
    state_name as merchant_state
  FROM
    bq_demo.card_transactions AS card_transactions,
    bigquery-public-data.geo_us_boundaries.zip_codes AS zip_codes
  WHERE ST_Within(ST_GEOGPOINT((cast(card_transactions.merchant_lon as FLOAT64)),(cast(card_transactions.merchant_lat as FLOAT64))),zip_codes.zip_code_geom)
)
SELECT merchant_zip, 1.0 * (SUM(is_fraud)) / nullif((COUNT(*)),0) AS percent_transactions_fraud
FROM bq_demo.card_transactions t, trans_by_zip
WHERE t.trans_id = trans_by_zip.trans_id
GROUP BY merchant_zip
ORDER BY percent_transactions_fraud DESC;

من المفترض أن تظهر لك النتائج التالية:

6f0dfb6d93c0be11.png

يتّضح مما سبق أنّ معدّل الاحتيال في معظم الرموز البريدية صغير نسبيًا (أقل من 2%)، ولكن معدّل الاحتيال في عام 69345 يبلغ 11% بشكل مفاجئ. ربما يكون هذا شيئًا نريد التحقيق فيه.