4. 特征工程提升命中率:特征构造、特征选择与交叉组合

在精算模型中,原始数据往往无法直接提供足够的预测信号。特征工程是将原始数据转化为模型可有效利用的特征空间的核心环节,直接决定了规则命中率的上限。本章围绕特征构造、特征选择、特征交叉与组合、高基数特征处理四大技术展开,结合精算业务场景给出可落地的实战方法。

核心观点:特征工程不是一次性工作,而是与模型评估、业务理解迭代进行的闭环过程。好的特征工程可以提升规则命中率 5%~20%,远高于单纯调参带来的收益。

4.1 特征构造:从原始数据中提取信号

特征构造是根据业务逻辑和统计规律,从原始字段中生成新特征的过程。精算模型中常见的特征构造方法包括:

构造方法 描述 精算业务示例
统计聚合 对历史数据进行分组统计(均值、方差、分位数、偏度等) 过去12个月该险种的平均赔付金额、赔付次数标准差
时间窗口 按固定时间窗口(7天/30天/90天)计算累计或滑动指标 近30天出险次数、近90天保费增长率
比率/差值 两个或多个字段的比值或差值,消除量纲影响 赔付金额/保费收入、当前年龄-投保年龄
分箱/离散化 将连续变量按业务阈值或分位数划分为有序类别 年龄分箱:[18-25]、[26-35]、[36-50]、[51-65]
编码转换 将类别变量转化为数值型特征 职业类别进行目标编码(Target Encoding)
实战建议:特征构造应优先从业务规则出发,例如精算中的“赔付率=赔付金额/已赚保费”本身就是强特征。不要盲目构造大量无业务含义的特征,避免过拟合和计算开销。
特征构造流程 原始数据 统计聚合 时间窗口 比率/差值 分箱/编码 特征池 进入特征选择环节

4.2 特征选择:Filter / Wrapper / Embedded

特征选择旨在从大量候选特征中筛选出对规则命中率贡献最大的子集,降低维度、减少过拟合、提升模型可解释性。三种主流方法对比如下:

方法类别 核心原理 优点 缺点 精算适用场景
Filter(过滤法) 基于统计指标(卡方、互信息、方差分析、相关系数)独立评估每个特征 计算快、与模型无关、可解释性强 忽略特征间交互作用 大规模初筛,快速剔除噪声特征
Wrapper(包装法) 以模型性能为评价函数,通过搜索策略(前向/后向/递归消除)选择特征子集 考虑特征组合效果,命中率更高 计算开销大,易过拟合 特征数较少(<50)时的精细选择
Embedded(嵌入法) 在模型训练过程中自动进行特征选择(L1正则化、树模型特征重要性) 效率与效果平衡,自带正则化 特征重要性受模型类型影响 GBDT/LR模型中的特征筛选
避坑提示:Filter方法中,不要仅依赖皮尔逊相关系数,精算数据常存在非线性关系。建议同时使用互信息(Mutual Information)或最大信息系数(MIC)作为补充。

4.2.1 实战代码示例:Filter + Embedded 组合策略

import pandas as pd
import numpy as np
from sklearn.feature_selection import SelectKBest, mutual_info_classif
from sklearn.ensemble import GradientBoostingClassifier

# 假设 X_train 为特征矩阵,y_train 为二分类标签(命中/未命中)
# Step 1: Filter 初筛 — 互信息法
selector = SelectKBest(score_func=mutual_info_classif, k=100)
X_selected = selector.fit_transform(X_train, y_train)
selected_mask = selector.get_support()
selected_features = X_train.columns[selected_mask]

# Step 2: Embedded 精筛 — GBDT 特征重要性
gbdt = GradientBoostingClassifier(n_estimators=200, max_depth=4, random_state=42)
gbdt.fit(X_selected, y_train)
importance = gbdt.feature_importances_

# 保留重要性排名前 30 的特征
top_k_idx = np.argsort(importance)[::-1][:30]
final_features = selected_features[top_k_idx]

print(f"最终保留特征数: {len(final_features)}")
print(f"Top 5 特征: {final_features[:5].tolist()}")

4.3 特征交叉与组合:挖掘高阶交互信号

精算模型中,单一特征往往不足以刻画复杂风险。特征交叉通过组合两个或多个原始特征,生成能捕捉交互效应的新特征,显著提升规则命中率。

4.3.1 常见交叉方式

  • 笛卡尔积交叉:类别特征两两组合,如 性别 × 职业类别,生成新类别特征。
  • 多项式交叉:连续特征进行乘除或多项式运算,如 年龄² × 保额。
  • 业务规则交叉:基于精算经验定义组合规则,如 年龄 > 50 且 有慢性病史 生成高风险标识。
  • 模型自动交叉:使用FM(因子分解机)或DeepFM等模型自动学习特征交互。
交叉类型 示例 命中率提升效果 注意事项
类别×类别 地区 × 险种 中等(3%~8%) 注意组合后的稀疏性
连续×连续 年龄 × 保额 较高(5%~12%) 需归一化避免量纲问题
类别×连续 职业 × 收入 高(8%~15%) 建议使用分组统计量
高阶交叉(3阶+) 年龄 × 性别 × 地区 视数据量而定 极易过拟合,需正则化
特征交叉组合策略 特征A(年龄) 特征B(性别) 特征C(地区) 笛卡尔积 多项式交叉 业务规则交叉 交叉特征池 (含交互信号) 命中率提升 5%~15%

4.4 高基数特征处理

高基数特征(如地区代码、职业编码、医院ID等)在精算数据中非常常见。直接进行独热编码会导致维度爆炸,且大量稀疏列会降低模型命中率。常用处理方法如下:

处理方法 原理 适用场景 命中率影响
目标编码(Target Encoding) 用类别对应的目标变量均值(或平滑后均值)替换原始类别 类别与目标有较强相关性时 提升明显(需防过拟合)
频数编码(Count Encoding) 用每个类别在训练集中出现的频次作为特征值 类别分布极不均匀时 中等提升
哈希编码(Hashing Encoding) 将类别通过哈希函数映射到固定维度的向量 类别数极大(>10万)且内存受限 可能损失部分信息
聚类/分层合并 按业务含义或统计相似性将小类别合并为上层类别 有明确业务层级时 稳定且可解释
嵌入(Embedding) 使用神经网络将类别映射为低维稠密向量 深度学习模型场景 效果最优但计算成本高

4.4.1 目标编码实战(带平滑与交叉验证)

import numpy as np
import pandas as pd
from sklearn.model_selection import KFold

def target_encoding_smooth(X, y, col, alpha=10, n_folds=5):
    """
    带平滑和交叉验证的目标编码,防止过拟合
    alpha: 平滑强度,越大越趋向全局均值
    """
    X_encoded = X.copy()
    global_mean = y.mean()
    
    kf = KFold(n_splits=n_folds, shuffle=True, random_state=42)
    X_encoded[col + '_te'] = np.nan
    
    for train_idx, val_idx in kf.split(X):
        X_train_fold = X.iloc[train_idx]
        y_train_fold = y.iloc[train_idx]
        
        # 计算每个类别的均值
        category_means = y_train_fold.groupby(X_train_fold[col]).mean()
        category_counts = y_train_fold.groupby(X_train_fold[col]).count()
        
        # 平滑公式: (count * mean + alpha * global_mean) / (count + alpha)
        smoothed = (category_counts * category_means + alpha * global_mean) / (category_counts + alpha)
        
        # 映射到验证集
        X_encoded.loc[val_idx, col + '_te'] = X.iloc[val_idx][col].map(smoothed)
    
    # 处理验证集中未出现的新类别
    X_encoded[col + '_te'] = X_encoded[col + '_te'].fillna(global_mean)
    
    return X_encoded

# 使用示例
# df_encoded = target_encoding_smooth(df, df['target'], 'region_code', alpha=15)
关键参数说明:平滑参数 alpha 控制先验强度。alpha 越大,编码值越向全局均值收缩,正则化效果越强。建议通过交叉验证选择 alpha,常见范围 5~50。

4.5 特征工程闭环:从构造到评估

特征工程不是一次性的流水线,而是一个迭代闭环。建议按以下步骤持续优化:

  1. 基线建立:使用原始特征训练模型,记录命中率基线。
  2. 特征构造:基于业务理解和统计探索,生成候选特征集。
  3. 特征选择:先Filter快速过滤,再Embedded或Wrapper精筛。
  4. 交叉组合:对保留特征进行有业务含义的交叉,生成高阶特征。
  5. 高基数处理:对类别特征进行目标编码或频数编码。
  6. 评估验证:在验证集上评估命中率提升,避免过拟合。
  7. 迭代优化:根据评估结果,调整构造方向或选择策略。
实战总结:特征工程的核心原则是“业务驱动 + 数据验证”。不要为了堆特征而堆特征,每个新特征都应能回答“为什么这个特征能提升规则命中率”。在精算场景中,特征的可解释性往往比模型复杂度更重要。