1. 简介
在本实验中,您将使用 BigQuery 中的 SQL 创建一个线性回归模型来预测近期事务是否具有欺诈性。您需要创建一个训练数据集,其中包含每笔卡交易以及我们认定为最能表明欺诈的一些属性,例如距离客户家的距离、时间和交易金额。
然后,您使用 BQML 构建逻辑回归模型,以根据我们的训练数据预测某交易是否具有欺诈性。BQ ML 的一个优点是可以处理过拟合,使训练数据不会影响模型在新数据上的表现。最后,您创建三项具有不同特征的示例交易,并预测这些交易是否具有欺诈性或未使用模型。
学习内容
在本实验中,您将学习如何执行以下任务:
- 从 Google Cloud Storage 存储分区加载数据集
- 创建训练数据
- 创建和训练逻辑回归模型
- 使用模型预测样本交易是否具有欺诈性
- 利用地理空间分析,按邮政编码识别欺诈交易
2. 从 GCS 存储分区加载数据集
在此任务中,您将创建一个名为 bq_demo 的数据集,并使用 GCS 存储分区中的零售银行数据加载该数据集。此操作会删除表中的任何现有数据。
打开 Cloud Shell
- 在 Cloud 控制台右上角的工具栏中,点击“激活 Cloud Shell”按钮。

- 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。

- 您会看到“欢迎在 Cloud 控制台中使用 BigQuery”消息框。其中提供了指向快速入门指南和版本说明的链接。
点击“完成”。
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,分析人员可以通过 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 笔交易预计不是欺诈性交易。我们已将阈值从默认的 50% 提高到 55%。我们可以使用其他数据或添加其他属性来训练模型,以提高准确性。
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%。这可能是我们想要调查的问题。