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 聚合特征

聚合特征是对客户在某个维度上的行为数据进行统计汇总,常见的聚合函数包括:计数、求和、均值、最大值、最小值、标准差、最近值。在催收场景中,聚合特征常用于处理“催收员-客户”交互记录。

  • 计数类:总联系次数、总承诺还款次数、总失联次数。
  • 统计量类:平均通话时长、最长通话间隔、还款金额标准差。
  • 序列类:最近一次联系结果、最近一次还款日期距观察日天数。
注意: 聚合特征容易产生“数据泄露”风险。例如,使用“总还款金额”作为特征时,如果观察截止日之后发生的还款也被计入,则模型会提前“看到”未来信息。务必确保聚合操作在观察截止日之前完成。
聚合特征构建流程 原始交互日志 按客户ID分组 聚合函数计算 计数 求和 均值 标准差 聚合特征矩阵

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)、树模型的特征重要性。兼顾效率与效果,是工业界首选。
特征选择方法对比 过滤法 (Filter) IV值 > 0.02 相关系数 |r| > 0.1 卡方检验 p < 0.05 优点:快速、可扩展 缺点:忽略特征交互 适用:高维数据初筛 包裹法 (Wrapper) 递归特征消除 (RFE) 前向/后向搜索 基于模型AUC选择 优点:考虑特征组合 缺点:计算成本高 适用:特征数<100 嵌入法 (Embedded) L1正则化 (Lasso) 树模型特征重要性 LightGBM内置选择 优点:效率与效果平衡 缺点:依赖模型假设 适用:工业界首选
推荐实践: 在催收分析项目中,建议采用“过滤法初筛 + 嵌入法精炼”的组合策略。先用IV值过滤掉预测能力弱的特征(IV < 0.02),再使用LightGBM的特征重要性进行二次筛选,保留Top 50-100个特征用于建模。

4.6 特征工程实战清单

在完成本章学习后,请对照以下清单检查您的特征工程流程:

  1. 时间窗口对齐:所有特征是否基于同一个观察截止日?
  2. 聚合函数选择:是否针对不同业务场景选择了合适的聚合函数(计数、均值、最近值等)?
  3. 比率特征分母处理:是否处理了分母为0或缺失的情况?
  4. 特征选择验证:是否在验证集上评估了特征选择后的模型性能变化?
  5. 特征存储与版本管理:是否记录了每个特征的构建逻辑与参数,便于后续回溯与迭代?
常见错误: 在特征工程阶段过度使用未来信息(如用“是否在观察日后还款”作为特征),会导致模型在线上表现远低于离线测试结果。务必在构建每个特征时,明确其信息时间戳是否在观察截止日之前。