4. 特征工程基础:特征构造、特征选择、特征缩放、哑变量编码
在保险精算建模中,原始数据通常无法直接输入模型。特征工程是将原始数据转化为最能代表预测变量与目标变量之间关系的特征集合的过程。本章将系统讲解特征构造、特征选择、特征缩放与哑变量编码四大核心模块,帮助您构建高质量的精算特征工程流水线。
4.1 特征构造:从原始数据中提炼精算信号
特征构造是指基于业务逻辑与统计变换,从现有字段中生成新特征的过程。在保险场景中,常见的构造方法包括:
| 构造方法 | 精算示例 | 说明 |
|---|---|---|
| 聚合统计 | 过去3年理赔次数的均值、最大值 | 按保单ID或客户ID分组聚合 |
| 时间窗口 | 最近6个月的保费增长率 | 滑动窗口计算趋势指标 |
| 比率特征 | 已赔付金额 / 已收保费 | 反映风险暴露与赔付的平衡 |
| 交叉特征 | 年龄组 × 车辆使用性质 | 捕捉交互效应 |
| 业务规则 | 是否属于高风险职业类别 | 基于精算手册的标签化 |
精算实践提示:特征构造应始终以业务可解释性为前提。例如,在车险定价中,“车龄×行驶里程”的交叉特征比单纯的车龄或里程更能反映车辆实际磨损风险。
4.2 特征选择:剔除噪声,保留有效信号
特征选择旨在从高维特征集中筛选出对模型预测能力贡献最大的子集,避免维度灾难与过拟合。常用的方法分为三类:
- 过滤法(Filter):基于统计指标独立评估每个特征与目标变量的相关性,如皮尔逊相关系数、卡方检验、互信息。计算效率高,但忽略特征间的交互。
- 包裹法(Wrapper):将特征子集的选择视为搜索问题,通过训练模型评估子集性能,如递归特征消除(RFE)、前向/后向选择。结果更优,但计算成本高。
- 嵌入法(Embedded):在模型训练过程中自动完成特征选择,如Lasso回归(L1正则化)、树模型的特征重要性排序。兼顾效率与效果。
精算场景推荐:对于GLM模型,优先使用Lasso回归进行特征选择;对于GBDT类模型,直接使用特征重要性排序后人工复核业务合理性。
4.3 特征缩放:统一量纲,加速收敛
特征缩放是将不同量纲的特征值映射到相近的尺度范围内。对于依赖距离计算或梯度下降的模型(如SVM、KNN、神经网络、带正则化的GLM),特征缩放至关重要。
| 缩放方法 | 公式 | 适用场景 | 精算注意事项 |
|---|---|---|---|
| 标准化 (Z-score) | \( z = \frac{x - \mu}{\sigma} \) | 数据近似正态分布,无严格边界 | 对异常值敏感,需先处理离群点 |
| Min-Max归一化 | \( x' = \frac{x - min}{max - min} \) | 特征有明确上下界,如年龄0-100 | 新数据超出范围时需重新计算 |
| 稳健缩放 (RobustScaler) | \( x' = \frac{x - median}{IQR} \) | 数据包含较多异常值 | 保险理赔金额分布常呈长尾,推荐使用 |
常见误区:对于树模型(决策树、随机森林、GBDT),特征缩放不影响分裂点选择,因此通常不需要缩放。但在精算实践中,若后续需要对比特征重要性或进行模型集成,建议仍对连续特征做标准化处理。
4.4 哑变量编码:将分类变量转化为数值
大多数精算模型要求输入为数值型。哑变量编码(One-Hot Encoding)将每个分类取值转换为独立的0/1二元特征,是处理名义变量的标准方法。
编码示例:假设“车辆使用性质”包含三个类别:家庭自用、营运、机关单位。
# 原始数据
车辆使用性质
家庭自用
营运
机关单位
家庭自用
# 哑变量编码后
家庭自用 营运 机关单位
1 0 0
0 1 0
0 0 1
1 0 0
精算编码要点:
- 对于k个类别的名义变量,生成k-1个哑变量(避免完全多重共线性),或使用正则化模型处理全部k个变量。
- 对于有序分类变量(如风险等级:低、中、高),优先使用标签编码(Label Encoding)保留顺序信息。
- 在保险数据中,若某个类别出现频率极低(如<1%),建议合并为“其他”类别后再编码。
4.5 特征工程流水线:从原始数据到建模就绪
在实际精算项目中,上述步骤需要组合成一个可复用的流水线。以下是一个典型的特征工程处理流程:
- 数据清洗:处理缺失值、异常值、重复记录。
- 特征构造:基于业务规则生成新特征(如理赔频率、保费增长率)。
- 分类变量编码:对名义变量做哑变量编码,对有序变量做标签编码。
- 特征缩放:对连续型特征进行标准化或稳健缩放。
- 特征选择:使用Lasso回归或特征重要性排序,剔除冗余特征。
- 数据集划分:将处理后的数据分为训练集、验证集、测试集,确保特征工程参数(如均值、标准差)仅从训练集学习。
精算工程化建议:使用
sklearn.pipeline.Pipeline 或 imblearn.pipeline.Pipeline 将特征工程步骤与模型训练封装在一起,避免数据泄露(Data Leakage),并方便交叉验证与线上部署。
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.linear_model import LogisticRegression
# 定义数值特征与分类特征
numeric_features = ['age', 'premium', 'claim_count']
categorical_features = ['vehicle_use', 'region']
# 构建预处理流水线
preprocessor = ColumnTransformer(
transformers=[
('num', StandardScaler(), numeric_features),
('cat', OneHotEncoder(drop='first'), categorical_features)
])
# 完整流水线
pipeline = Pipeline(steps=[
('preprocessor', preprocessor),
('classifier', LogisticRegression(penalty='l1', solver='saga'))
])