特征工程基础:反洗钱中的特征构建与质量评估
特征工程是反洗钱(AML)模型能否有效识别可疑交易的核心环节。原始交易数据往往包含大量噪声、缺失值和冗余信息,直接输入模型会导致过拟合或漏报。本章系统讲解特征工程在反洗钱中的重要性、三大特征类型及其质量评估标准,为后续特征选择与对照实验奠定基础。
一、特征工程在反洗钱中的重要性
反洗钱场景下,特征工程直接决定模型对洗钱模式的刻画能力。原始交易日志中的字段(如交易金额、时间戳、对手方账号)无法直接反映洗钱行为的本质特征,必须通过特征工程转化为具有业务含义的指标。
| 维度 | 原始数据问题 | 特征工程解决方式 |
|---|---|---|
| 数据稀疏性 | 单笔交易无法判断异常 | 聚合统计(均值、峰值、标准差) |
| 时序依赖 | 时间戳无直接业务含义 | 滑动窗口、频次、间隔特征 |
| 关系网络 | 对手方账号孤立存在 | 图特征(出入度、环检测) |
| 类别编码 | 交易类型为离散字符串 | 目标编码、频次编码 |
二、反洗钱特征类型详解
根据数据形态和业务含义,反洗钱特征可分为数值型、类别型和时序型三大类。每类特征需要不同的预处理和衍生策略。
2.1 数值型特征
数值型特征是反洗钱模型中最基础的特征类型,包括交易金额、账户余额、交易笔数等可直接量化的指标。常见衍生方式包括:
- 对数变换: 对金额取 log(1+x),缓解长尾分布对模型的影响。
- 分箱离散化: 将连续金额划分为“小额/中额/大额”区间,增强对阈值型洗钱模式的捕捉。
- 比率特征: 如“单笔金额/日均金额”、“现金交易占比”,反映交易偏离度。
# 数值型特征衍生示例(Python伪代码)
import numpy as np
def derive_numeric_features(df):
df['amount_log'] = np.log1p(df['transaction_amount'])
df['amount_to_avg_ratio'] = df['transaction_amount'] / df['avg_daily_amount']
df['cash_ratio'] = df['cash_amount'] / df['total_amount']
return df
2.2 类别型特征
类别型特征包括交易类型(转账、取现、汇款)、客户行业、国家代码等离散值。反洗钱场景下,类别特征常出现高基数(如数千个对手方账号)问题,需特殊处理:
| 编码方式 | 适用场景 | 反洗钱注意事项 |
|---|---|---|
| 独热编码 | 低基数类别(<10) | 避免维度爆炸,如交易类型 |
| 目标编码 | 高基数类别(如对手方ID) | 需配合交叉验证防止标签泄露 |
| 频次编码 | 稀有类别处理 | 可结合黑名单权重调整 |
| 嵌入向量 | 深度模型中的类别特征 | 需大量训练数据支撑 |
2.3 时序型特征
洗钱行为往往在时间维度上呈现特定模式,如“短时间内频繁交易”、“深夜大额转账”、“周期性小额试探”。时序型特征的核心在于捕捉时间窗口内的行为变化:
- 滑动窗口统计: 过去1小时/24小时/7天内的交易次数、总金额、最大金额。
- 时间间隔特征: 相邻两笔交易的时间差,用于识别“快速交易”模式。
- 周期性特征: 交易时间在一天中的时段(凌晨/白天/深夜)、一周中的星期几。
- 趋势特征: 交易金额的移动平均线、斜率变化,反映资金流动的突然加速。
三、特征质量评估标准
并非所有衍生特征都能提升模型性能。反洗钱场景下,特征质量评估需从以下四个维度进行量化判断:
| 评估维度 | 量化指标 | 反洗钱业务含义 | 合格阈值参考 |
|---|---|---|---|
| 覆盖度 | 非空值比例 | 特征在样本中是否普遍可用 | > 80% |
| 区分度 | IV值(信息量) | 特征区分正常与可疑交易的能力 | IV > 0.02 |
| 稳定性 | PSI(群体稳定性指数) | 特征分布在不同时间窗口是否一致 | PSI < 0.1 |
| 相关性 | Pearson / Spearman | 特征之间是否存在冗余 | |r| < 0.8 |
3.1 覆盖度评估
覆盖度衡量特征在数据集中的可用性。反洗钱数据常因数据源缺失、字段未采集等原因导致特征空值。对于覆盖度低于60%的特征,除非业务意义极其明确,否则建议剔除或使用缺失值填充策略。
3.2 区分度评估(IV值)
IV(Information Value)是衡量特征对二分类目标变量区分能力的经典指标。计算时将特征分箱后,比较各箱中正负样本占比的差异:
# IV值计算示例
def calculate_iv(feature, target):
# feature: 特征值, target: 0/1标签
df = pd.DataFrame({'feature': feature, 'target': target})
df['bin'] = pd.qcut(df['feature'], q=10, duplicates='drop')
grouped = df.groupby('bin')['target'].agg(['count', 'sum'])
grouped['good'] = grouped['count'] - grouped['sum']
grouped['bad'] = grouped['sum']
grouped['pct_good'] = grouped['good'] / grouped['good'].sum()
grouped['pct_bad'] = grouped['bad'] / grouped['bad'].sum()
grouped['woe'] = np.log(grouped['pct_good'] / grouped['pct_bad'])
grouped['iv'] = (grouped['pct_good'] - grouped['pct_bad']) * grouped['woe']
return grouped['iv'].sum()
3.3 稳定性评估(PSI)
PSI(Population Stability Index)用于监控特征分布随时间的变化。反洗钱模型上线后,若特征分布发生漂移(如监管政策变化导致交易金额整体上升),模型性能会快速衰减。PSI计算方式与IV类似,但比较的是同一特征在两个时间窗口的分布差异。
3.4 相关性评估
高相关性特征会导致模型共线性问题,降低可解释性并增加过拟合风险。反洗钱特征中,“交易总金额”与“交易平均金额×交易次数”往往高度相关,需通过相关性矩阵识别并保留业务意义更强的特征。
四、反洗钱特征工程实战要点
结合上述特征类型与质量评估标准,反洗钱特征工程在实际项目中需注意以下要点:
- 业务驱动优先: 特征衍生应基于洗钱风险场景(如拆分交易、快进快出、跨境流动),而非盲目堆砌统计量。
- 时间窗口对齐: 时序特征的计算窗口需与监管报告周期(如T+1)保持一致,避免使用未来信息。
- 类别特征防泄露: 目标编码必须在训练集内进行交叉验证计算,防止测试集信息泄露导致模型性能虚高。
- 特征监控常态化: 反洗钱模型上线后,需定期计算PSI和覆盖度,及时发现特征漂移并触发模型更新。