1. บทนำ
ในห้องทดลองนี้ คุณจะได้สร้างโมเดลการถดถอยเชิงเส้นเพื่อคาดการณ์ว่าธุรกรรมล่าสุดเป็นการฉ้อโกงโดยใช้ SQL ใน BigQuery หรือไม่ คุณจึงสร้างชุดข้อมูลการฝึกที่มีธุรกรรมของบัตรแต่ละรายการ และแอตทริบิวต์บางรายการที่เราตัดสินใจว่าดีที่สุดแล้วเป็นการประพฤติมิชอบ เช่น ระยะทางจากบ้านของลูกค้า ช่วงเวลาของวัน และจำนวนเงินของธุรกรรม
จากนั้นใช้ BQML สร้างโมเดลการถดถอยแบบโลจิสติกส์เพื่อคาดการณ์ว่าธุรกรรมจะเป็นการฉ้อโกงตามข้อมูลการฝึกของเราหรือไม่ ฟีเจอร์ที่ดีอย่างหนึ่งของ BQ ML คือเครื่องมือจะดูแลเรื่องการปรับให้เหมาะสม เพื่อให้ข้อมูลการฝึกของเราไม่ส่งผลกระทบต่อประสิทธิภาพของโมเดลในข้อมูลใหม่ ขั้นสุดท้าย ให้สร้างธุรกรรมตัวอย่าง 3 รายการที่มีลักษณะแตกต่างกัน และคาดการณ์ว่าเป็นการฉ้อโกงหรือไม่ใช้รูปแบบดังกล่าว
สิ่งที่คุณจะได้เรียนรู้
ในห้องทดลองนี้ คุณจะได้ศึกษาวิธีทำสิ่งต่อไปนี้
- โหลดชุดข้อมูลจากที่เก็บข้อมูล Google Cloud Storage
- สร้างข้อมูลการฝึก
- สร้างและฝึกโมเดลการถดถอยแบบโลจิสติก
- ใช้โมเดลเพื่อคาดการณ์ว่าธุรกรรมตัวอย่างเป็นการฉ้อโกงหรือไม่
- ระบุธุรกรรมการฉ้อโกงด้วยรหัสไปรษณีย์โดยใช้การวิเคราะห์เชิงพื้นที่
2. โหลดชุดข้อมูลจากที่เก็บข้อมูล GCS
ในงานนี้ คุณจะได้สร้างชุดข้อมูลที่เรียกว่า bq_demo และโหลดด้วยข้อมูลธนาคารสำหรับธุรกิจค้าปลีกจากที่เก็บข้อมูล GCS การดำเนินการนี้จะลบข้อมูลที่มีอยู่ในตาราง
เปิด Cloud Shell
- คลิกปุ่ม "เปิดใช้งาน Cloud Shell" ในแถบเครื่องมือด้านบนขวาใน Cloud Console

- เมื่อ 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
- เมื่อเสร็จแล้ว ให้คลิก X เพื่อปิดเทอร์มินัล Cloud Shell คุณโหลดชุดข้อมูลจากที่เก็บข้อมูล Google Cloud Storage สำเร็จแล้ว
3. สร้างข้อมูลการฝึก
การค้นหาธุรกรรมที่เป็นการฉ้อโกงตามประเภทบัตร
ก่อนที่เราจะสร้างข้อมูลการฝึก เรามาวิเคราะห์วิธีการกระจายธุรกรรมที่เป็นการฉ้อโกงระหว่างบัตรประเภทต่างๆ กัน ฐานข้อมูลธนาคารสำหรับธุรกิจค้าปลีกของเรามีธงที่ระบุเมื่อลูกค้าได้รายงานธุรกรรมที่เป็นการฉ้อโกงในบัญชี การค้นหานี้แสดงจำนวนธุรกรรมที่เป็นการฉ้อโกงตามประเภทบัตร
[ประเด็นในการสนทนาเกี่ยวกับคู่แข่ง: BigQuery แตกต่างจากคู่แข่งบางรายตรงที่ไม่กำหนดให้คุณต้องส่งออกข้อมูลคลังข้อมูลไปยังที่เก็บข้อมูลของพื้นที่เก็บข้อมูล เรียกใช้อัลกอริทึมของแมชชีนเลิร์นนิง แล้วคัดลอกผลลัพธ์กลับไปยังฐานข้อมูล ทั้งหมดนี้คุณสามารถทำได้ ซึ่งจะช่วยรักษาความปลอดภัยของข้อมูลและไม่ทำให้เกิด "การแผ่กระจายข้อมูล"]
- เปิดคอนโซล BigQuery ด้วยคำสั่งต่อไปนี้
ในคอนโซล Google Cloud ให้เลือกเมนูการนำทาง > BigQuery

- กล่องข้อความ "ยินดีต้อนรับสู่ BigQuery ใน Cloud Console" จะเปิดขึ้น กล่องข้อความนี้จะมีลิงก์ไปยังคู่มือเริ่มใช้งานฉบับย่อและบันทึกประจำรุ่น
คลิกเสร็จสิ้น
คอนโซล BigQuery จะเปิดขึ้น

- เรียกใช้การค้นหาในเครื่องมือแก้ไขการค้นหา
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 );
ใน "ผลลัพธ์" คลิก "ไปที่ตาราง" และคุณควรเห็นผลลัพธ์ต่อไปนี้

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));
ดูรายละเอียดโมเดล
ในส่วน "ผลลัพธ์" ให้คลิก "ไปที่โมเดล"

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

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

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

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)
);
คุณควรเห็นผลลัพธ์ดังนี้

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

ดังที่คุณเห็น อัตราการทุจริตในรหัสไปรษณีย์ส่วนใหญ่ค่อนข้างน้อย (ต่ำกว่า 2%) แต่อัตราการทุจริตใน 69345 นั้นน่าประหลาดใจถึง 11% นี่อาจเป็นปัญหาที่เราต้องการตรวจสอบ