3、特征工程基础:特征构建思路、时间窗口特征、统计聚合特征、比率特征
在催收触达模型中,原始数据通常无法直接用于模型训练。特征工程是将原始数据转化为模型可理解、可学习的高质量输入变量的过程。本章聚焦于催收场景下最核心的四类特征构建方法:基础特征构建思路、时间窗口特征、统计聚合特征和比率特征。掌握这些方法,能够显著提升模型对逾期客户还款意愿与还款能力的刻画能力。
3.1 特征构建总体思路
特征构建的核心原则是:从业务逻辑出发,以数据分布为验证。在催收场景中,特征构建通常遵循以下三步流程:
- 业务理解:明确催收策略的关键驱动因素(如逾期天数、历史还款行为、联系人响应率)。
- 数据探索:分析原始字段的缺失率、分布形态、与目标变量(如是否还款)的相关性。
- 特征生成:基于业务假设,通过变换、聚合、组合等方式生成新特征。
💡 关键原则: 特征不是越多越好。优先构建与催收动作直接相关的特征(如“最近7天联系次数”),再逐步扩展至间接特征(如“历史最大逾期天数”)。避免引入与目标变量无关的噪声特征。
3.2 时间窗口特征
时间窗口特征是催收模型中最具预测力的特征类型之一。它通过限定一个时间范围(如“过去7天”、“过去30天”),统计客户在该窗口内的行为模式。时间窗口的选择直接影响特征的稳定性和时效性。
3.2.1 窗口类型与选择策略
| 窗口类型 | 定义 | 催收场景示例 | 适用场景 |
|---|---|---|---|
| 固定窗口 | 以当前时间点为基准,向前固定天数 | 过去7天内的催收通话次数 | 短期行为模式分析 |
| 滑动窗口 | 以多个连续时间区间分别统计 | 过去7天/14天/30天的还款金额趋势 | 行为趋势与变化率分析 |
| 事件窗口 | 以上一次特定事件为基准 | 自上次承诺还款日以来的天数 | 事件驱动的行为预测 |
| 日历窗口 | 按自然日历周期(周/月/季) | 本月至今的还款次数 | 周期性行为分析 |
📌 实践建议: 在催收场景中,建议优先使用固定窗口+滑动窗口的组合。例如,同时构建“过去7天通话次数”(固定窗口)和“过去7天 vs 过去14天通话次数变化率”(滑动窗口),以捕捉短期行为突变。
3.2.2 时间窗口特征构建示例
以下代码展示了如何使用 Python 构建时间窗口特征(以过去7天催收通话次数为例):
import pandas as pd
from datetime import timedelta
# 假设 df 包含客户每日通话记录
# 字段:customer_id, call_date, call_duration
def build_time_window_features(df, window_days=7):
"""
构建时间窗口特征:过去 window_days 天的通话次数与总时长
"""
# 确保日期格式
df['call_date'] = pd.to_datetime(df['call_date'])
# 按客户分组,对每个日期计算窗口内的统计量
df = df.sort_values(['customer_id', 'call_date'])
# 使用 rolling 窗口(需先按客户分组并设置日期索引)
df['past_7d_call_count'] = (
df.groupby('customer_id')['call_date']
.transform(lambda x: x.rolling(window=window_days, min_periods=1).count())
)
df['past_7d_total_duration'] = (
df.groupby('customer_id')['call_duration']
.transform(lambda x: x.rolling(window=window_days, min_periods=1).sum())
)
return df
# 示例调用
# df_result = build_time_window_features(df_call_log, window_days=7)
3.3 统计聚合特征
统计聚合特征通过对原始数据进行分组统计,提取出能够反映客户整体行为模式的指标。在催收场景中,常用的聚合统计量包括:计数、均值、标准差、最大值、最小值、分位数等。
3.3.1 常用聚合统计量
| 统计量 | 含义 | 催收场景应用 |
|---|---|---|
| 计数 (count) | 事件发生的总次数 | 历史总催收通话次数 |
| 均值 (mean) | 事件的平均水平 | 平均每次通话时长 |
| 标准差 (std) | 事件的波动程度 | 还款金额的波动性(波动越大,还款不确定性越高) |
| 最大值/最小值 | 事件的极端值 | 历史最大逾期天数、最小还款金额 |
| 分位数 (quantile) | 事件的分布位置 | 通话时长的75%分位数(反映高时长通话模式) |
⚠️ 注意: 聚合特征容易受到数据稀疏性的影响。对于新客户(历史数据极少),聚合特征可能缺失或不可靠。建议对聚合特征进行缺失值填充(如使用全局均值或中位数),并添加“历史数据量”作为辅助特征。
3.3.2 多层级聚合
在催收场景中,聚合可以在多个层级上进行,以捕捉不同粒度的行为模式:
- 客户层级:对每个客户的所有历史记录进行聚合(如“历史总还款次数”)。
- 产品层级:按贷款产品类型分组聚合(如“信用贷产品的平均逾期天数”)。
- 时间层级:按年/月/周分组聚合(如“每月平均通话次数”)。
- 催收员层级:按负责的催收员分组聚合(如“该催收员负责客户的平均还款率”)。
3.4 比率特征
比率特征通过将两个相关指标相除,消除量纲影响,反映客户行为的相对强度或效率。在催收模型中,比率特征往往比原始绝对值更具预测稳定性。
3.4.1 常见比率特征类型
| 比率类型 | 计算公式 | 催收场景含义 |
|---|---|---|
| 还款率 | 已还款金额 / 应还款总额 | 客户的还款完成度 |
| 联系响应率 | 接通次数 / 总呼叫次数 | 客户的可触达性 |
| 承诺履约率 | 履约次数 / 承诺还款次数 | 客户的信用可靠性 |
| 逾期强度比 | 当前逾期天数 / 历史最大逾期天数 | 当前逾期严重程度相对历史水平 |
| 通话效率比 | 有效通话时长 / 总通话时长 | 催收沟通的效率 |
3.4.2 比率特征构建注意事项
- 分母不为零:构建比率特征时,必须处理分母为零的情况。常见做法包括:加一个小常数(如 0.001)、使用条件判断、或填充为默认值。
- 避免信息泄露:比率特征中的分子和分母必须来自历史数据,不能包含未来信息。例如,“当前逾期天数 / 历史最大逾期天数”中的历史最大逾期天数应截止到当前时间点。
- 结合业务阈值:某些比率特征在特定阈值附近具有业务含义。例如,“联系响应率 < 0.1”可能意味着客户失联,需要触发不同的催收策略。
🔧 代码示例: 构建“联系响应率”比率特征
import pandas as pd
import numpy as np
def build_ratio_features(df):
"""
构建催收场景常用比率特征
"""
# 联系响应率 = 接通次数 / 总呼叫次数
# 处理分母为零:加极小常数
df['contact_response_rate'] = (
df['connected_calls'] / (df['total_calls'] + 1e-6)
)
# 承诺履约率 = 履约次数 / 承诺还款次数
# 处理分母为零:若从未承诺,则履约率设为 NaN 或 0
df['promise_fulfill_rate'] = np.where(
df['promise_count'] > 0,
df['fulfill_count'] / df['promise_count'],
0 # 从未承诺的客户,履约率设为 0
)
# 逾期强度比 = 当前逾期天数 / 历史最大逾期天数
# 处理分母为零:若历史最大逾期天数为 0,则设为 0
df['overdue_intensity_ratio'] = np.where(
df['max_overdue_days'] > 0,
df['current_overdue_days'] / df['max_overdue_days'],
0
)
return df
# 示例调用
# df_features = build_ratio_features(df_customer)
3.5 特征构建综合示例
以下表格展示了一个完整的催收触达模型特征集示例,涵盖时间窗口、统计聚合和比率三类特征:
| 特征名称 | 特征类型 | 构建方法 | 业务含义 |
|---|---|---|---|
| past_7d_call_count | 时间窗口 | 过去7天催收通话次数 | 近期催收触达频率 |
| past_30d_avg_call_duration | 时间窗口+聚合 | 过去30天平均通话时长 | 近期沟通深度 |
| total_historical_payments | 统计聚合 | 历史总还款次数 | 客户整体还款意愿 |
| payment_amount_std | 统计聚合 | 历史还款金额标准差 | 还款行为稳定性 |
| contact_response_rate | 比率 | 接通次数 / 总呼叫次数 | 客户可触达性 |
| overdue_intensity_ratio | 比率 | 当前逾期天数 / 历史最大逾期天数 | 逾期相对严重程度 |
| promise_fulfill_rate | 比率 | 履约次数 / 承诺还款次数 | 客户信用可靠性 |
📌 最终建议: 特征构建完成后,务必进行特征筛选。使用相关性分析、特征重要性排序(如基于 LightGBM 的特征重要性)或方差阈值过滤,剔除冗余或无效特征。通常,催收触达模型的特征数量控制在 50~200 个之间,既能保证模型性能,又避免过拟合。