3、特征工程基础:特征构建思路、时间窗口特征、统计聚合特征、比率特征

在催收触达模型中,原始数据通常无法直接用于模型训练。特征工程是将原始数据转化为模型可理解、可学习的高质量输入变量的过程。本章聚焦于催收场景下最核心的四类特征构建方法:基础特征构建思路、时间窗口特征、统计聚合特征和比率特征。掌握这些方法,能够显著提升模型对逾期客户还款意愿与还款能力的刻画能力。

3.1 特征构建总体思路

特征构建的核心原则是:从业务逻辑出发,以数据分布为验证。在催收场景中,特征构建通常遵循以下三步流程:

  1. 业务理解:明确催收策略的关键驱动因素(如逾期天数、历史还款行为、联系人响应率)。
  2. 数据探索:分析原始字段的缺失率、分布形态、与目标变量(如是否还款)的相关性。
  3. 特征生成:基于业务假设,通过变换、聚合、组合等方式生成新特征。
💡 关键原则: 特征不是越多越好。优先构建与催收动作直接相关的特征(如“最近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 个之间,既能保证模型性能,又避免过拟合。