3. 特征工程入门
特征工程是支付风控模型的核心前置环节,直接影响模型的上限。原始交易日志、用户画像、设备指纹等数据无法直接输入模型,必须经过提取、筛选与尺度变换。本章围绕三个核心环节展开:特征提取(从原始数据中构造数值特征)、特征选择(剔除冗余与噪声)、特征标准化与归一化(消除量纲影响)。
3.1 特征提取方法
特征提取的目标是将非结构化或半结构化的原始数据转化为数值向量。在支付风控场景中,最常用的三类特征为:统计特征、时序特征、比率特征。
3.1.1 统计特征
统计特征是对交易字段进行聚合计算得到的描述性指标,常用于刻画用户或设备的交易行为模式。
| 特征类别 | 常用指标 | 风控示例 |
|---|---|---|
| 集中趋势 | 均值、中位数、众数 | 近30天单笔交易金额均值 |
| 离散程度 | 标准差、方差、极差、四分位距 | 交易金额标准差(异常大额波动) |
| 分布形态 | 偏度、峰度 | 交易时间分布偏度(夜间集中) |
| 计数与占比 | 交易次数、失败次数、失败率 | 过去1小时交易失败次数 |
import pandas as pd
import numpy as np
# 示例:计算用户级统计特征
txn_data = pd.read_csv('transactions.csv')
user_stats = txn_data.groupby('user_id').agg(
txn_count=('amount', 'count'),
avg_amount=('amount', 'mean'),
std_amount=('amount', 'std'),
max_amount=('amount', 'max'),
fail_count=('status', lambda x: (x == 'fail').sum())
).reset_index()
3.1.2 时序特征
时序特征捕捉交易行为在时间维度上的模式,包括周期性、趋势、突变点等。支付风控中常用的时序特征构造方式如下:
- 滑动窗口统计:过去5分钟/1小时/24小时内的交易金额总和、次数、最大值。
- 时间衰减聚合:对历史交易按时间距离赋予不同权重,近期交易权重更高。
- 时间戳分解:提取小时、星期几、是否节假日、是否凌晨等周期性特征。
- 间隔特征:当前交易与上一笔交易的时间间隔(秒/分钟)。
# 滑动窗口特征:过去1小时交易次数
txn_data['txn_time'] = pd.to_datetime(txn_data['txn_time'])
txn_data = txn_data.sort_values(['user_id', 'txn_time'])
txn_data['txn_1h_count'] = (
txn_data.groupby('user_id')['txn_time']
.rolling(window='1h', min_periods=1)
.count()
.reset_index(level=0, drop=True)
)
3.1.3 比率特征
比率特征通过两个或多个字段的比值来消除绝对量级的影响,更能反映行为模式。常见比率特征包括:
| 比率类型 | 计算公式 | 风控含义 |
|---|---|---|
| 金额比率 | 当前金额 / 历史平均金额 | 偏离正常消费水平的程度 |
| 频率比率 | 当前时段交易次数 / 历史同时段平均次数 | 交易频率异常升高 |
| 成功率比率 | 当前成功率 / 历史平均成功率 | 账户被盗后成功率可能骤降 |
| 设备比率 | 该设备交易次数 / 总交易次数 | 设备集中度异常 |
# 比率特征示例:当前金额与用户历史均值的比值
user_avg = txn_data.groupby('user_id')['amount'].mean().to_dict()
txn_data['amount_ratio'] = txn_data['amount'] / txn_data['user_id'].map(user_avg)
3.2 特征选择
特征选择旨在从高维特征中筛选出对模型预测最有贡献的子集,降低过拟合风险、减少训练时间、提升模型可解释性。根据选择策略的不同,分为过滤法、包裹法、嵌入法三类。
3.2.1 过滤法 (Filter Method)
过滤法在模型训练之前,基于统计指标对特征进行独立评估,速度快、可扩展性强。常用指标包括:
- 方差阈值:剔除方差接近0的常数特征。
- 皮尔逊相关系数:衡量特征与目标变量的线性相关性。
- 卡方检验:适用于分类目标与分类特征。
- 互信息:捕捉特征与目标之间的非线性关系。
from sklearn.feature_selection import VarianceThreshold, SelectKBest, chi2, mutual_info_classif
# 方差过滤
selector_var = VarianceThreshold(threshold=0.01)
X_var = selector_var.fit_transform(X)
# 卡方检验(特征需非负)
selector_chi2 = SelectKBest(chi2, k=20)
X_chi2 = selector_chi2.fit_transform(X, y)
3.2.2 包裹法 (Wrapper Method)
包裹法将特征子集的选择视为搜索问题,使用模型性能作为评价指标。虽然计算开销大,但通常能获得更优的特征子集。
| 方法 | 搜索策略 | 优点 | 缺点 |
|---|---|---|---|
| 递归特征消除 (RFE) | 从全特征开始,逐步剔除最不重要的特征 | 考虑特征交互 | 计算成本高 |
| 前向选择 | 从空集开始,逐步添加最优特征 | 避免冗余特征 | 可能陷入局部最优 |
| 后向消除 | 从全特征开始,逐步剔除最差特征 | 保留全局信息 | 特征多时效率低 |
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier
# 递归特征消除
estimator = RandomForestClassifier(n_estimators=100)
selector_rfe = RFE(estimator, n_features_to_select=15)
X_rfe = selector_rfe.fit_transform(X, y)
print("选中的特征索引:", selector_rfe.support_)
3.2.3 嵌入法 (Embedded Method)
嵌入法将特征选择过程嵌入到模型训练中,在模型拟合的同时完成特征重要性评估。典型代表包括:
- L1正则化 (Lasso):通过惩罚项将不重要特征的系数压缩为0。
- 树模型特征重要性:随机森林、XGBoost等模型输出特征重要性评分。
- SelectFromModel:基于重要性阈值自动筛选特征。
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import SelectFromModel
# L1正则化特征选择
model_l1 = LogisticRegression(penalty='l1', solver='liblinear', C=0.1)
model_l1.fit(X, y)
selector_l1 = SelectFromModel(model_l1, prefit=True, threshold='mean')
X_l1 = selector_l1.transform(X)
3.3 特征标准化与归一化
不同特征的量纲和数值范围差异巨大(如交易金额从0.01到百万,交易次数从1到数千),直接输入模型会导致量级大的特征主导模型训练。标准化与归一化是消除量纲影响的两种主要手段。
3.3.1 标准化 (Standardization / Z-score)
标准化将特征转换为均值为0、标准差为1的分布,适用于数据近似正态分布的场景。公式为:
z = (x - μ) / σ
其中 μ 为特征均值,σ 为标准差。标准化不改变数据的分布形态,仅改变尺度。
from sklearn.preprocessing import StandardScaler
scaler_std = StandardScaler()
X_std = scaler_std.fit_transform(X)
# 查看转换后的均值和标准差
print("均值:", X_std.mean(axis=0))
print("标准差:", X_std.std(axis=0))
3.3.2 归一化 (Normalization / Min-Max Scaling)
归一化将特征缩放到固定区间(通常为[0,1]),适用于数据有明确边界或需要保持稀疏性的场景。公式为:
x' = (x - min) / (max - min)
from sklearn.preprocessing import MinMaxScaler
scaler_mm = MinMaxScaler(feature_range=(0, 1))
X_mm = scaler_mm.fit_transform(X)
# 查看转换后的最小值和最大值
print("最小值:", X_mm.min(axis=0))
print("最大值:", X_mm.max(axis=0))
3.3.3 选择策略对比
| 对比维度 | 标准化 (StandardScaler) | 归一化 (MinMaxScaler) |
|---|---|---|
| 输出范围 | 无固定范围(理论为(-∞, +∞)) | 固定区间(默认[0,1]) |
| 对异常值敏感度 | 较低(基于均值和标准差) | 高(受最大值最小值影响大) |
| 适用模型 | SVM、逻辑回归、神经网络、PCA | KNN、K-Means、神经网络(输入层) |
| 保留分布形态 | 是(仅改变尺度) | 是(线性变换) |
| 稀疏数据适用性 | 不推荐(破坏稀疏性) | 不推荐(破坏稀疏性) |
3.3.4 其他常用缩放方法
- RobustScaler:基于中位数和四分位距,对异常值鲁棒性更强。
- MaxAbsScaler:将特征缩放到[-1,1]区间,适用于稀疏数据。
- PowerTransformer:使用Box-Cox或Yeo-Johnson变换,使数据更接近正态分布。
from sklearn.preprocessing import RobustScaler, MaxAbsScaler, PowerTransformer
# RobustScaler 示例
scaler_robust = RobustScaler()
X_robust = scaler_robust.fit_transform(X)
# PowerTransformer 示例
scaler_power = PowerTransformer(method='yeo-johnson')
X_power = scaler_power.fit_transform(X)