3. 数据探索与理解
在保险理赔Severity(损失金额)预测项目中,数据探索与理解是决定后续建模上限的关键环节。很多团队急于套用XGBoost或LightGBM,却忽略了字段语义、目标分布和脏数据形态,最终模型离线指标尚可、上线后赔付预测偏差巨大。本节围绕三件事展开:字段解析、目标变量分布诊断、缺失值与异常值初步识别,并给出可直接复用的探索流程与代码骨架。
一、核心原理:为什么Severity预测必须先做分布与字段体检
理赔Severity通常指单次事故的赔付金额,具有三个典型统计特征:右偏重尾、零膨胀或低值聚集、多峰混合。右偏意味着少数大额理赔主导了均值,若直接以MSE训练,模型会被极端值牵引;零膨胀意味着大量小额或零赔付案件与真正的大额案件混在一起,需要区分“是否赔付”与“赔多少”两个子问题。字段解析则决定了特征工程的方向:哪些字段是事故发生时可知的(如车型、地区、天气),哪些是事后才产生的(如定损金额、维修工时),后者若误入特征会造成标签泄漏。
二、方法流程:从字段清单到分布诊断的四步法
- 字段分类:按业务含义将字段分为保单信息、车辆信息、事故信息、人员信息、理赔流程信息五类,并标注每个字段的“事故时可知/事后可知”。
- 目标变量统计:计算均值、中位数、分位数、偏度、峰度,绘制直方图与对数直方图,判断是否需要log变换。
- 缺失值画像:统计缺失率、缺失模式(随机缺失/系统性缺失),区分“业务上不存在”与“数据未采集”。
- 异常值初筛:用IQR、分位数截断、业务规则三重方式识别异常,但暂不删除,先标记待复核。
下面是一段可直接运行的探索代码骨架,覆盖字段类型统计、目标分布与缺失值概览:
import pandas as pd
import numpy as np
df = pd.read_csv("claims_severity.csv")
# 1. 字段类型与缺失概览
field_profile = pd.DataFrame({
"dtype": df.dtypes,
"missing_rate": df.isna().mean().round(4),
"n_unique": df.nunique()
})
print(field_profile.sort_values("missing_rate", ascending=False).head(20))
# 2. 目标变量分布诊断
target = df["severity_amount"]
print("mean=%.2f median=%.2f skew=%.2f kurt=%.2f" % (
target.mean(), target.median(), target.skew(), target.kurt()))
print(target.quantile([0.5, 0.9, 0.95, 0.99, 0.999]))
# 3. 对数变换后的分布对比
log_target = np.log1p(target)
print("log skew=%.2f" % log_target.skew())
# 4. 缺失模式:按事故类型分组看缺失率
print(df.groupby("accident_type")["repair_hours"].apply(
lambda s: s.isna().mean()).round(3))
三、可视化:理赔数据探索的关键对象关系
下图把本节最值得看清的对象放在同一张图中:左侧是字段按“事故时可知/事后可知”的划分,中间是目标变量的右偏分布与log变换后的近似对称分布对比,右侧是缺失值与异常值的初步识别路径。它帮助你在动手建模前建立一张“数据体检地图”。
四、案例/场景:一次车险Severity探索的真实复盘
某车险团队拿到12万条理赔记录,初始字段48个。第一轮探索发现:severity_amount均值8600元、中位数3200元、偏度4.7,P99达到68000元。直接训练MSE模型后,验证集MAE为4100元,但大额案件预测普遍偏低30%以上。复盘发现三个问题:其一,repair_hours缺失率42%,且缺失集中在“快速理赔”通道,属于系统性缺失,简单均值填充引入了偏差;其二,total_loss_flag(全损标志)与severity高度相关,但该字段在事故报案时不可知,属于事后字段,误入特征导致离线AUC虚高;其三,存在severity为负数的记录17条,经查为冲正数据,需单独处理而非当作异常删除。
调整后,团队采用log1p变换目标、将缺失率高于30%的事后字段移出特征集、对负数记录标记为“冲正”并单独建模,验证集MAE降至2900元,大额案件预测偏差收敛到12%以内。
五、误区与复盘:数据探索阶段最常见的五个坑
| 误区 | 表现 | 后果 | 纠正方式 |
|---|---|---|---|
| 只看均值不看分位数 | 均值被大额理赔拉高 | 模型对小额案件高估 | 同时输出P50/P90/P99 |
| 事后字段入特征 | 定损金额、维修工时参与训练 | 标签泄漏,上线失效 | 建立字段可用性清单 |
| 缺失值一律均值填充 | 系统性缺失被掩盖 | 引入偏差,低估风险 | 按业务分组看缺失模式 |
| 异常值直接删除 | 负数、极大值被丢弃 | 丢失冲正、全损等真实业务 | 先标记,业务复核后再处理 |
| 忽略零膨胀 | 零赔付与小额赔付混在一起 | 分布多峰,模型难以拟合 | 拆分“是否赔付”与“赔多少” |
完成本节的数据探索后,你应当能够回答三个问题:目标变量是否需要变换、哪些字段可以合法入模、缺失与异常应如何标记而非粗暴处理。这三个答案,将直接决定第4章特征工程的方向与第5章模型选择的损失函数设计。