3. 金融交易数据特征工程:原始特征提取与衍生特征构建
在异常交易检测中,原始交易数据通常包含大量非结构化或半结构化字段。特征工程的目标是将这些原始数据转化为能够有效区分正常与异常行为的数值化特征。本章将系统讲解如何从交易时间、金额、频率、地理位置、设备指纹和IP地址等维度进行特征提取与衍生构建。
3.1 原始特征提取
原始特征是指直接从交易日志中提取的、未经变换的字段。下表列出了金融交易中最核心的原始特征类别及其典型字段:
| 特征类别 | 典型原始字段 | 数据类型 | 说明 |
|---|---|---|---|
| 交易时间 | transaction_time | datetime | 精确到秒的交易发生时间戳 |
| 交易金额 | amount | float | 交易的本币金额,单位通常为元或分 |
| 交易频率 | 无直接字段 | — | 需通过聚合计算得到 |
| 地理位置 | merchant_city, merchant_country, lat, lng | string / float | 商户或交易发生地的经纬度与行政区域 |
| 设备指纹 | device_id, device_type, os_version, browser_fingerprint | string | 用户设备的唯一标识与软硬件信息 |
| IP地址 | ip_address | string | 发起交易请求的IP地址 |
特征提取原则:原始特征应保持完整性和可追溯性。在后续衍生特征构建过程中,始终保留原始字段作为基线,避免因过度变换导致信息丢失。
3.2 时间特征衍生
时间特征是识别周期性异常和时效性攻击的关键。从原始时间戳中可衍生出以下特征:
- 时间切片特征:小时(0-23)、星期几(0-6)、是否周末(0/1)、是否节假日(0/1)、月份(1-12)、季度(1-4)。
- 距上次交易时间差:同一用户/设备相邻两笔交易的时间间隔(秒/分钟/小时)。
- 距特定事件时间:距用户注册时间、距上次密码修改时间、距上次异常告警时间。
- 时段标志:是否在凌晨(0:00-6:00)、是否在工作时间(9:00-18:00)、是否在非典型交易时段。
实战案例:某支付平台发现,凌晨2:00-5:00发生的单笔大额交易(金额>5000元)的欺诈率是白天同金额交易的7.3倍。通过引入“凌晨交易标志”特征,模型召回率提升了12%。
3.3 金额特征衍生
金额特征直接反映交易的经济规模,异常交易往往在金额分布上呈现离群特性。
- 对数变换:log(amount + 1),缓解金额长尾分布带来的尺度问题。
- 金额分箱:将连续金额离散化为区间,如[0-100), [100-1000), [1000-10000), [10000+)。
- 相对金额比:当前金额 / 用户历史平均金额、当前金额 / 用户历史最大金额、当前金额 / 账户余额。
- 金额整数检测:金额是否为整数(如10000.00)、金额是否接近常见阈值(如9999.99)。
# 金额特征衍生示例(Python伪代码)
import numpy as np
def derive_amount_features(df):
df['amount_log'] = np.log1p(df['amount'])
df['amount_ratio_to_avg'] = df['amount'] / df.groupby('user_id')['amount'].transform('mean')
df['amount_ratio_to_max'] = df['amount'] / df.groupby('user_id')['amount'].transform('max')
df['is_round_amount'] = (df['amount'] % 1 == 0).astype(int)
df['amount_bin'] = pd.cut(df['amount'], bins=[0, 100, 1000, 10000, np.inf], labels=['tiny','small','medium','large'])
return df
3.4 频率与聚合特征
频率特征通过统计用户在特定时间窗口内的交易行为来刻画行为模式。这类特征对识别“爆破式”攻击和“慢速”试探攻击均有效。
| 窗口类型 | 窗口长度 | 聚合指标 | 典型应用场景 |
|---|---|---|---|
| 滑动窗口 | 1小时 / 6小时 / 24小时 | 交易次数、总金额、平均金额、最大金额 | 检测短时间内高频交易 |
| 日历窗口 | 当天 / 当周 / 当月 | 交易次数、金额标准差、金额变异系数 | 识别与历史同期行为偏差 |
| 累计窗口 | 自注册以来 | 累计交易次数、累计总金额、累计失败次数 | 评估账户生命周期行为 |
窗口边界效应:滑动窗口的边界选择直接影响特征稳定性。建议同时使用多个窗口长度(如1h、6h、24h)进行特征构建,并通过特征重要性评估选择最优窗口。
3.5 地理位置特征
地理位置特征用于检测交易地点与用户常驻地之间的异常偏离。
- 经纬度直接特征:交易发生地的纬度、经度、国家代码、城市代码。
- 距离计算:交易地点与用户注册地、与上次交易地、与常用收货地址之间的球面距离(Haversine公式)。
- 地理聚类:基于经纬度进行DBSCAN聚类,生成交易地点簇ID,判断当前交易是否属于用户历史高频簇。
- 跨区域标志:是否跨省、是否跨国、是否跨大洲、是否在短时间内(如1小时内)出现在两个相距甚远的城市。
# Haversine距离计算示例
import math
def haversine(lat1, lon1, lat2, lon2):
R = 6371 # 地球半径(公里)
dlat = math.radians(lat2 - lat1)
dlon = math.radians(lon2 - lon1)
a = math.sin(dlat/2)**2 + math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.sin(dlon/2)**2
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
return R * c
3.6 设备指纹与IP地址特征
设备指纹和IP地址是识别“机器行为”和“代理攻击”的核心维度。
3.6.1 设备指纹特征
- 设备唯一性:设备ID是否在短时间内关联多个用户账号(设备共享度)。
- 设备环境:操作系统类型、浏览器版本、屏幕分辨率、时区、语言设置是否与历史记录一致。
- 设备异常标志:是否使用模拟器、是否开启代理/VPN、是否root/越狱、是否安装可疑应用。
3.6.2 IP地址特征
- IP属性:IP所属运营商(电信/联通/移动/数据中心)、IP类型(住宅/商业/数据中心/代理)、IP地理位置(国家/城市/ASN)。
- IP风险评分:IP是否在黑名单中、IP是否属于已知代理/VPN出口、IP的威胁情报评分。
- IP关联特征:同一IP关联的用户数、同一IP关联的设备数、IP在最近24小时内的请求次数。
特征交叉示例:“设备ID + IP地址”的组合特征在识别团伙欺诈时效果显著。例如,同一设备ID在短时间内使用多个不同IP地址(IP跳变),或同一IP地址关联大量不同设备ID,均为高风险信号。
3.7 特征工程整体流程
下图展示了从原始交易数据到最终特征矩阵的完整构建流程:
3.8 特征质量评估与迭代
特征构建完成后,需从以下维度进行质量评估:
- 缺失率:单特征缺失率超过50%应谨慎使用,超过80%建议剔除。
- 方差:方差接近0的特征(如99%样本取值相同)对模型区分无贡献。
- 相关性:特征间相关系数>0.95时,考虑保留业务意义更强的一个,或进行PCA降维。
- 特征重要性:基于LightGBM或XGBoost的特征重要性排序,剔除重要性为零的特征。
- 业务可解释性:优先保留能够被业务团队理解和验证的特征,避免纯黑盒特征。
迭代建议:建议每轮特征工程后,使用小样本训练一个快速模型(如逻辑回归或浅层树模型),通过特征系数或分裂增益快速评估特征有效性,再决定是否进行大规模全量特征计算。
3.9 特征工程避坑指南
| 常见错误 | 后果 | 正确做法 |
|---|---|---|
| 使用未来信息构建特征 | 数据泄露,模型在线上失效 | 严格按时间顺序划分训练/验证集,只使用历史窗口数据 |
| 对类别特征进行无序编码 | 引入虚假的数值顺序关系 | 使用目标编码、频率编码或embedding |
| 忽略时间衰减 | 历史行为权重过高,无法捕捉行为漂移 | 引入时间衰减因子,近期行为赋予更高权重 |
| 特征维度爆炸 | 过拟合、训练效率低下 | 先进行单特征有效性筛选,再构建交叉特征 |
| 直接使用原始IP/设备ID作为特征 | 高基数特征导致模型不稳定 | 聚合为统计特征(如该IP历史交易次数、风险评分) |
特征工程是异常交易检测模型成功的关键环节。原始特征提取保证了信息的完整性,而衍生特征构建则赋予了模型识别复杂攻击模式的能力。在实际项目中,特征工程通常占据整个建模工作量的60%以上,值得投入充分的精力进行迭代优化。