2. 特征工程基础回顾:特征类型、特征尺度与质量评估
在精算建模中,坏样本归因的成功与否高度依赖特征的质量。本章系统回顾特征工程的基础概念,涵盖特征类型、特征尺度以及特征质量评估三大核心模块,为后续的坏样本特征构造与筛选奠定理论基础。
2.1 特征类型:数值、类别与时序
精算数据通常包含三种基本特征类型,每种类型在建模前的预处理方式截然不同。
| 特征类型 | 定义 | 精算场景示例 | 常见预处理 |
|---|---|---|---|
| 数值型 | 可量化的连续或离散数值 | 保额、保费、已赚保费、赔付金额、年龄 | 标准化、归一化、对数变换、分箱 |
| 类别型 | 有限个离散取值,无自然顺序 | 险种代码、地区、职业等级、渠道 | 独热编码、标签编码、目标编码、WOE编码 |
| 时序型 | 带有时间顺序的观测值 | 保单生效日期、理赔发生日期、续保时间 | 滞后特征、滑动窗口统计、时间衰减权重 |
精算提示: 坏样本归因中,时序型特征常被忽视。例如,理赔发生距保单生效的时间间隔(“出险时长”)是区分欺诈与正常理赔的关键信号。务必保留时间戳的原始粒度,避免过早聚合。
2.2 特征尺度:测量水平的四种层次
特征尺度(Measurement Scale)决定了特征可进行的数学运算与统计操作。精算建模中常用 Stevens 分类法。
- 定类尺度(Nominal): 仅用于标识类别,无大小、无顺序。如险种代码、性别。只能计算众数。
- 定序尺度(Ordinal): 有顺序但差值无意义。如风险等级(低/中/高)、客户忠诚度评分。可计算中位数。
- 定距尺度(Interval): 差值有意义,但无绝对零点。如温度(摄氏度)、年份。可计算均值、标准差。
- 定比尺度(Ratio): 有绝对零点,比值有意义。如保额、赔付金额、年龄。可进行所有数学运算。
建模影响: 定类与定序特征通常需要编码后进入模型;定距与定比特征可直接输入,但需关注尺度敏感性(如树模型对尺度不敏感,线性模型与神经网络对尺度敏感)。
2.3 特征质量评估:缺失率、唯一值与分布
特征质量直接决定模型的上限。精算数据常存在高缺失、高基数、长尾分布等问题。以下三个指标是特征筛选的第一道关卡。
2.3.1 缺失率(Missing Rate)
缺失率 = 缺失样本数 / 总样本数。精算场景中,缺失往往携带信息(如“未填写理赔原因”可能暗示欺诈)。
- 低缺失(< 5%): 可直接填充(均值/中位数/众数)或删除。
- 中缺失(5% - 30%): 需分析缺失机制(MCAR/MAR/MNAR),考虑模型填充或单独编码。
- 高缺失(> 30%): 通常删除,除非缺失本身是强预测信号。
2.3.2 唯一值(Unique Value Count)
唯一值数量反映特征的区分能力。
| 特征类型 | 唯一值过少 | 唯一值过多 | 精算处理建议 |
|---|---|---|---|
| 类别型 | 几乎为常数(方差为零) | 高基数(如邮编、身份证号) | 合并稀有类别、目标编码、哈希编码 |
| 数值型 | 离散值极少(如只有0/1) | 每个样本都不同(如ID) | 检查是否为噪声;分箱或剔除 |
避坑提醒: 精算数据中,保单号、客户ID等唯一值极高的特征,即使缺失率为0,也不能直接入模,否则会导致过拟合。必须通过聚合或编码转化为有统计意义的特征。
2.3.3 分布(Distribution)
特征的分布形态影响模型假设与预处理策略。
- 正态分布: 适合线性模型,可直接使用。
- 偏态分布(长尾): 精算赔付金额典型特征。需做对数变换、Box-Cox变换或分箱。
- 双峰/多峰分布: 可能隐含子群体,需结合业务进行分群建模。
- 均匀分布: 区分能力弱,需检查是否为噪声。
2.4 特征质量评估实战代码片段
以下 Python 代码演示如何快速计算特征质量指标,适用于精算数据集的初步探索。
import pandas as pd
import numpy as np
def feature_quality_report(df):
"""
生成特征质量评估报告
参数:
df: pandas DataFrame
返回:
report: DataFrame,包含缺失率、唯一值数、数据类型
"""
report = pd.DataFrame({
'特征名': df.columns,
'数据类型': df.dtypes.values,
'缺失率': df.isnull().mean().values,
'唯一值数': df.nunique().values,
'零方差标记': df.nunique().values == 1
})
report['缺失等级'] = pd.cut(
report['缺失率'],
bins=[-0.001, 0.05, 0.30, 1.0],
labels=['低', '中', '高']
)
return report.sort_values('缺失率', ascending=False)
# 示例用法
# report = feature_quality_report(insurance_data)
# print(report[report['缺失等级'] == '高'])
精算实战要点: 在坏样本归因项目中,建议将特征质量评估作为数据流水线的第一步。每次新增特征后,重新运行质量报告,确保特征集保持健康。重点关注“高缺失 + 高唯一值”的组合特征,这类特征往往是噪声或数据录入错误的产物。