3. 单变量衍生基础:基于业务逻辑的加减乘除运算,比率与差值构造
单变量衍生是特征工程中最基础、最直观的方法。它不依赖多个变量之间的复杂交互,而是通过对单个字段施加业务逻辑变换,生成新的特征。常见的操作包括四则运算(加减乘除)以及基于这些运算构造的比率与差值。本章将系统讲解这些方法的数学原理、适用场景及实现要点。
3.1 加减乘除运算的业务逻辑
四则运算在单变量衍生中通常用于对原始数值进行缩放、偏移或归一化处理。下表总结了每种运算的典型业务场景与数学形式:
| 运算 | 数学形式 | 典型业务场景 | 示例 |
|---|---|---|---|
| 加法 | \( x' = x + c \) | 偏移调整、消除负值、引入常数基准 | 将收入字段加 1 后取对数 |
| 减法 | \( x' = x - c \) | 去均值、中心化、计算偏离基准的程度 | 用户年龄减去行业平均年龄 |
| 乘法 | \( x' = x \times k \) | 单位转换、权重缩放、标准化到特定范围 | 将金额从元转换为万元(×0.0001) |
| 除法 | \( x' = x / d \) | 归一化、比率构造、消除量纲影响 | 消费金额除以用户历史平均消费 |
实践提示:加减法主要用于调整分布位置,乘除法用于调整尺度。在金融风控模型中,常对收入、负债等字段先做除法(如收入/地区中位数)消除地域差异,再做减法(如减去行业均值)实现中心化。
3.2 比率构造:从绝对数值到相对关系
比率是除法运算在特征衍生中的核心应用。它将绝对数值转化为相对关系,使模型更容易捕捉到“比例”层面的规律。常见的比率类型包括:
- 占比类:部分与整体的比值,如“信用卡消费占比 = 信用卡消费金额 / 总消费金额”。
- 密度类:数值与单位量的比值,如“人均消费 = 总消费金额 / 用户数”。
- 变化率类:增量与基期的比值,如“月增长率 = (本月值 - 上月值) / 上月值”。
- 标准化比率:数值与统计基准的比值,如“收入倍数 = 用户收入 / 当地平均收入”。
比率构造的关键在于分母的选择。分母必须具有业务意义且不为零。当分母可能为零时,需要加入平滑项(如加 1 或加极小值)或进行特殊编码。
案例:信贷评分中的负债比率
原始字段:月收入(income)、月还款额(repayment)。
衍生特征:负债收入比(DTI)= repayment / income。
业务逻辑:DTI 越高,借款人还款压力越大,违约风险越高。该比率比单独使用 repayment 或 income 更具判别力。
原始字段:月收入(income)、月还款额(repayment)。
衍生特征:负债收入比(DTI)= repayment / income。
业务逻辑:DTI 越高,借款人还款压力越大,违约风险越高。该比率比单独使用 repayment 或 income 更具判别力。
3.3 差值构造:捕捉变化与偏离
差值是减法运算在特征衍生中的核心应用。它用于衡量数值的变化幅度或偏离程度。常见的差值类型包括:
- 时间差值:同一实体在不同时间点的数值差,如“本月消费 - 上月消费”。
- 基准差值:数值与某个固定基准的差,如“用户年龄 - 18”。
- 统计差值:数值与群体统计量的差,如“用户收入 - 行业平均收入”。
- 阈值差值:数值与业务阈值的差,如“信用分 - 600(及格线)”。
差值构造可以单独使用,也可以与比率结合形成“变化率”特征。例如,先计算差值(本月值 - 上月值),再除以基期值(上月值),就得到了增长率。
3.4 单变量衍生的完整流程
下图展示了从原始字段到衍生特征的标准流程,包含业务逻辑映射、运算执行与质量检查三个核心阶段。
3.5 代码实现示例
以下 Python 代码展示了如何使用 Pandas 对单个字段进行比率与差值构造:
import pandas as pd
import numpy as np
# 示例数据
df = pd.DataFrame({
'user_id': [1, 2, 3, 4],
'income': [5000, 8000, 6000, 12000],
'debt': [1500, 2000, 1800, 3000],
'age': [25, 35, 28, 42],
'monthly_spend': [2000, 3500, 2500, 5000]
})
# 比率构造:负债收入比
df['dti_ratio'] = df['debt'] / df['income']
# 比率构造:消费收入比
df['spend_income_ratio'] = df['monthly_spend'] / df['income']
# 差值构造:年龄偏离基准(基准=30岁)
df['age_deviation'] = df['age'] - 30
# 差值构造:消费与收入之差(绝对剩余)
df['income_minus_spend'] = df['income'] - df['monthly_spend']
# 组合构造:变化率(假设上月消费已知)
df['last_month_spend'] = [1800, 3200, 2400, 4800]
df['spend_growth_rate'] = (df['monthly_spend'] - df['last_month_spend']) / df['last_month_spend']
print(df[['user_id', 'dti_ratio', 'spend_income_ratio',
'age_deviation', 'income_minus_spend', 'spend_growth_rate']])
3.6 常见陷阱与避坑指南
⚠ 分母为零:在构造比率时,如果分母字段存在零值,会导致无穷大或缺失值。建议在运算前检查分母最小值,必要时添加平滑项:
⚠ 极端值放大:比率和差值对极端值敏感。例如,当分母非常小时,比率会变得极大。建议在衍生后对特征进行截断(winsorize)或分箱处理。
⚠ 业务含义丢失:不要为了衍生而衍生。每个衍生特征都应能解释其业务含义。例如,“收入减去年龄”虽然数学上可行,但缺乏直观的业务解释,通常不建议使用。
ratio = numerator / (denominator + 1e-6)。⚠ 极端值放大:比率和差值对极端值敏感。例如,当分母非常小时,比率会变得极大。建议在衍生后对特征进行截断(winsorize)或分箱处理。
⚠ 业务含义丢失:不要为了衍生而衍生。每个衍生特征都应能解释其业务含义。例如,“收入减去年龄”虽然数学上可行,但缺乏直观的业务解释,通常不建议使用。
3.7 单变量衍生的效果评估
衍生完成后,需要从以下维度评估特征质量:
| 评估维度 | 检查内容 | 合格标准 |
|---|---|---|
| 缺失率 | 衍生特征中 NaN 的比例 | < 5% |
| 分布合理性 | 是否出现极端值或异常分布 | 无长尾拖尾超过 3 个标准差 |
| 业务可解释性 | 特征是否具有明确的业务含义 | 能清晰描述其反映的业务规律 |
| 与目标变量的相关性 | 与目标变量的 IV 值或相关系数 | IV > 0.02 或相关系数显著 |
通过系统性地应用加减乘除运算,并合理构造比率与差值,可以显著提升原始字段的信息密度,为后续的分箱与模型训练打下坚实基础。