4. 单变量特征衍生:基于原始字段的加减乘除、比率、差值、排名等基础变换方法
单变量特征衍生是风控特征工程中最基础、最高效的环节。它不依赖外部数据或复杂模型,仅通过对单个原始字段进行数学变换、排序或分段,就能生成具有业务区分度的新特征。本章将系统讲解加减乘除、比率、差值、排名等核心变换方法,并给出风控场景下的适用条件与避坑指南。
4.1 加减乘除:四则运算的衍生逻辑
四则运算是最直接的数值变换方式,适用于连续型变量(如金额、天数、次数)。其核心思想是通过非线性映射或缩放,放大原始字段在风险分布上的差异。
| 运算类型 | 变换公式 | 风控应用场景 | 注意事项 |
|---|---|---|---|
| 加法 | new_feat = x + c |
偏移处理(如将负数金额转为正数) | 常数 c 需根据业务含义设定,避免破坏分布 |
| 减法 | new_feat = x - y |
差值特征(如“应还金额 - 实还金额”) | 确保 x 与 y 量纲一致,否则需先归一化 |
| 乘法 | new_feat = x * y |
交互强度(如“月收入 × 工作年限”) | 警惕特征膨胀,避免引入共线性 |
| 除法 | new_feat = x / y |
比率特征(如“负债 / 收入”) | 分母不能为零,需做平滑或截断处理 |
实战建议:在风控评分卡中,除法变换(比率)通常比加减法更稳定,因为它能消除量纲影响,使特征在不同客群间具有可比性。例如“月还款额 / 月收入”比单纯的“月还款额”更能反映还款压力。
4.2 比率与差值:风控中最常用的衍生形态
比率和差值特征在信贷风控中几乎无处不在,它们能直接刻画借款人的偿债能力、资金周转效率或行为异常程度。
4.2.1 比率特征
- 负债收入比(DTI):总负债 / 月收入,衡量还款压力。
- 信用卡使用率:已用额度 / 总授信额度,反映资金紧张程度。
- 逾期率:逾期笔数 / 总借款笔数,刻画历史信用表现。
- 收入波动比:近3个月收入标准差 / 近3个月收入均值,评估收入稳定性。
4.2.2 差值特征
- 应还 - 实还:直接反映还款缺口,正值越大风险越高。
- 申请时间 - 出生日期:计算年龄,是基础但有效的风控变量。
- 本次借款金额 - 历史平均借款金额:检测借款行为突变。
- 近1个月消费金额 - 近6个月平均消费金额:识别异常消费模式。
避坑提醒:差值特征容易受极端值影响。例如“应还 - 实还”若出现负值(多还),需确认业务含义是否合理。建议在衍生后做截断(如限制在 [0, 正无穷])或分箱处理。
4.3 排名与分位数:将数值转化为相对位置
排名特征不关心原始数值的绝对大小,只关注样本在全体中的相对顺序。这在风控中能有效消除不同客群间的量纲差异,尤其适合跨时间、跨渠道的样本对比。
| 方法 | 输出 | 风控用途 | 示例 |
|---|---|---|---|
| 升序排名 | 1, 2, 3, ..., N | 识别“最小/最大”极端值 | 收入最低的10%客群 |
| 降序排名 | N, N-1, ..., 1 | 突出“最高”风险样本 | 逾期天数最多的前5% |
| 百分位排名 | 0~100 之间的连续值 | 标准化后入模,避免量纲影响 | 将“借款金额”转为百分位 |
| 分箱排名 | 1, 2, 3, 4, 5(等频分箱) | 离散化后用于评分卡 | 将“年龄”分为5个等频段 |
关键区别:排名特征对异常值不敏感(因为只关心顺序),而原始数值特征对异常值敏感。在风控建模中,如果原始字段存在明显长尾分布(如“借款金额”),优先使用百分位排名或分箱排名,能显著提升模型稳定性。
4.4 单变量衍生流程:从原始字段到新特征
下图展示了单变量特征衍生的标准流程,从原始字段输入到最终特征输出,包含变换、验证、筛选三个核心阶段。
4.5 实战案例:从“借款金额”衍生三个新特征
假设原始字段为 loan_amount(借款金额),我们通过三种不同变换生成新特征,并对比其风控效果。
import pandas as pd
import numpy as np
# 原始数据
df = pd.DataFrame({
'loan_amount': [5000, 12000, 8000, 20000, 15000, 3000, 25000, 6000]
})
# 1. 对数变换(属于幂次变换,但常与四则运算配合使用)
df['log_loan'] = np.log1p(df['loan_amount'])
# 2. 比率变换:借款金额 / 月收入(假设月收入字段存在)
df['monthly_income'] = [8000, 15000, 10000, 25000, 18000, 5000, 30000, 7000]
df['loan_to_income'] = df['loan_amount'] / df['monthly_income']
# 3. 排名变换:百分位排名
df['loan_rank_pct'] = df['loan_amount'].rank(pct=True)
print(df[['loan_amount', 'log_loan', 'loan_to_income', 'loan_rank_pct']].head())
输出解读:
-
-
-
-
log_loan 将长尾分布压缩为近似正态分布,适合线性模型。-
loan_to_income 比率值在 0.5~1.0 之间,直接反映借款人的杠杆水平。-
loan_rank_pct 将绝对金额转化为相对位置,消除不同时间段的金额通胀影响。
4.6 单变量衍生的常见陷阱与应对
| 陷阱 | 表现 | 应对策略 |
|---|---|---|
| 分母为零 | 除法特征出现无穷大或 NaN | 加极小值平滑(如 x / (y + 1e-6))或业务截断 |
| 特征冗余 | 衍生特征与原始字段高度相关(r > 0.95) | 计算相关系数矩阵,剔除冗余特征 |
| 分布偏移 | 训练集与测试集分布不一致 | 使用排名特征替代绝对数值,或做分位数标准化 |
| 业务无意义 | 衍生特征无法解释(如“年龄 × 借款金额”) | 优先选择有业务逻辑支撑的变换(如比率、差值) |
效率技巧:在风控建模初期,建议先批量生成 20~30 个单变量衍生特征(包括对数、平方根、比率、排名、分箱),然后通过 IV(信息量)或单变量 AUC 快速筛选,保留 IV > 0.02 的特征进入后续建模。这比逐个手动尝试更高效。
4.7 单变量衍生 vs. 多变量交叉衍生
单变量衍生只操作一个原始字段,而多变量交叉衍生涉及两个或更多字段的组合。下表对比两者的适用场景:
| 维度 | 单变量衍生 | 多变量交叉衍生 |
|---|---|---|
| 输入字段数 | 1 个 | 2 个及以上 |
| 特征数量 | 线性增长(每个字段可衍生 3~5 个) | 组合爆炸(需谨慎控制) |
| 可解释性 | 高(变换逻辑简单) | 中低(需业务验证) |
| 过拟合风险 | 低 | 高(尤其在小样本场景) |
| 典型方法 | 对数、排名、比率、分箱 | 笛卡尔积、多项式、交叉分箱 |
建模原则:优先使用单变量衍生特征构建基线模型。只有当单变量特征无法区分风险时,再谨慎引入多变量交叉衍生,并配合 L1 正则化或特征选择控制维度。