传统的信用卡反欺诈解决方案通常涉及复杂的数据处理管道,需要在数据库、数据仓库和外部Python/Java环境之间迁移数据以进行特征工程和创建模型。此过程开发周期长、维护成本高,且难以满足交易行为对实时性(毫秒级)的响应要求。PolarDB for AI将机器学习能力原生集成至数据库内核,支持使用标准SQL语言,在数据库内完成从特征工程、创建模型到实时预测的完整反欺诈流程。这种数据不动智能计算的模式,简化了开发流程、降低了运维成本,并能提供满足生产要求的高性能实时欺诈评分服务。
架构概览
此方案利用PolarDB for AI在数据库内部构建一个端到端的信用卡反欺诈系统。整体数据流和技术架构如下:
核心优势
原生SQL:使用标准SQL完成特征提取、创建模型和预测,无需学习新的编程语言。
数据闭环:数据无需在多个系统间迁移,所有操作均在PolarDB集群内部完成,简化了架构并降低延迟。
适用范围
开始操作前,请确保已满足以下条件:
增加AI节点,并设置AI节点的连接数据库账号:开启PolarDB for AI功能
说明若您在购买集群时已添加AI节点,则可以直接为AI节点设置连接数据库的账号。
AI节点的连接数据库账号需具有读写权限,以确保能够顺利读取和写入目标数据库。
使用集群地址连接PolarDB集群:登录PolarDB for AI
重要使用命令行连接集群时,需增加
-c选项。在使用DMS体验和使用PolarDB for AI功能时,DMS默认使用PolarDB集群的主地址进行连接,无法将SQL语句路由至AI节点。因此,您需要手动将连接地址修改为集群地址。
历史数据:有效的反欺诈模型依赖于高质量、已标注(区分正常与欺诈)的历史交易数据。若无历史欺诈数据,将无法验证模型效果。为方便演示,后续步骤提供脚本生成模拟数据。
准备环境与数据
特征维度设计
为了准确识别异常交易行为,需要从原始数据中构造更具表达能力的特征。这通常涉及三个层面:
基础特征:直接从原始数据中获取或轻微处理得到。
交易基本信息:交易金额(
txn_amount)、时间(txn_timestamp)、渠道(txn_channel)、商户(merchant_id)、城市(city)、国家(country)、币种(currency)、交易类型(txn_type)、是否跨境(is_international)等。客户基本信息:客户ID(
customer_id)、卡号(card_id)、年龄(customer_age)、客户分层(customer_segment)、开户天数(account_open_days)等。
行为统计特征:通过在不同时间窗口内对基础特征进行聚合计算,以捕捉用户的常规行为模式。常见时间窗口为1小时、24小时、7天、30天等。
频率与金额类:
txn_cnt_1h(过去1小时交易笔数)、txn_amount_sum_24h(过去24小时交易总额)、txn_amount_mean_7d(过去7天平均交易金额)等。多样性类:
distinct_merchant_cnt_7d(过去7天消费的不同商户数)、distinct_city_cnt_7d(过去7天消费的不同城市数)、is_new_country(本次交易国家是否首次出现)等。时间模式类:
night_txn_ratio_7d(过去7天夜间交易占比)、inter_txn_time_mean_7d(过去7天平均交易间隔)等。
风险与偏离度特征:将当前交易与用户的历史行为模式进行对比,量化其异常程度。
金额偏离:
amount_vs_mean_30d(当前金额与30日均值的比率)、amount_zscore_30d(当前金额的Z-score分数)。频率偏离:
txn_cnt_24h_vs_7d(近24小时交易数与近7日日均交易数的比率)。地域偏离:
geo_distance_from_last(与上笔交易的地理距离)、impossible_travel_flag(是否发生“不可能旅行”,即短时间内地理位置跨度过大)。
创建数据表
执行以下SQL语句,创建用于存储原始交易流水和客户信息的表。
-- 创建交易流水表
CREATE TABLE transaction_log (
txn_id BIGINT PRIMARY KEY,
card_id BIGINT,
customer_id BIGINT,
txn_timestamp TIMESTAMP(3), -- 使用毫秒精度,以便更好地模拟短时连续交易
txn_amount DECIMAL(18, 2),
merchant_id BIGINT,
city VARCHAR(255),
country VARCHAR(255),
txn_channel VARCHAR(50), -- 交易渠道 (例如: POS, Online, ATM)
txn_type VARCHAR(50), -- 交易类型 (例如: Purchase, Withdrawal)
currency VARCHAR(10), -- 币种 (例如: CNY, USD)
is_international INT, -- 是否跨境:1表示跨境,0表示不跨境
label INT -- 标签:1表示欺诈,0表示正常
);
-- 创建客户信息表
CREATE TABLE customer_profile (
customer_id BIGINT PRIMARY KEY,
card_id BIGINT,
customer_age INT,
account_open_days INT,
customer_segment VARCHAR(50) -- 客户分层 (例如: Standard, Gold, Platinum)
);生成模拟数据
以下SQL脚本用于生成模拟数据,向transaction_log和customer_profile表中插入包含正常交易和少量欺诈交易的记录。
在实际业务场景中,需将此步骤替换为实际的历史数据导入流程。
-- 插入客户信息
INSERT INTO customer_profile (customer_id, card_id, customer_age, account_open_days, customer_segment) VALUES
(1001, 6222020000000001, 35, 730, 'Gold'),
(1002, 6222020000000002, 42, 1200, 'Platinum'),
(1003, 6222020000000003, 28, 365, 'Standard');
-- 插入交易流水 (包含多种正常和欺诈样本)
-- 欺诈交易样本通常与正常交易样本比例严重不平衡(如1:1000或更低),此处为演示目的提高了欺诈样本比例。
INSERT INTO transaction_log (txn_id, card_id, customer_id, txn_timestamp, txn_amount, merchant_id, city, country, txn_channel, txn_type, currency, is_international, label) VALUES
-- 场景一:客户1001的常规消费 (正常)
(1, 6222020000000001, 1001, '2023-10-01 10:00:00.000', 150.00, 201, 'Shanghai', 'China', 'POS', 'Purchase', 'CNY', 0, 0),
(2, 6222020000000001, 1001, '2023-10-01 19:30:00.000', 88.50, 202, 'Shanghai', 'China', 'Online', 'Purchase', 'CNY', 0, 0),
(3, 6222020000000001, 1001, '2023-10-02 12:15:00.000', 230.00, 201, 'Shanghai', 'China', 'POS', 'Purchase', 'CNY', 0, 0),
(4, 6222020000000001, 1001, '2023-10-03 09:00:00.000', 55.00, 203, 'Shanghai', 'China', 'Online', 'Purchase', 'CNY', 0, 0),
-- 场景二:客户1002的差旅消费 (正常)
(5, 6222020000000002, 1002, '2023-10-03 19:00:00.000', 1200.00, 301, 'Beijing', 'China', 'POS', 'Purchase', 'CNY', 0, 0),
(6, 6222020000000002, 1002, '2023-10-04 20:00:00.000', 850.00, 302, 'Beijing', 'China', 'POS', 'Purchase', 'CNY', 0, 0),
-- 场景三:客户1003的日常消费 (正常)
(7, 6222020000000003, 1003, '2023-10-05 18:00:00.000', 99.00, 401, 'Hangzhou', 'China', 'Online', 'Purchase', 'CNY', 0, 0),
-- 场景四:欺诈模式 - "不可能的旅行" + 金额异常 (欺诈)
-- 客户1001在上海有一笔交易后,5分钟内突然在纽约出现大额交易
(8, 6222020000000001, 1001, '2023-10-03 23:50:00.000', 9800.00, 501, 'New York', 'USA', 'Online', 'Purchase', 'USD', 1, 1),
-- 场景五:欺诈模式 - 短时高频盗刷 (欺诈)
-- 客户1003的卡在短时间内被连续小额盗刷
(9, 6222020000000003, 1003, '2023-10-06 02:10:15.100', 499.00, 601, 'Manila', 'Philippines', 'Online', 'Purchase', 'PHP', 1, 1),
(10, 6222020000000003, 1003, '2023-10-06 02:10:45.500', 499.00, 601, 'Manila', 'Philippines', 'Online', 'Purchase', 'PHP', 1, 1),
(11, 6222020000000003, 1003, '2023-10-06 02:11:30.800', 499.00, 601, 'Manila', 'Philippines', 'Online', 'Purchase', 'PHP', 1, 1);通过SQL进行特征工程
直接使用SQL从原始数据中提取、计算复杂的行为特征,并构建用于创建模型的特征宽表。
计算时间窗口特征
为捕捉用户的行为模式,需要计算基于不同时间窗口的统计特征,例如“过去7天内的交易次数”。您可以通过SQL的窗口函数高效完成,以下示例为每笔交易计算其关联卡号在过去24小时内的交易总金额和过去7天内的交易总次数。
复杂的特征计算可能导致高延迟,从而影响交易的实时响应速度。在实际业务环境中,建议对card_id和txn_timestamp列创建索引以优化查询性能。
-- 计算基础的时间窗口特征
WITH transaction_features AS (
SELECT
*,
-- 计算过去24小时内的交易总金额
SUM(txn_amount) OVER (
PARTITION BY card_id
ORDER BY txn_timestamp
RANGE BETWEEN INTERVAL '24' HOUR PRECEDING AND CURRENT ROW
) AS txn_amount_sum_24h,
-- 计算过去7天内的交易次数
COUNT(*) OVER (
PARTITION BY card_id
ORDER BY txn_timestamp
RANGE BETWEEN INTERVAL '7' DAY PRECEDING AND CURRENT ROW
) AS txn_cnt_7d
FROM
transaction_log
)
SELECT * FROM transaction_features;
-- 计算金额偏离度
SELECT
txn_amount / NULLIF(
AVG(txn_amount) OVER (
PARTITION BY card_id
ORDER BY txn_timestamp
RANGE BETWEEN INTERVAL '30' DAY PRECEDING AND INTERVAL '1' MICROSECOND PRECEDING
), 0
) AS amount_vs_mean_30d
FROM
transaction_log;构建最终特征表
将所有基础特征和计算出的统计特征合并,创建一张最终用于模型的特征表train_data。
在实际业务场景中,您需要构建三个特征表,分别为
train_data(训练集)、dev_data(验证集)和predict_data(测试集)。本文简化为均使用train_data进行验证。为保障数据安全,在进行特征设计时,建议对卡号标识(card_id)进行脱敏处理。
-- 修改后的SQL语句
CREATE TABLE train_data AS
SELECT
-- 基础特征
t.txn_amount,
t.txn_channel,
t.merchant_id,
t.city,
t.country,
t.txn_type,
t.currency,
t.is_international,
EXTRACT(HOUR FROM t.txn_timestamp) AS txn_hour,
DAYOFWEEK(t.txn_timestamp) AS txn_weekday,
p.customer_age,
p.account_open_days,
-- 使用窗口函数计算的统计特征
SUM(t.txn_amount) OVER (
PARTITION BY t.card_id
ORDER BY t.txn_timestamp
RANGE BETWEEN INTERVAL '24' HOUR PRECEDING AND CURRENT ROW
) AS txn_amount_sum_24h,
COUNT(*) OVER (
PARTITION BY t.card_id
ORDER BY t.txn_timestamp
RANGE BETWEEN INTERVAL '7' DAY PRECEDING AND CURRENT ROW
) AS txn_cnt_7d,
-- 标签列
t.label
FROM
transaction_log t
JOIN
customer_profile p ON t.customer_id = p.customer_id;创建与评估模型
特征数据准备就绪后,可使用一条SQL语句来创建一个LightGBM算法分类模型,并评估其效果。
创建模型
使用CREATE MODEL语句创建一个二分类模型以识别欺诈交易。
模型选择:选用LightGBM算法,它在处理表格数据时效率高且速度快。
参数配置:
y_cols:指定标签列为label。is_unbalance:设置为True。由于欺诈交易样本远少于正常交易,这是一个典型的数据不平衡场景。启用此参数有助于模型学习到少数类的特征。n_estimators:弱学习器(树)的数量。建议初始值设置在5-8之间,以平衡模型效果和创建时间。
创建示例
执行以下SQL语句来创建模型。
/*polar4ai*/CREATE MODEL credit_card_model WITH ( model_class='lightgbm', x_cols='txn_amount,txn_channel,merchant_id,city,country,txn_type,currency,is_international,txn_hour,txn_weekday,customer_age,account_open_days,txn_amount_sum_24h,txn_cnt_7d', y_cols='label', model_parameter=(n_estimators=5,loss='binary',is_unbalance='True')) AS (SELECT * FROM train_data);创建后,您可以通过
/*polar4ai*/SHOW MODEL credit_card_model;查看创建模型结果。若modelStatus = saved_oss代表已经创建成功。
评估模型性能
创建模型完成后,使用EVALUATE命令在独立的验证集(此处为简化,仍使用train_data)上评估其性能。关键评估指标包括AUC和F-score。
AUC(Area Under Curve):衡量模型整体排序能力,值越接近1越好。
F-score:综合了精确率和召回率,是评估不平衡分类问题常用的指标。
评估示例
/*polar4ai*/SELECT label FROM EVALUATE(MODEL credit_card_model,
SELECT * FROM train_data) WITH (
x_cols='txn_amount,txn_channel,merchant_id,city,country,txn_type,currency,is_international,txn_hour,txn_weekday,customer_age,account_open_days,txn_amount_sum_24h,txn_cnt_7d',
y_cols='label',
metrics = 'auc,Fscore',
mode='async'
);输出示例
执行EVALUATE后,会返回一个任务ID。您可以通过/*polar4ai*/ SHOW TASK `<TASK_id>`; 查看评估结果(results)。一个理想的评估结果应显示较高的AUC和F-score,表明模型具备良好的欺诈识别能力。
{
"auc": 0.95,
"Fscore": "precision:{0: 1.0, 1: 1.0};recall:{0: 1.0, 1: 1.0};f1score:{0: 1.0, 1: 1.0}"
}预测模型性能
评估模型完成后,使用PREDICT命令在独立的验证集(此处为简化,仍使用train_data)上预测其性能。
预测示例
/*polar4ai*/SELECT label FROM PREDICT(MODEL credit_card_model,
SELECT * FROM train_data) WITH (
x_cols='txn_amount,txn_channel,merchant_id,city,country,txn_type,currency,is_international,txn_hour,txn_weekday,customer_age,account_open_days,txn_amount_sum_24h,txn_cnt_7d',
y_cols='label',
mode='async'
);执行PREDICT后,会返回一个任务ID。您可以通过/*polar4ai*/ SHOW TASK `<TASK_id>`;查看预测结果。如果任务完成(taskStatus=finish)后,在filePath中会得到一个OSS地址,OSS文件即结果文件。
应用于生产环境
将AI模型应用于生产环境时,除了技术实现,还需考虑业务策略、系统运维和风险管理。
风险分层与处置:基于模型输出的风险评分,制定差异化的业务策略。例如:
高风险(score >= 0.95):建议立即拦截交易,拒绝支付,并发送短信或通知用户确认。
中高风险(0.8 <= score < 0.95):交易暂时挂起,将交易进入人工审核队列。
中风险(0.6 <= score < 0.8):允许交易,但发送实时提醒给用户或进行二次验证(如短信验证码)。
低风险(score < 0.6):正常放行,同时记录评分用于后续分析。
与规则引擎协同:将AI模型与现有的专家规则引擎结合,是兼顾检出率和业务灵活性的最佳实践。二者可以形成互补,覆盖更全面的风险场景。
规则触发 + 模型高分:执行高优先级的拦截策略。
规则未触发 + 模型高分:建议触发二次验证或转入人工审核,以发现规则未覆盖的新型欺诈。
规则触发 + 模型低分:可降级为人工审核或警告,以避免因规则僵化而误伤正常用户。
闭环运营与策略迭代:建立监控报表,持续追踪模型性能和业务指标,例如模型识别的疑似欺诈数量、实际确认的欺诈案例、召回率、误报率等。运营人员可依据这些数据反馈,动态调整风险处置阈值、优化特征工程逻辑、或更新商户/用户的风险名单(黑白名单),从而实现策略的持续迭代优化。
模型迭代与概念漂移:由于欺诈手法会不断变化(概念漂移),模型需要定期(如每月/每季度)使用新数据重新计算以保持有效性。可将此流程中的SQL封装成定时执行的脚本,实现模型的自动化更新。