4. 暴露量与偏移项

在GLM费率约束与非线性建模中,暴露量(Exposure)与偏移项(Offset)是最容易被混用、也最容易在业务解释上出错的一对概念。很多同学在建模时把两者当成同义词,结果在系数解释、费率因子约束和预测还原环节反复踩坑。本节把这两个概念彻底拆开,并给出对数暴露量作为偏移项的标准实现方式与业务解释框架。

一、核心原理:暴露量是业务量,偏移项是模型结构

先给结论:暴露量是业务事实,偏移项是建模手段。暴露量描述的是“风险单位有多少”,例如车险中的车年数、健康险中的被保人月数、信用风险中的在贷余额、电商场景中的曝光次数。它是一个可观测、可审计的业务量,通常以正数形式出现在数据表中。

偏移项则是GLM线性预测子中的一个系数固定为1的回归项。它的作用是:在不估计额外参数的前提下,把某个已知量以对数尺度直接叠加到线性预测子上。用公式表达:

η = β₀ + β₁x₁ + ... + βₖxₖ + log(E)

其中 E 为暴露量,log(E) 即为偏移项,其系数被强制为 1。

关键区别在于:暴露量本身可以以任意形式进入模型(作为普通特征、作为权重、作为分层变量),而偏移项特指“以log(E)形式、系数锁定为1”的那一种进入方式。换句话说,暴露量是原料,偏移项是配方中的固定剂量。

一句话记忆:Exposure回答“有多少风险单位”,Offset回答“这些风险单位如何以已知比例进入线性预测子”。

二、方法流程:对数暴露量作为偏移项的实现

在Python的statsmodels或R的glm中,偏移项的实现方式略有差异,但本质一致。下面给出标准流程。

  1. 确认暴露量字段:检查E是否为正数、是否存在零值或缺失。零暴露量通常意味着该记录不应进入模型,或需要单独处理。
  2. 构造对数暴露量:新建列 log_E = log(E)。注意底数不影响系数估计,但影响截距解释,通常用自然对数。
  3. 在模型公式中声明offset:statsmodels使用offset参数,R使用offset()函数。
  4. 选择分布与链接:频率类目标常用Poisson或Gamma,链接函数常用log。
  5. 拟合后检查系数:偏移项不产生系数,需确认其他系数是在“单位暴露量”尺度上的解释。
import statsmodels.api as sm
import numpy as np

# 假设 df 包含 claim_count, log_E, age, region
X = df[['age', 'region']]
X = sm.add_constant(X)

model = sm.GLM(
    df['claim_count'],
    X,
    family=sm.families.Poisson(link=sm.families.links.log()),
    offset=df['log_E']
)
result = model.fit()
print(result.summary())

在R中对应写法为:

glm(claim_count ~ age + region + offset(log_E),
    family = poisson(link = "log"),
    data = df)

实操提示:如果误把log_E当作普通特征放入模型,模型会额外估计一个系数β_E。当β_E接近1时结果相近,但当β_E显著偏离1时,说明暴露量与目标之间的关系并非严格比例,此时应重新审视业务假设,而不是强行固定为1。

三、业务解释:偏移项如何改变系数含义

加入偏移项后,模型预测的是单位暴露量下的期望值,而非总量。以车险为例:

  • 无偏移项时,预测的是“每张保单的索赔次数”,但保单覆盖期长短不同,长保单天然更容易出险。
  • 加入log(车年数)作为偏移项后,预测的是“每车年的索赔频率”,这才是可比较的风险指标。
  • 此时年龄系数β_age解释为:年龄每增加一单位,车年索赔频率的变化倍数,而非总索赔次数的变化。

这种解释在费率约束中至关重要。费率因子通常要求“相对风险”可比较,如果暴露量未被正确偏移,因子之间会相互污染,导致某些因子被高估或低估。

对比维度暴露量作为普通特征暴露量作为偏移项
系数估计额外估计β_E系数固定为1,不估计
预测目标总量或频率,取决于设定单位暴露量下的期望值
业务解释暴露量对目标的影响强度其他因子的单位风险效应
适用场景暴露量与目标非线性相关暴露量与目标严格成比例
费率约束可能干扰因子相对性保持因子可比较性

四、案例与误区复盘

案例:某健康险团队建模住院次数,数据中包含“被保人月数”。初期未加偏移项,模型给老年组系数为1.35。加入log(被保人月数)作为偏移项后,老年组系数变为1.18。原因在于老年组平均被保月数更长,未偏移时暴露量效应被错误归因到年龄因子上。修正后,年龄因子的相对风险更符合精算预期。

常见误区一:把暴露量同时作为普通特征和偏移项,导致重复计算。
常见误区二:对暴露量取对数后忘记在预测还原时乘回E,导致预测值系统性偏小。
常见误区三:暴露量存在零值时直接取对数,产生-inf,需在数据清洗阶段处理。
常见误区四:认为偏移项系数“不可检验”,实际上可以通过对比有无偏移项的模型拟合优度来间接验证。

复盘时建议固定检查清单:暴露量是否为正、是否取自然对数、是否在预测时还原、系数解释是否已切换到单位暴露量尺度、费率因子是否仍满足单调性与可比较性。

暴露量 → 偏移项 → 线性预测子 → 业务解释 暴露量 Exposure 车年数 / 被保月数 在贷余额 / 曝光次数 业务事实,正数 对数变换 log_E = ln(E) 底数不影响系数 零值需预处理 偏移项 Offset 系数锁定为 1 不估计额外参数 η 中直接叠加 线性 预测子 η = Xβ + log_E 业务解释切换: 加入偏移项后,系数解释从“总量效应”切换为“单位暴露量效应”,费率因子保持可比较性。 误区 重复放入 / 忘记还原 / 零值取对数 / 系数解释未切换 检查清单 正数校验 / 对数构造 / 预测还原 / 因子单调性

掌握暴露量与偏移项的区别,是后续非线性建模与费率约束能够正确落地的前提。在实际项目中,建议把“是否使用偏移项”作为模型评审的固定检查项,并在文档中明确记录暴露量的定义、对数变换方式以及预测还原公式,避免因概念混淆导致费率因子失真。