4. 特征工程入门:原始特征提取、特征变换、特征分箱、特征选择的基本方法
特征工程是评分卡建模中决定模型上限的关键环节。在支付风控场景中,原始交易数据往往包含大量噪声、缺失值和极端分布,直接输入模型会导致过拟合或泛化能力不足。本节系统讲解特征工程的四个核心步骤:原始特征提取、特征变换、特征分箱和特征选择,并给出支付风控场景下的实战技巧。
4.1 原始特征提取:从交易日志中挖掘信号
原始特征提取是指从支付系统产生的原始字段中直接构造可用特征。支付风控的原始数据通常来自交易流水、设备指纹、用户画像和外部黑名单等数据源。常见的原始特征类型如下表所示:
| 特征类别 | 典型字段 | 提取方式 | 风控含义 |
|---|---|---|---|
| 交易属性 | 金额、时间、币种、支付渠道 | 直接取值 | 识别大额、深夜、跨境等异常 |
| 设备指纹 | IP、设备ID、浏览器UA、GPS | 哈希编码、类别映射 | 检测设备聚集、模拟器、代理IP |
| 用户画像 | 注册时长、历史交易次数、绑卡数 | 聚合统计 | 评估用户成熟度与信用 |
| 行为序列 | 点击流、页面停留时间、输入速度 | 滑动窗口统计 | 识别机器人或脚本操作 |
| 外部数据 | 黑名单命中、征信评分、运营商数据 | API 查询后二值化 | 补充第三方风险信号 |
实战提示:支付风控中,时间窗口聚合特征(如“过去1小时内该IP的交易次数”)比单笔特征更具区分度。建议优先提取 5分钟、1小时、24小时 三个窗口的统计量(均值、最大值、标准差)。
4.2 特征变换:让数据分布更适配模型
原始特征往往存在偏态分布、量纲差异或非线性关系,直接使用会降低线性模型(如逻辑回归)的拟合效果。常用的特征变换方法包括:
- 对数变换:对金额、交易次数等长尾分布特征取 log(1+x),压缩极端值影响。
- 标准化/归一化:Z-score 标准化(均值为0,标准差为1)或 Min-Max 归一化,消除量纲差异。
- 幂变换:Box-Cox 或 Yeo-Johnson 变换,使数据更接近正态分布。
- 离散化:将连续特征按业务阈值转为有序类别(如金额分档:小额/中额/大额)。
- 交互特征:对两个特征做乘除或交叉组合,捕捉协同效应(如“金额 × 距离”)。
评分卡场景建议:逻辑回归评分卡对特征线性关系敏感,建议优先使用 对数变换 + 标准化 的组合。对于树模型(如 XGBoost),特征变换的必要性较低,但分箱仍有助于提升可解释性。
4.3 特征分箱:提升模型稳健性与可解释性
特征分箱(Binning)是将连续变量或高基数离散变量划分为有限个区间(箱),是评分卡建模的核心技术。分箱的主要目的包括:处理非线性关系、降低异常值影响、满足评分卡单调性要求、提升模型可解释性。
4.3.1 常用分箱方法对比
| 分箱方法 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 等距分箱 | 按数值区间等宽划分 | 简单直观 | 易受异常值影响,箱内样本不均 | 分布均匀的连续特征 |
| 等频分箱 | 按样本数量等频划分 | 箱内样本量均衡 | 可能将相似值分到不同箱 | 长尾分布特征 |
| 决策树分箱 | 用单变量决策树寻找最优切分点 | 自动捕捉非线性关系 | 容易过拟合 | 特征与目标强相关时 |
| 卡方分箱 | 基于卡方检验合并相邻区间 | 保证箱内目标分布一致性 | 计算复杂度较高 | 评分卡单调性要求 |
| 业务分箱 | 按业务经验设定阈值 | 可解释性最强 | 依赖专家经验 | 有明确业务规则的特征 |
避坑提醒:分箱后每个箱的样本量不应少于总样本的 5%,且坏样本率(逾期/欺诈率)应呈现单调递增或递减趋势。若出现“倒U型”或“锯齿状”分布,说明分箱不合理,需要合并或调整切分点。
4.3.2 分箱后的特征编码
分箱完成后,需要将类别型箱位转换为数值型输入模型。评分卡中常用的编码方式包括:
- WOE编码(Weight of Evidence):计算每个箱的 WOE = ln(好样本占比 / 坏样本占比),直接作为特征值。WOE 编码天然支持逻辑回归的线性假设,是评分卡的标准做法。
- IV值筛选:计算每个特征的 IV(Information Value),IV < 0.02 表示无预测力,0.02~0.1 为弱,0.1~0.3 为中,>0.3 为强。
- 独热编码:将每个箱位展开为 0/1 哑变量,适用于树模型。
# Python 示例:使用 scikit-learn 进行等频分箱 + WOE 编码
import pandas as pd
import numpy as np
from sklearn.preprocessing import KBinsDiscretizer
# 假设 df 包含特征 'amount' 和目标 'is_fraud'
df = pd.DataFrame({
'amount': [100, 200, 1500, 3000, 500, 8000, 12000, 200, 450, 6000],
'is_fraud': [0, 0, 1, 1, 0, 1, 1, 0, 0, 1]
})
# 等频分箱(5箱)
kbd = KBinsDiscretizer(n_bins=5, encode='ordinal', strategy='quantile')
df['amount_bin'] = kbd.fit_transform(df[['amount']]).astype(int)
# 计算每个箱的 WOE
def calc_woe(df, feature, target):
total_good = (df[target] == 0).sum()
total_bad = (df[target] == 1).sum()
woe_dict = {}
for bin_val in sorted(df[feature].unique()):
subset = df[df[feature] == bin_val]
good = (subset[target] == 0).sum()
bad = (subset[target] == 1).sum()
good_dist = good / total_good if total_good > 0 else 0.0001
bad_dist = bad / total_bad if total_bad > 0 else 0.0001
woe = np.log(good_dist / bad_dist)
woe_dict[bin_val] = woe
return woe_dict
woe_map = calc_woe(df, 'amount_bin', 'is_fraud')
df['amount_woe'] = df['amount_bin'].map(woe_map)
print(df[['amount', 'amount_bin', 'amount_woe']])
4.4 特征选择:去芜存菁,防止维度灾难
特征选择是从原始特征集中筛选出对模型预测贡献最大的子集,避免过拟合、降低训练成本、提升模型泛化能力。支付风控场景中,特征维度可能高达数百甚至上千,必须进行系统性筛选。
4.4.1 特征选择三大方法
| 方法类别 | 代表算法 | 原理 | 优点 | 缺点 |
|---|---|---|---|---|
| 过滤法 | IV值、卡方检验、互信息、方差阈值 | 独立于模型,基于统计指标排序 | 计算快,适合高维数据 | 忽略特征间交互 |
| 包裹法 | 递归特征消除(RFE)、前向/后向搜索 | 以模型性能为评价指标 | 考虑特征组合效果 | 计算开销大,易过拟合 |
| 嵌入法 | L1正则化(Lasso)、树模型特征重要性 | 在模型训练过程中自动选择 | 效率与效果平衡 | 依赖模型假设 |
4.4.2 支付风控特征选择实战流程
- 缺失率过滤:删除缺失率 > 70% 的特征(支付风控中设备指纹类特征常缺失严重)。
- 方差过滤:删除方差接近 0 的常数特征(如 99% 样本为同一值的渠道字段)。
- 相关性过滤:计算特征间 Pearson 或 Spearman 相关系数,删除相关系数 > 0.8 的冗余特征对,保留与目标相关性更高的一方。
- IV值筛选:保留 IV > 0.02 的特征,对 IV > 0.5 的特征需警惕过拟合,建议结合业务判断。
- 模型重要性排序:使用 LightGBM 或 XGBoost 训练一轮,按 feature_importance 保留 Top N 特征。
- 业务合规审查:删除涉及用户隐私或监管禁止使用的特征(如身份证号、精确GPS坐标)。
4.5 特征工程实战避坑清单
核心原则:特征工程不是一次性工作,需要与模型评估迭代进行。每次添加或变换特征后,必须重新验证模型在 OOT(跨时间)样本上的稳定性。
- 数据泄露:避免使用未来信息构造特征(如用“交易是否成功”预测“是否欺诈”,因为成功状态在决策之后)。
- 特征穿越:时间窗口特征必须基于历史数据计算,不能包含当前交易之后的信息。
- 过度分箱:分箱数不宜过多(建议 3~8 箱),否则每个箱的样本量过少,统计意义下降。
- 忽略业务逻辑:纯统计筛选可能删除业务上重要的特征(如“是否绑定银行卡”IV值低但业务意义重大),建议保留 Top 5 业务特征。
- 特征冗余:高度相关的特征会导致模型共线性问题,逻辑回归中尤其需要关注 VIF(方差膨胀因子)< 10。