پیش‌بینی تقلب و تحلیل مکانی برای مجموعه داده‌های بانکداری خرده‌فروشی Codelab

1. مقدمه

در این آزمایشگاه، شما یک مدل رگرسیون خطی ایجاد می‌کنید تا پیش‌بینی کنید که آیا تراکنش‌های اخیر با استفاده از SQL در BigQuery تقلبی هستند یا خیر. شما یک مجموعه داده آموزشی ایجاد می‌کنید که شامل هر تراکنش کارت و برخی از ویژگی‌هایی است که ما تصمیم گرفته‌ایم به بهترین وجه تقلب را نشان دهیم، مانند فاصله از منزل مشتری، زمان روز و مبلغ تراکنش.

سپس از BQML برای ساخت یک مدل رگرسیون لجستیک برای پیش‌بینی تقلبی بودن یک تراکنش بر اساس داده‌های آموزشی ما استفاده می‌کنید. یکی از ویژگی های خوب BQ ML این است که از بیش از حد برازش مراقبت می کند، به طوری که داده های آموزشی ما بر عملکرد مدل در داده های جدید تأثیر نمی گذارد. در نهایت شما سه تراکنش نمونه با ویژگی‌های متفاوت ایجاد می‌کنید و پیش‌بینی می‌کنید که آیا از مدل تقلبی هستند یا استفاده نمی‌کنند.

آنچه خواهید آموخت

در این آزمایشگاه می آموزید که چگونه وظایف زیر را انجام دهید:

  • مجموعه داده را از یک سطل فضای ذخیره سازی ابری Google بارگیری کنید
  • ایجاد داده های آموزشی
  • ایجاد و آموزش مدل رگرسیون لجستیک
  • از مدل برای پیش بینی تقلبی بودن یا نبودن تراکنش های نمونه استفاده کنید
  • شناسایی تراکنش تقلب با کد پستی با استفاده از تجزیه و تحلیل جغرافیایی

2. مجموعه داده را از یک سطل GCS بارگیری کنید

در این کار، یک مجموعه داده به نام bq_demo ایجاد می‌کنید و آن را با داده‌های بانکی خرده‌فروشی از یک سطل GCS بارگیری می‌کنید. تمام داده های موجود را که از قبل در جداول شما وجود دارد حذف می کند.

Cloud Shell را باز کنید

  1. در Cloud Console، در نوار ابزار بالا سمت راست، روی دکمه Activate Cloud Shell کلیک کنید.

3c0c949fe3626208.png

  1. پس از بارگیری پوسته ابری، تایپ کنید:
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 کلیک کنید تا ترمینال پوسته ابری بسته شود. شما با موفقیت یک مجموعه داده را از یک سطل فضای ذخیره‌سازی Google Cloud بارگیری کرده‌اید.

3. ایجاد داده های آموزشی

پرس و جو برای تراکنش های تقلبی در هر نوع کارت

قبل از ایجاد داده های آموزشی، بیایید نحوه توزیع تراکنش های جعلی بین انواع کارت را تجزیه و تحلیل کنیم. پایگاه داده بانکداری خرده‌فروشی ما حاوی پرچمی است که نشان می‌دهد چه زمانی مشتری یک تراکنش تقلبی را در حساب خود گزارش کرده است. این پرس و جو تعداد تراکنش های تقلبی را بر اساس نوع کارت نشان می دهد.

[ Competitive Talking Point: برخلاف برخی از رقبا، BigQuery از شما نمی خواهد که داده های موجود در انبار داده خود را به یک سطل ذخیره سازی صادر کنید، الگوریتم های یادگیری ماشین را اجرا کنید، سپس نتایج را به پایگاه داده کپی کنید. همه اینها را می توان در محل انجام داد، که امنیت داده ها را حفظ می کند و منجر به "گسترش داده ها" نمی شود. ]

  1. کنسول BigQuery را باز کنید:

در Google Cloud Console، منوی ناوبری > BigQuery را انتخاب کنید.

dfdbd753a900e349.png

  1. به BigQuery خوش آمدید در جعبه پیام Cloud Console باز می شود. این جعبه پیام پیوندی به راهنمای شروع سریع و یادداشت های انتشار ارائه می دهد.

روی Done کلیک کنید.

کنسول BigQuery باز می شود.

2982953ee582e477.png

  1. پرس و جو را در Query Editor اجرا کنید:
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

اما اگر بتوانیم از این داده ها برای پیش بینی تراکنش های تقلبی حتی قبل از اینکه مشتری متوجه شود استفاده کنیم، چه؟ ML فقط برای متخصصان نیست. با BigQuery، تحلیلگران می توانند مدل های کلاس جهانی ML را مستقیماً روی داده های انبار داده از طریق SQL اجرا کنند.

ایجاد داده های آموزشی

مجموعه ای از داده های آموزشی ایجاد کنید که شامل هر تراکنش کارت و برخی از ویژگی هایی است که ما تصمیم گرفته ایم به بهترین وجه نشان دهنده تقلب باشد، مانند فاصله از منزل مشتری، زمان روز و مبلغ تراکنش.

پرس و جو را در Query Editor اجرا کنید:

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 );

در قسمت "نتایج" روی "go to table" کلیک کنید و نتیجه زیر را مشاهده خواهید کرد:

c03442924d2dc7f3.png

4. مدل را ایجاد و آموزش دهید

از BQML برای ساخت یک مدل رگرسیون لجستیک برای پیش‌بینی تقلبی بودن یک تراکنش بر اساس داده‌های آموزشی ما ایجاد شده در مرحله قبل استفاده کنید. یکی از ویژگی های خوب BQML این است که از برازش بیش از حد مراقبت می کند، به طوری که داده های آموزشی ما بر عملکرد مدل بر روی داده های جدید تأثیر نمی گذارد.

پرس و جو را در Query Editor اجرا کنید:

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 و Evaluation را ببینید.

در زیر "برگه آموزش"، باید این را ببینید:

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 برای تعیین کد پستی با توجه به طول و عرض جغرافیایی تراکنش‌های تجاری با استفاده از مجموعه داده‌های عمومی از مرزهای کد پستی استفاده می‌کند.

کد زیر را در Query Editor اجرا کنید:

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٪ شگفت انگیز است. احتمالاً این چیزی است که ما می خواهیم بررسی کنیم.