特征工程基础:反洗钱建模的基石
在反洗钱(AML)领域,原始交易数据如同未经雕琢的矿石,直接输入模型往往效果不佳。特征工程正是将原始数据转化为模型能够理解、且能有效识别可疑行为的数值表示的过程。没有高质量的特征,再先进的算法也无法准确捕捉洗钱模式。
特征工程在反洗钱中的核心价值
特征工程直接决定了模型性能的上限。在AML场景中,其重要性体现在以下三个层面:
- 提升信号强度:洗钱行为通常隐藏在大量正常交易中。通过构造聚合特征(如“过去24小时累计交易金额”),可以将微弱的异常信号放大,使模型更容易区分正常与可疑。
- 注入领域知识:反洗钱规则(如“单笔超过X万元需关注”)可以通过特征工程直接编码进模型,让算法学习到合规专家积累的经验。
- 处理数据稀疏性:原始交易数据中,每个账户的交易记录可能非常稀疏。特征工程可以提取账户的统计行为画像,将稀疏的高维数据转化为稠密的低维特征。
反洗钱中的三大特征类型
根据数据形态和业务含义,AML特征主要分为数值型、类别型和时序型。下表总结了它们的核心差异与常见示例:
| 特征类型 | 数据特点 | 常见AML示例 | 典型处理方式 |
|---|---|---|---|
| 数值型 | 连续或离散的数值,可进行算术运算 | 交易金额、账户余额、交易频率、IP地址地理位置距离 | 标准化、对数变换、分箱、异常值截断 |
| 类别型 | 有限个离散取值,无大小顺序 | 交易类型(转账/取现)、币种、国家/地区、渠道(网银/柜台) | 独热编码、标签编码、目标编码、频次编码 |
| 时序型 | 带有时间戳,反映行为变化趋势 | 过去7天交易金额的均值/标准差、交易间隔、夜间交易占比 | 滑动窗口聚合、时间衰减加权、差分、周期性编码 |
数值型特征:量化交易行为
数值型特征是AML模型最直接的输入。例如,单笔交易金额、账户历史平均余额、过去30天交易总次数等。处理时需注意:洗钱数据常存在极端值(如大额交易),直接使用会导致模型偏向异常值。常用对数变换(log transform)或分箱(binning)来缓解。
类别型特征:刻画交易属性
类别型特征描述了交易的“性质”。例如,交易对手是否为高风险国家、交易渠道是否为匿名加密货币。这类特征不能直接输入模型,需要转换为数值。在AML中,目标编码(Target Encoding)非常有效——用每个类别对应的目标变量(是否可疑)的均值来替换原始类别,能很好地捕捉类别与标签的关系。
时序型特征:捕捉行为模式
洗钱行为往往在时间维度上表现出异常模式,如“短时间内频繁交易”、“深夜大额转账”。时序特征通过滑动窗口(如过去24小时、7天、30天)计算统计量(总和、均值、标准差、最大值),将时间序列信息压缩为静态特征。例如,构造“过去1小时内交易金额的变异系数”可以识别资金快进快出的“洗钱”模式。
特征与标签的关系:从相关性到因果性
特征工程的最终目的是建立特征与标签(是否可疑)之间的有效关联。理解这种关系,能指导我们筛选和构造更有价值的特征。
- 强相关特征: 与标签直接相关的特征,如“交易对手是否在制裁名单上”。这类特征通常具有很高的区分度,应优先保留。
- 弱相关特征: 与标签存在间接关联,如“交易金额的百分位数”。单个弱相关特征效果有限,但多个弱相关特征组合后可能产生强预测能力。
- 无关特征: 与标签无统计关联,如“交易流水号”。这类特征应直接剔除,避免引入噪声。
- 噪声特征: 包含大量随机波动,如“毫秒级交易时间戳”。这类特征会降低模型稳定性,需要平滑或去除。
下图展示了特征工程在反洗钱建模中的整体流程,以及特征与标签之间的核心关系:
特征与标签关系的量化评估
在实际项目中,我们需要用数据指标来量化特征与标签的关系强度,从而指导特征筛选。以下是三种常用方法:
| 评估方法 | 适用特征类型 | 计算方式 | AML场景示例 |
|---|---|---|---|
| 信息价值(IV) | 数值型、类别型 | IV = Σ( (P_i - Q_i) * ln(P_i/Q_i) ),其中P_i为可疑样本在分组i中的占比,Q_i为正常样本占比 | 评估“交易金额分箱”特征对识别可疑交易的有效性。IV > 0.3 表示强预测力 |
| 相关系数 | 数值型 | 皮尔逊相关系数 r,取值范围 [-1, 1] | 计算“账户年龄”与“是否可疑”的线性相关性。|r| > 0.5 表示强相关 |
| 卡方检验 | 类别型 | 计算实际频数与期望频数的差异,p值越小表示关联越显著 | 检验“交易渠道”与“可疑标签”是否独立。p < 0.05 表示存在显著关联 |
特征构造实战:从原始数据到有效特征
以下是一个简单的Python代码示例,展示如何从原始交易数据中构造数值型、类别型和时序型特征:
import pandas as pd
import numpy as np
# 原始交易数据示例
transactions = pd.DataFrame({
'account_id': ['A001', 'A001', 'A001', 'A002', 'A002'],
'txn_amount': [5000, 12000, 8000, 200, 150],
'txn_type': ['转账', '转账', '取现', '转账', '取现'],
'txn_time': pd.to_datetime(['2024-01-01 10:00', '2024-01-01 11:30',
'2024-01-01 12:00', '2024-01-02 09:00',
'2024-01-02 09:15']),
'is_suspicious': [0, 1, 0, 0, 0] # 标签
})
# 1. 数值型特征:对数变换交易金额
transactions['log_amount'] = np.log1p(transactions['txn_amount'])
# 2. 类别型特征:目标编码(用历史均值替代类别)
type_target_mean = transactions.groupby('txn_type')['is_suspicious'].mean()
transactions['txn_type_target_enc'] = transactions['txn_type'].map(type_target_mean)
# 3. 时序型特征:按账户分组,计算过去1小时内的交易总金额
transactions = transactions.sort_values(['account_id', 'txn_time'])
transactions['rolling_1h_sum'] = (
transactions.groupby('account_id')['txn_amount']
.transform(lambda x: x.rolling('1h', min_periods=1).sum())
)
print(transactions[['account_id', 'txn_amount', 'log_amount',
'txn_type_target_enc', 'rolling_1h_sum']])
上述代码展示了特征工程的核心操作:数值变换、类别编码、时序聚合。在实际AML项目中,特征构造的复杂度会高得多,但基本思路是一致的——从业务理解出发,将原始数据转化为能够反映洗钱行为模式的特征。