4、特征工程基础:特征构建思路、时间窗口切片、聚合统计特征
在贷后预警场景中,原始数据通常以交易流水、还款记录、催收日志等形式存在,无法直接用于模型训练。特征工程的核心任务是将这些原始数据转化为能够有效区分“好样本”与“坏样本”的数值特征。本章聚焦于特征构建的三大基础模块:特征构建思路、时间窗口切片以及聚合统计特征。
4.1 特征构建思路
特征构建并非盲目堆砌变量,而是基于业务逻辑与数据形态的系统性设计。贷后预警特征通常从以下三个维度出发:
- 行为维度:借款人的还款行为、消费行为、联系行为等。例如:近30天还款次数、逾期天数、联系客服频率。
- 状态维度:借款人在某一时间点的静态属性。例如:当前逾期金额、授信额度、剩余本金。
- 趋势维度:行为或状态随时间的变化方向。例如:近3个月逾期天数环比变化、月均消费金额的增长率。
业务提示: 特征构建应优先选择与“坏样本”定义(如逾期90天以上、核销、失联)有明确因果或强相关关系的变量。避免引入过多噪声特征,导致模型过拟合。
下表总结了三种维度的典型特征示例及其在贷后预警中的意义:
| 维度 | 典型特征示例 | 预警意义 |
|---|---|---|
| 行为维度 | 近7天还款失败次数 | 反映借款人短期资金链紧张程度 |
| 状态维度 | 当前逾期金额占比 | 衡量当前违约严重程度 |
| 趋势维度 | 近3个月月均消费金额变化率 | 捕捉收入或消费能力下降趋势 |
4.2 时间窗口切片
时间窗口切片是特征工程中处理时序数据的关键技术。它通过定义固定的时间区间,将连续的行为序列切分为可比较的片段,从而提取出不同时间段内的行为模式。
常见的时间窗口类型包括:
- 固定长度窗口:如近7天、近30天、近90天。适用于捕捉短期与中期行为变化。
- 滑动窗口:以当前时间点为基准,向前滑动固定步长。例如:近30天、近60天、近90天的还款行为。
- 日历窗口:按自然月、季度或年划分。适用于与账单周期、考核周期对齐的场景。
- 事件窗口:以特定事件(如首次逾期、催收联系)为起点或终点。适用于分析事件前后的行为变化。
关键原则: 窗口长度的选择需平衡信息量与时效性。窗口过短可能无法反映稳定模式,窗口过长则可能引入过时信息,降低预警灵敏度。
下图展示了贷后预警中常用的时间窗口切片策略:
4.3 聚合统计特征
在确定时间窗口后,需要对窗口内的原始数据进行聚合计算,生成具有统计意义的特征。最常用的聚合统计量包括:最大值、最小值、均值和标准差。
这些统计量从不同角度刻画了借款人在窗口内的行为特征:
- 最大值:反映窗口内的极端行为。例如:近30天最大逾期天数、单日最大消费金额。
- 最小值:反映窗口内的最低水平。例如:近90天最低还款金额、最低账户余额。
- 均值:反映窗口内的平均水平。例如:近7天日均消费金额、月均还款次数。
- 标准差:反映窗口内的波动程度。例如:近30天还款金额的标准差,波动越大说明还款行为越不稳定。
避坑提醒: 标准差特征对异常值敏感,在数据清洗不充分时可能导致特征失真。建议在计算标准差前先进行分位数截断或异常值处理。
下表以“还款行为”为例,展示不同聚合统计量的业务含义:
| 聚合统计量 | 特征名称 | 计算方式 | 业务含义 |
|---|---|---|---|
| 最大值 | 近30天最大还款金额 | max(还款金额) | 反映借款人短期内的最大还款能力 |
| 最小值 | 近30天最小还款金额 | min(还款金额) | 反映借款人短期内的最低还款意愿或能力 |
| 均值 | 近30天日均还款金额 | avg(还款金额) | 反映借款人短期内的平均还款水平 |
| 标准差 | 近30天还款金额标准差 | std(还款金额) | 反映借款人还款行为的稳定性,波动越大风险越高 |
4.4 特征构建实战:代码示例
以下代码展示了如何使用Python对贷后数据进行时间窗口切片与聚合统计特征构建:
import pandas as pd
import numpy as np
# 示例数据:用户还款流水
data = {
'user_id': ['A001', 'A001', 'A001', 'A002', 'A002'],
'repay_date': ['2024-01-05', '2024-01-20', '2024-02-10', '2024-01-15', '2024-02-05'],
'repay_amount': [500, 300, 600, 1000, 800]
}
df = pd.DataFrame(data)
df['repay_date'] = pd.to_datetime(df['repay_date'])
# 定义当前时间点
current_date = pd.Timestamp('2024-02-15')
# 时间窗口切片:近30天
df['window_30d'] = (current_date - df['repay_date']).dt.days <= 30
# 聚合统计特征计算
features = df[df['window_30d']].groupby('user_id').agg(
repay_max_30d=('repay_amount', 'max'),
repay_min_30d=('repay_amount', 'min'),
repay_mean_30d=('repay_amount', 'mean'),
repay_std_30d=('repay_amount', 'std')
).reset_index()
print(features)
输出说明: 上述代码为每个用户生成了近30天内的还款金额最大值、最小值、均值与标准差。这些特征可直接用于贷后预警模型的训练。
4.5 特征构建流程总览
下图总结了从原始数据到聚合统计特征的完整构建流程:
通过上述流程,我们可以将原始的时序数据转化为结构化的特征矩阵,为后续的坏样本归因分析提供高质量的输入变量。