2. 风控数据基础:交易数据特征工程概述

交易风控模型的性能上限,往往在特征工程阶段就已决定。原始交易日志包含用户ID、金额、时间戳、设备指纹、IP地址等字段,但这些原始字段无法直接输入XGBoost模型。特征工程的目标是将原始数据转化为能够刻画“正常交易”与“欺诈交易”之间差异的数值化特征。

核心原则: 风控特征必须具有区分度(欺诈与正常分布不同)、稳定性(随时间变化可控)和可解释性(业务逻辑可理解)。

2.1 常见风控特征体系

交易风控特征通常分为五大维度:金额、频次、时间、设备与地理位置。下表总结了每个维度的典型特征及其业务含义。

维度 典型特征 业务含义与欺诈模式
金额 交易金额、历史平均金额、金额标准差、金额与历史均值的偏差比 欺诈交易常出现“大额突增”或“精确整数金额”(如9999.00)
频次 过去1小时/24小时/7天交易次数、同一设备/IP关联账户数 高频交易、短时间内大量尝试不同账户是典型机器人行为
时间 交易时刻(凌晨/白天)、距离上次交易间隔、是否在节假日 凌晨3-5点交易、与历史活跃时段严重偏离属于高危信号
设备 设备ID、设备是否root/越狱、模拟器检测、浏览器指纹 模拟器、改机工具、设备ID频繁更换是团伙欺诈的典型特征
地理位置 IP归属地、GPS坐标、IP与GPS是否匹配、常用登录城市 IP与GPS跨省/跨国不匹配、短时间内无法到达的地理跳跃
实战提示: 在XGBoost模型中,频次类特征和金额偏差类特征通常具有最高的特征重要性(Feature Importance)。建议优先构建这两类特征。

2.2 特征工程核心流程

从原始交易日志到模型可用的特征矩阵,通常需要经过以下步骤:

  1. 数据清洗: 去除重复交易、修正格式错误、统一时间戳时区。
  2. 基础特征提取: 从原始字段直接提取,如交易金额、交易时间戳的“小时”字段。
  3. 统计聚合特征: 按用户ID、设备ID、IP等维度进行滑动窗口聚合(均值、最大值、标准差、计数)。
  4. 交叉特征: 将两个或多个基础特征组合,如“金额/历史平均金额”、“IP所在城市与GPS所在城市是否一致”。
  5. 编码与归一化: 类别特征进行Label Encoding或Target Encoding;连续特征进行标准化或分箱。
交易风控特征工程流程 原始交易日志 数据清洗 基础特征提取 统计聚合特征 交叉特征 编码与归一化 特征矩阵 关键:滑动窗口聚合(如过去1小时交易次数)是区分正常用户与机器人的最强特征之一

2.3 数据质量与缺失值处理

真实交易数据中,缺失值、异常值和重复数据是常态。数据质量直接决定模型的上限。常见的数据质量问题包括:

  • 缺失值: 设备指纹(如IMEI)可能因权限限制而缺失;地理位置信息可能因用户关闭GPS而缺失。
  • 异常值: 交易金额为0或负数、时间戳为未来时间、IP地址为内网保留地址。
  • 重复数据: 网络重试导致同一笔交易被记录多次。

2.4 缺失值处理策略

针对风控场景,缺失值处理不能简单使用均值填充,因为“缺失”本身可能就是一个强信号。例如,设备指纹缺失往往意味着用户使用了隐私保护工具,这本身就是高风险行为。

特征类型 推荐策略 风控场景说明
设备指纹 填充为“UNKNOWN”或“MISSING”类别 缺失本身是高风险信号,应保留为独立类别
地理位置 填充为“0,0”或“UNKNOWN” 缺失时无法校验IP与GPS一致性,应标记为异常
连续数值(如金额) 填充为-1或中位数 金额缺失极少见,若出现则填充为-1以便模型识别
类别特征(如卡类型) 填充为“OTHER”或“MISSING” 保持类别完整性,避免引入偏差
避坑指南: 不要对风控特征使用“均值填充”或“众数填充”。欺诈样本的缺失模式与正常样本完全不同,均值填充会抹杀这种差异,导致模型失效。始终将“缺失”视为一种有价值的信息。

2.5 数据质量监控与特征验证

在特征工程完成后,必须进行数据质量验证,确保特征矩阵可以被XGBoost正常消费。验证清单如下:

  • 完整性检查: 特征矩阵是否存在全空列?是否存在全空行?
  • 数值范围检查: 连续特征是否存在无穷大或NaN值?XGBoost无法处理NaN,必须提前处理。
  • 类别平衡检查: 类别特征中是否存在某个类别占比超过99%?这类特征对模型贡献极低,建议剔除。
  • 时间一致性检查: 训练集与测试集的特征分布是否一致?是否存在时间穿越(未来数据泄露到过去)?
数据质量监控与特征验证流程 特征矩阵输入 完整性检查 数值范围检查 类别平衡检查 时间一致性检查 通过验证 任何一项检查失败,都应返回特征工程阶段进行修复,否则模型上线后会出现严重的性能衰退

2.6 实战代码示例:特征工程与缺失值处理

以下代码展示了使用Python进行交易数据特征工程与缺失值处理的核心逻辑。该代码片段可直接用于生产环境的数据预处理管道。

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder

# 加载原始交易数据
df = pd.read_csv('transactions.csv')

# 1. 基础特征提取
df['transaction_hour'] = pd.to_datetime(df['transaction_time']).dt.hour
df['is_night'] = (df['transaction_hour'] < 6).astype(int)

# 2. 统计聚合特征(按用户ID滑动窗口)
user_stats = df.groupby('user_id').agg(
    avg_amount_1h=('amount', lambda x: x.rolling(60, min_periods=1).mean().iloc[-1]),
    tx_count_24h=('transaction_id', lambda x: x.rolling(1440, min_periods=1).count().iloc[-1])
).reset_index()

# 3. 交叉特征
df['amount_deviation'] = df['amount'] / (df['avg_amount_1h'] + 1e-8)

# 4. 缺失值处理(风控专用策略)
df['device_id'].fillna('MISSING_DEVICE', inplace=True)
df['gps_coord'].fillna('0,0', inplace=True)
df['amount'].fillna(-1, inplace=True)

# 5. 类别特征编码
le = LabelEncoder()
df['device_id_encoded'] = le.fit_transform(df['device_id'])

print("特征工程完成,特征矩阵形状:", df.shape)
print("缺失值数量:", df.isnull().sum().sum())
关键点: 上述代码中,rolling(60, min_periods=1) 表示使用过去60分钟的交易数据进行滑动窗口聚合。在实际生产中,窗口大小需要根据业务场景调整,通常为5分钟、1小时、24小时和7天四个粒度。

2.7 本章小结

交易风控特征工程是XGBoost模型成功的基础。本章重点介绍了金额、频次、时间、设备、地理位置五大维度的特征构建方法,以及风控场景下特有的缺失值处理策略。核心要点包括:

  • 特征必须具有区分度、稳定性和可解释性。
  • 频次类和金额偏差类特征通常具有最高的模型重要性。
  • 缺失值在风控中应视为信息,而非噪声,推荐使用“MISSING”或“UNKNOWN”填充。
  • 数据质量监控是特征工程不可或缺的环节,必须在上线前完成完整性、数值范围、类别平衡和时间一致性检查。