การคาดการณ์การประพฤติมิชอบและการวิเคราะห์ภูมิสารสนเทศสำหรับชุดข้อมูลการธนาคารค้าปลีก Codelab

1. บทนำ

ในห้องทดลองนี้ คุณจะได้สร้างโมเดลการถดถอยเชิงเส้นเพื่อคาดการณ์ว่าธุรกรรมล่าสุดเป็นการฉ้อโกงโดยใช้ SQL ใน BigQuery หรือไม่ คุณจึงสร้างชุดข้อมูลการฝึกที่มีธุรกรรมของบัตรแต่ละรายการ และแอตทริบิวต์บางรายการที่เราตัดสินใจว่าดีที่สุดแล้วเป็นการประพฤติมิชอบ เช่น ระยะทางจากบ้านของลูกค้า ช่วงเวลาของวัน และจำนวนเงินของธุรกรรม

จากนั้นใช้ BQML สร้างโมเดลการถดถอยแบบโลจิสติกส์เพื่อคาดการณ์ว่าธุรกรรมจะเป็นการฉ้อโกงตามข้อมูลการฝึกของเราหรือไม่ ฟีเจอร์ที่ดีอย่างหนึ่งของ BQ ML คือเครื่องมือจะดูแลเรื่องการปรับให้เหมาะสม เพื่อให้ข้อมูลการฝึกของเราไม่ส่งผลกระทบต่อประสิทธิภาพของโมเดลในข้อมูลใหม่ ขั้นสุดท้าย ให้สร้างธุรกรรมตัวอย่าง 3 รายการที่มีลักษณะแตกต่างกัน และคาดการณ์ว่าเป็นการฉ้อโกงหรือไม่ใช้รูปแบบดังกล่าว

สิ่งที่คุณจะได้เรียนรู้

ในห้องทดลองนี้ คุณจะได้ศึกษาวิธีทำสิ่งต่อไปนี้

  • โหลดชุดข้อมูลจากที่เก็บข้อมูล Google Cloud Storage
  • สร้างข้อมูลการฝึก
  • สร้างและฝึกโมเดลการถดถอยแบบโลจิสติก
  • ใช้โมเดลเพื่อคาดการณ์ว่าธุรกรรมตัวอย่างเป็นการฉ้อโกงหรือไม่
  • ระบุธุรกรรมการฉ้อโกงด้วยรหัสไปรษณีย์โดยใช้การวิเคราะห์เชิงพื้นที่

2. โหลดชุดข้อมูลจากที่เก็บข้อมูล GCS

ในงานนี้ คุณจะได้สร้างชุดข้อมูลที่เรียกว่า bq_demo และโหลดด้วยข้อมูลธนาคารสำหรับธุรกิจค้าปลีกจากที่เก็บข้อมูล GCS การดำเนินการนี้จะลบข้อมูลที่มีอยู่ในตาราง

เปิด Cloud Shell

  1. คลิกปุ่ม "เปิดใช้งาน Cloud Shell" ในแถบเครื่องมือด้านบนขวาใน Cloud Console

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 ให้เลือกเมนูการนำทาง > 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

แต่จะเป็นอย่างไรถ้าเราสามารถใช้ข้อมูลนี้เพื่อคาดการณ์ธุรกรรมที่เป็นการฉ้อโกงก่อนที่ลูกค้าจะแจ้งเตือน ML ไม่ได้มีไว้สำหรับผู้เชี่ยวชาญเท่านั้น เมื่อใช้ BigQuery นักวิเคราะห์จะเรียกใช้โมเดล ML ระดับโลกได้โดยตรงกับข้อมูลของคลังข้อมูลผ่าน 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

คุณควรเห็นแท็บสคีมา การฝึกอบรม และการประเมิน

คุณจะเห็นข้อมูลต่อไปนี้ในส่วน "แท็บการฝึกอบรม"

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

คุณจะเห็นได้ว่าธุรกรรมแรกเป็นธุรกรรมที่เกือบเป็นการฉ้อโกงเมื่อพิจารณาจากรูปแบบของเรา ขณะที่ธุรกรรมที่ 2 และ 3 คาดว่าจะไม่ใช่การฉ้อโกง โดยเราได้ตั้งเกณฑ์ไว้ที่ 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% นี่อาจเป็นปัญหาที่เราต้องการตรวจสอบ