4. 特征工程

在保单继续率建模中,原始数据往往来自保单管理系统、缴费流水、客服工单、渠道佣金表等多个异构数据源。这些数据字段多、噪声大、口径不统一,直接送入模型通常效果不佳。特征工程正是把“原始业务数据”翻译成“模型可理解的信号”的关键环节。本节围绕特征提取、特征选择、特征变换三条主线,结合继续率场景给出可落地的做法。

一、核心原理:特征工程在继续率建模中的定位

继续率建模的本质是预测“保单在某个观察点是否仍然有效/是否续期”。它同时受客户意愿、缴费能力、渠道质量、产品设计、服务体验等多因素影响。特征工程的目标不是堆字段,而是构造出与“续期行为”有稳定因果或统计关联的变量。可以把它理解为三个动作的循环:

  • 特征提取:从原始表、日志、文本中“造”出有业务含义的变量,例如首期缴费及时性、保单年度、渠道历史继续率。
  • 特征选择:在候选特征集中剔除冗余、泄漏、弱相关变量,降低过拟合与维度灾难。
  • 特征变换:把特征调整为模型更易学习的形态,如分箱、编码、标准化、时间窗口聚合。
在继续率项目中,特征工程往往比模型选型带来更大的AUC提升。一个常见的经验比例是:数据与特征工作占项目总工作量的60%以上。

二、特征提取:从业务动作到变量

继续率场景的特征提取应围绕“保单生命周期”展开。建议按时间轴切分:承保前、承保时、首期缴费、观察期、续期窗口。每个阶段都有可提取的信号。

阶段典型原始字段提取出的特征示例
承保前渠道、代理人、地区、产品渠道历史13月继续率、代理人司龄、地区退保率
承保时保额、保费、缴费年期、投保年龄保费收入比、缴费年期倒数、年龄分箱
首期缴费缴费日期、应缴日期、支付方式首期缴费延迟天数、是否自动转账、支付失败次数
观察期客服工单、保全记录、理赔记录工单频次、保全变更次数、是否发生理赔
续期窗口续期应缴日、宽限期、催收记录宽限期内缴费概率、催收触达次数、历史续期次数

对于文本类数据,如工单描述、回访记录,可用关键词计数或TF-IDF提取“退保”“投诉”“资金紧张”等信号。对于时间序列,可提取趋势、波动、最近一次行为距今天数等。下面是一个用Python做基础聚合的示例:

import pandas as pd

# 按保单聚合缴费行为
pay_agg = pay_df.groupby('policy_id').agg(
    pay_count=('pay_date', 'count'),
    late_days_max=('late_days', 'max'),
    late_days_mean=('late_days', 'mean'),
    last_pay_gap=('pay_date', lambda x: (ref_date - x.max()).days)
).reset_index()

# 合并渠道历史继续率
df = df.merge(channel_rate, on='channel_id', how='left')

三、特征选择:去伪存真

候选特征可能上百个,但并非越多越好。继续率建模中尤其要警惕两类问题:一是数据泄漏,例如用“续期缴费成功”预测“是否续期”;二是多重共线性,例如保费、保额、缴费年期高度相关。常用选择方法包括:

  1. 过滤法:计算IV值、卡方、互信息,先筛掉弱相关变量。
  2. 包裹法:递归特征消除(RFE),用模型性能反推特征子集。
  3. 嵌入法:L1正则、树模型特征重要性,边训练边选择。
在继续率项目中,建议先做业务可解释性审查,再做统计筛选。一个特征即使IV很高,如果业务上无法解释或上线后无法稳定获取,也应谨慎保留。

四、特征变换:让模型学得更稳

变换的目的在于改善分布、统一量纲、表达非线性。继续率场景常用变换包括:

  • 分箱:将连续变量离散化,如年龄每5岁一箱,提升稳定性与可解释性。
  • 编码:类别变量用WOE编码或目标编码,避免独热编码维度爆炸。
  • 标准化/归一化:对逻辑回归、神经网络必要,对树模型影响较小。
  • 时间窗口变换:把“最近3个月缴费延迟次数”作为滚动特征。
  • 缺失值处理:继续率数据中缺失本身可能携带信息,可单独设“缺失”类别。
from sklearn.preprocessing import KBinsDiscretizer

# 对年龄做等频分箱
kbd = KBinsDiscretizer(n_bins=5, encode='ordinal', strategy='quantile')
df['age_bin'] = kbd.fit_transform(df[['age']])

# WOE编码示例(伪代码)
woe_map = train.groupby('age_bin')['target'].apply(lambda x: np.log((x.sum()+0.5)/(len(x)-x.sum()+0.5)))
df['age_woe'] = df['age_bin'].map(woe_map)

五、案例与复盘:一个渠道特征引发的误判

某寿险公司在13月继续率模型中,加入“渠道历史继续率”后AUC从0.72提升到0.79。但上线后发现新渠道样本极少,历史继续率波动极大,导致新渠道保单被系统性误判。复盘结论是:该特征需要做平滑处理(如贝叶斯平滑)并增加“样本量”作为伴随特征。这说明特征变换与选择必须结合业务稳定性,而非只看离线指标。

常见误区:把“未来信息”混入特征,例如用续期后的客服记录预测续期;或对全量数据做分箱后再切分训练测试集,造成信息泄漏。正确做法是先在训练集拟合变换参数,再应用到验证集和测试集。
继续率特征工程:提取 → 选择 → 变换 特征提取 承保前 / 承保时 首期缴费 / 观察期 续期窗口 渠道历史继续率 首期缴费延迟天数 工单频次 / 保全次数 宽限期内缴费概率 文本关键词 / 滚动窗口 特征选择 过滤法:IV / 卡方 包裹法:RFE 嵌入法:L1 / 树重要性 剔除数据泄漏 剔除多重共线性 业务可解释性审查 上线可获取性校验 保留稳定且可解释的子集 特征变换 分箱 / WOE编码 标准化 / 归一化 时间窗口聚合 缺失值单独编码 贝叶斯平滑 训练集拟合参数 验证集/测试集复用 避免信息泄漏

总结来看,继续率特征工程不是一次性动作,而是随业务迭代持续优化的过程。提取要覆盖保单全生命周期,选择要兼顾统计显著与业务稳定,变换要防止信息泄漏并保持线上线下一致。把这三步做扎实,后续模型才能发挥真正价值。