4. 特征工程入门:特征构建思路、时间窗口特征、聚合特征、比率特征、特征选择方法
在坏样本归因与催收分析(Collections Analytics)中,原始数据通常无法直接用于建模。特征工程是将原始数据转化为模型可理解、可区分的数值化信息的过程。本章聚焦于催收场景下最核心的四大特征构建思路与特征选择方法,帮助您从海量交易与行为日志中提取高价值信号。
4.1 特征构建的核心思路
特征构建的本质是业务理解 + 数据变换。在催收分析中,我们关注的核心问题是:“哪些行为模式预示着客户将长期逾期或失联?” 基于此,特征构建应遵循以下三条原则:
- 可解释性优先:特征需能映射到具体的催收动作或客户行为,如“近7天联系次数”比“PCA降维后的第3主成分”更具业务指导意义。
- 时间敏感性:逾期行为具有明显的时序衰减或恶化趋势,特征必须包含时间窗口信息。
- 群体对比性:单一绝对值意义有限,需结合比率、排名或群体均值进行对比。
实战提示: 在构建特征前,先绘制一张“数据源-特征类型”映射表,明确每个原始字段(如通话时长、还款金额、催收员备注)可以衍生出哪些特征,避免遗漏关键信号。
4.2 时间窗口特征
时间窗口特征是催收分析中最常用的特征类型,用于捕捉客户行为在特定时间段内的变化趋势。常见的窗口包括:近3天、近7天、近14天、近30天、近90天。
| 窗口类型 | 典型特征示例 | 业务含义 |
|---|---|---|
| 短期窗口(1-7天) | 近3天联系次数、近7天还款金额 | 捕捉近期行为突变,如失联前兆或还款意愿恢复 |
| 中期窗口(14-30天) | 近14天接通率、近30天承诺还款次数 | 评估客户配合度与履约稳定性 |
| 长期窗口(60-90天) | 近90天最大逾期天数、近60天平均通话时长 | 刻画客户整体信用画像与长期行为模式 |
构建时间窗口特征时,需注意窗口对齐问题:所有特征必须基于同一个“观察截止日”进行回溯,避免未来信息泄露。
# 示例:基于Python构建近7天联系次数特征
import pandas as pd
def build_contact_count_feature(df, contact_log, window_days=7):
"""
df: 客户主表,包含客户ID与观察截止日
contact_log: 联系日志表,包含客户ID、联系时间、联系结果
"""
# 计算每个客户在观察截止日前window_days天内的联系次数
merged = df.merge(contact_log, on='customer_id', how='left')
mask = (merged['contact_time'] >= merged['obs_date'] - pd.Timedelta(days=window_days)) & \
(merged['contact_time'] <= merged['obs_date'])
feature = merged[mask].groupby('customer_id').size().reset_index(name=f'contact_{window_days}d')
return df.merge(feature, on='customer_id', how='left')
避坑指南: 窗口天数不宜过短(如1天)或过长(如180天)。过短会导致特征稀疏,过长则会引入过多历史噪音。建议从7天、14天、30天三个窗口开始尝试。
4.3 聚合特征
聚合特征是对客户在某个维度上的行为数据进行统计汇总,常见的聚合函数包括:计数、求和、均值、最大值、最小值、标准差、最近值。在催收场景中,聚合特征常用于处理“催收员-客户”交互记录。
- 计数类:总联系次数、总承诺还款次数、总失联次数。
- 统计量类:平均通话时长、最长通话间隔、还款金额标准差。
- 序列类:最近一次联系结果、最近一次还款日期距观察日天数。
注意: 聚合特征容易产生“数据泄露”风险。例如,使用“总还款金额”作为特征时,如果观察截止日之后发生的还款也被计入,则模型会提前“看到”未来信息。务必确保聚合操作在观察截止日之前完成。
4.4 比率特征
比率特征通过将两个相关指标相除,消除量纲影响,反映客户行为的效率、密度或转化率。在催收分析中,比率特征往往比绝对值特征更具区分度。
| 比率类型 | 计算公式 | 业务解读 |
|---|---|---|
| 联系接通率 | 接通次数 / 总联系次数 | 客户可触达性,越低越可能失联 |
| 承诺履约率 | 实际还款次数 / 承诺还款次数 | 客户信用度与还款意愿 |
| 还款金额占比 | 已还金额 / 应还总额 | 当前偿还进度,越低风险越高 |
| 联系密度 | 总联系次数 / 逾期天数 | 催收强度与客户反应速度 |
实战技巧: 构建比率特征时,务必处理分母为0的情况。例如,当总联系次数为0时,接通率应填充为0或-1(表示无联系记录),而非报错或填充为无穷大。
# 比率特征构建示例
def build_ratio_features(df):
# 联系接通率
df['contact_connect_rate'] = df['connected_count'] / (df['total_contact_count'] + 1e-6)
# 承诺履约率
df['promise_fulfill_rate'] = df['actual_payment_count'] / (df['promise_count'] + 1e-6)
# 还款金额占比
df['repayment_ratio'] = df['paid_amount'] / (df['total_due_amount'] + 1e-6)
# 处理分母为0的情况
df.loc[df['total_contact_count'] == 0, 'contact_connect_rate'] = -1
df.loc[df['promise_count'] == 0, 'promise_fulfill_rate'] = -1
return df
4.5 特征选择方法
特征构建完成后,通常会产生数百甚至上千个特征。特征选择的目标是剔除冗余、噪声特征,提升模型泛化能力与训练效率。常用的特征选择方法分为三类:
- 过滤法(Filter):基于统计指标(如IV值、卡方检验、相关系数)对特征进行排序,选择Top-K特征。计算效率高,但忽略特征间交互。
- 包裹法(Wrapper):使用模型性能(如AUC)作为评价指标,通过递归特征消除(RFE)或前向/后向搜索选择最优特征子集。效果较好,但计算成本高。
- 嵌入法(Embedded):在模型训练过程中自动进行特征选择,如L1正则化(Lasso)、树模型的特征重要性。兼顾效率与效果,是工业界首选。
推荐实践: 在催收分析项目中,建议采用“过滤法初筛 + 嵌入法精炼”的组合策略。先用IV值过滤掉预测能力弱的特征(IV < 0.02),再使用LightGBM的特征重要性进行二次筛选,保留Top 50-100个特征用于建模。
4.6 特征工程实战清单
在完成本章学习后,请对照以下清单检查您的特征工程流程:
- 时间窗口对齐:所有特征是否基于同一个观察截止日?
- 聚合函数选择:是否针对不同业务场景选择了合适的聚合函数(计数、均值、最近值等)?
- 比率特征分母处理:是否处理了分母为0或缺失的情况?
- 特征选择验证:是否在验证集上评估了特征选择后的模型性能变化?
- 特征存储与版本管理:是否记录了每个特征的构建逻辑与参数,便于后续回溯与迭代?
常见错误: 在特征工程阶段过度使用未来信息(如用“是否在观察日后还款”作为特征),会导致模型在线上表现远低于离线测试结果。务必在构建每个特征时,明确其信息时间戳是否在观察截止日之前。