构建信用卡反欺诈模型

传统的信用卡反欺诈解决方案通常涉及复杂的数据处理管道,需要在数据库、数据仓库和外部Python/Java环境之间迁移数据以进行特征工程和创建模型。此过程开发周期长、维护成本高,且难以满足交易行为对实时性(毫秒级)的响应要求。PolarDB for AI将机器学习能力原生集成至数据库内核,支持使用标准SQL语言,在数据库内完成从特征工程、创建模型到实时预测的完整反欺诈流程。这种数据不动智能计算的模式,简化了开发流程、降低了运维成本,并能提供满足生产要求的高性能实时欺诈评分服务。

架构概览

此方案利用PolarDB for AI在数据库内部构建一个端到端的信用卡反欺诈系统。整体数据流和技术架构如下:

image

核心优势

  • 原生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_logcustomer_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_idtxn_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之间,以平衡模型效果和创建时间。

创建示例

  1. 执行以下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);
  2. 创建后,您可以通过/*polar4ai*/SHOW MODEL credit_card_model; 查看创建模型结果。若modelStatus = saved_oss代表已经创建成功。

评估模型性能

创建模型完成后,使用EVALUATE命令在独立的验证集(此处为简化,仍使用train_data)上评估其性能。关键评估指标包括AUCF-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)。一个理想的评估结果应显示较高的AUCF-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封装成定时执行的脚本,实现模型的自动化更新。

常见问题

如何处理欺诈样本与正常样本比例严重失衡的问题?

欺诈交易样本稀少是风控场景的普遍挑战。PolarDB for AI中的LightGBM算法内置了处理数据不平衡的机制。

  • 启用内置参数:在创建模型时,将is_unbalance参数设置为True,模型算法会自动调整样本权重,对少数类(欺诈样本)给予更高的关注度。当正负样本比例相差超过10倍时,建议开启此参数。

  • 数据层面处理:在构建训练集时,可以对多数类(正常样本)进行适度的下采样(Down-sampling),以改善样本比例。

欺诈手段不断变化,如何保证模型长期有效?

这种现象被称为概念漂移(Concept Drift),是所有风控模型面临的共同挑战。核心解决方案是定期重新训练模型。建议您建立自动化的模型迭代机制,例如每月或每季度使用最新的交易数据,重新执行本文档中的特征工程和模型创建流程,以确保模型能够持续学习和适应最新的欺诈模式。

除了优化参数,还有哪些高级方法可以进一步提升模型效果?

当模型性能遇到瓶颈时,可以尝试以下几种高级策略:

  • 多模型融合(Model Fusion):使用StackingBlending等技术,将LightGBM算法BST算法(适用于序列特征)等多个模型的预测结果进行融合,通常能获得比单一模型更稳定和更优的性能。

  • 构建更精细的用户画像:引入更多维度的静态或动态特征,例如用户的职业、收入等级、常住城市、常用设备、近期消费类目偏好等,让模型对正常行为有更立体的认知。

  • 结合大语言模型(LLM)辅助分析:在人工审核环节,可以利用通义千问大模型等工具,对高风险交易的各项特征自动生成人类可读的欺诈风险分析报告,提升人工审核的效率和准确性。