1. מבוא
בשיעור ה-Lab הזה תיצרו מודל רגרסיה ליניארית כדי לחזות אם הטרנזקציות האחרונות מתבצעות בתרמית באמצעות SQL ב-BigQuery. אתם יוצרים מערך נתונים לאימון שכולל כל עסקה בכרטיס וחלק מהמאפיינים שקבענו בצורה הטובה ביותר כהונאה. למשל, המרחק מהבית של הלקוח, שעה ביום וסכום העסקה.
לאחר מכן תשתמשו ב-BQML כדי לבנות מודל רגרסיה לוגיסטי כדי לחזות אם עסקה בוצעה במרמה על סמך נתוני האימון שלנו. אחת התכונות הנחמדות של BQ ML היא שהיא מטפלת בהתאמת יתר, כך שנתוני האימון שלנו לא ישפיעו על ביצועי המודל על נתונים חדשים. לבסוף, אתם יוצרים שלוש עסקאות לדוגמה בעלות מאפיינים שונים, וחוזים אם הן מסולפות או לא משתמשות במודל.
מה תלמדו
בשיעור ה-Lab הזה תלמדו איך לבצע את המשימות הבאות:
- טעינת מערך נתונים מקטגוריה של Google Cloud Storage
- יצירת נתוני אימון
- יצירה ואימון של מודל רגרסיה לוגיסטי
- השתמשו במודל כדי לחזות אם עסקאות לדוגמה הן הונאה או לא
- זיהוי עסקאות הונאה לפי מיקוד באמצעות ניתוח גיאו-מרחבי
2. טעינת מערך הנתונים מקטגוריה של GCS
במשימה הזאת תיצרו מערך נתונים בשם bq_demo ונטענו אותו עם נתוני בנק קמעונאי מקטגוריה של GCS. הפעולה הזו תמחק את כל הנתונים הקיימים שכבר נמצאים בטבלאות.
פתיחת Cloud Shell
- בסרגל הכלים שבפינה השמאלית העליונה במסוף Cloud, לוחצים על הלחצן Activate 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 Console:
במסוף Google Cloud, בוחרים בתפריט הניווט > ב-BigQuery.

- תוצג תיבת דו-שיח עם ההודעה "Welcome to BigQuery in the 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
אבל מה אם היינו יכולים להשתמש בנתונים האלה כדי לחזות עסקאות שמקורן בתרמית עוד לפני שהלקוח ראה אותן? למידת מכונה לא מיועדת רק למומחים. בעזרת BigQuery, אנליסטים יכולים להריץ מודלים של למידת מכונה ברמה עולמית ישירות על נתונים של מחסן נתונים (data warehouse) באמצעות 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));
הצגת פרטי המודל
בקטע 'תוצאות', לוחצים על 'מעבר למודל'.

אמורות להופיע הכרטיסיות Schema, Training ו-Evaluation.
בקטע 'כרטיסיית אימון', אמורות להופיע הפרטים הבאים:

בקטע 'הערכה', אמורים להופיע הפרטים הבאים:

בקטע Schema tab, אמור להופיע המידע הבא:

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)
);
אתם אמורים לראות תוצאות כאלה:

כמו שאפשר לראות, העסקה הראשונה היא כמעט ודאית שמקורה בתרמית על סמך המודל שלנו, בעוד שהעסקה השנייה והשלישית לא צפויות להיות כוזבות. הגדרנו את הסף ל-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 שיעור ההונאות ב-69345 מפתיע 11%. סביר להניח שאנחנו רוצים לבדוק את זה.