4. 单变量特征构造:数值型、类别型、时间型
单变量特征构造是授信决策引擎中最基础、最高频的操作。原始字段(如交易金额、职业、申请日期)往往不能直接用于模型,需要经过变换、编码或派生才能转化为有效特征。本章按数据类型分别讲解核心构造方法,并给出实战中的避坑指南。
核心原则:单变量构造的目标是提升特征的区分度(IV)与稳定性(PSI),同时保持业务可解释性。不要为了复杂度而构造冗余特征。
4.1 数值型特征构造
数值型特征(金额、比率、差值)是信用评分模型的主力。原始数值往往存在长尾分布、量纲差异或非线性关系,需要针对性变换。
4.1.1 金额类特征
- 对数变换(Log Transform):对收入、额度、交易金额等右偏分布做 log(1+x) 变换,使分布接近正态,提升线性模型拟合效果。
- 分箱(Binning):将连续金额离散化为等距箱、等频箱或最优分箱(基于IV最大化)。分箱后可直接作为类别特征或计算WOE。
- 截尾处理(Winsorization):对极端值按 1%/99% 分位数截断,防止离群点主导模型。
4.1.2 比率类特征
比率特征天然消除量纲,反映客户的偿债能力和资金效率。常用比率包括:
| 比率名称 | 计算公式 | 业务含义 |
|---|---|---|
| 负债收入比(DTI) | 月总负债 / 月收入 | 偿债压力,越高风险越大 |
| 额度使用率 | 已用额度 / 授信总额度 | 资金紧张程度,>80% 为高风险信号 |
| 收入稳定性比 | 近6月收入标准差 / 均值 | 收入波动性,越高越不稳定 |
| 还款金额比 | 实际还款额 / 应还最低额 | 还款意愿,<1 为逾期预警 |
4.1.3 差值类特征
- 额度差值:授信总额度 - 已用额度,反映可用资金空间。
- 距上次还款天数:当前日期 - 最近一次还款日期,间隔越长逾期概率越高。
- 收入-支出差值:月收入 - 月固定支出,衡量可支配现金流。
实战建议:构造比率和差值时,注意分母不能为零(加极小值平滑),且差值特征通常需要做标准化或分箱后再入模。
4.2 类别型特征编码
类别型特征(职业、学历、地区、婚姻状况)不能直接输入模型,必须转换为数值。三种主流编码方式各有适用场景。
4.2.1 WOE编码(Weight of Evidence)
WOE编码是信用评分领域最推荐的类别编码方式,它直接与目标变量(好坏客户)的分布挂钩,具有天然的排序和单调性优势。
# WOE编码计算示例(Python伪代码)
import numpy as np
def calc_woe(df, feature, target):
# target: 1=坏客户, 0=好客户
total_good = df[target].sum()
total_bad = len(df) - total_good
woe_dict = {}
for cat in df[feature].unique():
sub = df[df[feature] == cat]
good_cnt = sub[target].sum()
bad_cnt = len(sub) - good_cnt
# 平滑处理避免除零
good_dist = (good_cnt + 0.5) / (total_good + 0.5)
bad_dist = (bad_cnt + 0.5) / (total_bad + 0.5)
woe = np.log(good_dist / bad_dist)
woe_dict[cat] = woe
return woe_dict
| 编码方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| WOE编码 | 逻辑回归、评分卡 | 与目标单调相关、可解释性强、处理缺失值 | 对低频类别敏感,需合并 |
| One-Hot编码 | 树模型、神经网络 | 无顺序假设、完整保留类别信息 | 维度爆炸、稀疏矩阵 |
| Label Encoding | 有序类别(学历、评级) | 节省内存、保留序数关系 | 无序类别会引入虚假顺序 |
4.2.2 One-Hot编码
将每个类别扩展为一个二元虚拟变量(0/1)。适用于类别数较少(通常 < 20)且无自然顺序的场景,如婚姻状况、产品类型。注意:当类别过多时会导致维度灾难,建议先做低频合并。
4.2.3 Label Encoding
将类别映射为整数(如小学=1、初中=2、高中=3)。仅适用于有序类别,如学历等级、信用评级。对无序类别(如职业、城市)使用Label Encoding会误导模型认为类别间存在数值大小关系,应避免。
常见错误:对无序类别(如省份、职业)使用Label Encoding后直接入模,导致模型学到错误的数值顺序。正确做法:无序类别用WOE或One-Hot,有序类别才用Label Encoding。
4.3 时间型特征构造
时间型特征(申请日期、还款日、出生日期)不能直接作为数值输入,需要转化为有意义的派生特征。时间特征能捕捉季节性、行为周期和时效性。
4.3.1 距今天数(Recency)
最常用的时间派生特征,反映事件距今的远近。典型应用:
- 距最近逾期天数:距离最近一次逾期记录的天数,越近风险越高。
- 账户开立天数:从开户到当前日期的天数,衡量信用历史长度。
- 距上次申请天数:多次申请间隔,频繁申请(短间隔)是资金紧张信号。
4.3.2 月份与季节
提取申请或交易发生的月份(1-12),用于捕捉季节性效应。例如:春节前后消费贷需求上升,年底逾期率通常偏高。月份特征可作为类别特征(WOE编码)或循环特征(sin/cos变换)入模。
4.3.3 星期与工作日
提取星期几(0-6)或是否为工作日/周末。行为模式差异:周末申请贷款的用户逾期率可能高于工作日申请的用户;还款日落在周末的还款延迟概率更高。
# 时间特征构造示例(Python)
import pandas as pd
from datetime import datetime
def create_time_features(df, date_col):
df['申请日期'] = pd.to_datetime(df[date_col])
ref_date = datetime.now() # 或使用固定参考日期
df['距今天数'] = (ref_date - df['申请日期']).dt.days
df['申请月份'] = df['申请日期'].dt.month
df['申请星期'] = df['申请日期'].dt.weekday
df['是否周末'] = df['申请星期'].isin([5,6]).astype(int)
return df
4.4 单变量构造避坑清单
| 数据类型 | 常见错误 | 正确做法 |
|---|---|---|
| 数值型(金额) | 直接使用原始金额,忽略长尾分布 | 做log变换或分箱,截尾处理极端值 |
| 数值型(比率) | 分母可能为零导致无穷值 | 加极小值(如0.001)平滑处理 |
| 类别型(无序) | 使用Label Encoding引入虚假顺序 | 使用WOE编码或One-Hot编码 |
| 类别型(低频) | 低频类别单独成箱,WOE不稳定 | 合并到“其他”类别,或做频次阈值过滤 |
| 时间型 | 直接使用日期字符串或时间戳 | 转化为距今天数、月份、星期等派生特征 |
| 时间型(星期) | 将星期作为数值0-6直接入模 | 做One-Hot或sin/cos循环编码 |
本章小结:单变量特征构造是特征工程的基石。数值型特征重变换与分箱,类别型特征重编码选择,时间型特征重派生与周期捕捉。掌握这三种数据类型的构造方法,能为后续多变量交叉特征和模型训练打下坚实基础。