適用於零售銀行資料集的詐欺預測和地理空間分析程式碼研究室

1. 簡介

在這個研究室中,您將建立線性迴歸模型,以預測近期交易是否在 BigQuery 中使用 SQL 進行詐欺。您建立了訓練資料集,內含每筆卡片交易,以及我們判斷最能代表詐欺性的某些屬性,例如客戶住家的距離、時段和交易金額。

接著,您將使用 BQML 建構邏輯迴歸模型,依據訓練資料來預測交易是否涉及詐欺行為。BQ ML 的其中一項優點是可以處理過度配適的問題,這樣我們的訓練資料就不會影響模型對新資料的效能。最後,您要建立三個特徵不同的範例交易,並預測這些交易是否以詐欺為由,或未使用模型。

學習目標

在本研究室中,您將瞭解如何執行下列工作:

  • 從 Google Cloud Storage 值區載入資料集
  • 建立訓練資料
  • 建立及訓練邏輯迴歸模型
  • 使用模型預測樣本交易是否為詐欺
  • 運用地理空間分析功能,根據郵遞區號識別詐欺交易

2. 從 GCS 值區載入資料集

在這項工作中,您會建立名為 bq_demo 的資料集,並利用 GCS 值區中的零售銀行資料載入該資料集。這麼做會刪除資料表中現有的任何資料。

開啟 Cloud Shell

  1. 在 Cloud 控制台的右上方找到工具列,然後按一下「啟用 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 控制台中,依序選取「導覽選單」圖示 >BigQuery。

dfdbd753a900e349.png

  1. 接著,畫面中會顯示「歡迎使用 Cloud 控制台中的 BigQuery」訊息方塊。當中會列出快速入門導覽課程指南的連結和版本資訊。

按一下 [完成]。

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 and Evaluation」(結構定義、訓練和評估) 分頁標籤。

「訓練分頁」下方應該會顯示以下內容:

cb6b11a01816ba74.png

「Evaluation」分頁下方應該會顯示:

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%。這可能是我們需要調查的情況。