使用对数链接的Poisson GLM拟合保险数据时遇权重NaN/inf错误求助
解决Poisson GLM(对数链接)拟合时的溢出警告与ValueError
问题根源
出现RuntimeWarning: overflow encountered in exp和ValueError: NaN, inf or invalid value detected in weights的核心原因是offset参数传入了原始大数值。
对数链接的Poisson GLM中,均值计算公式为:
$\mu = \exp(\text{线性预测项} + \text{offset})$
如果直接传入原始风险暴露量(比如示例里的250、1423这类大数),$\exp(\text{offset})$会因数值过大溢出为inf,导致模型计算权重时出现无效值,最终拟合失败。
解决方案
保险索赔模型中,offset一般代表风险暴露量(如保单数、承保时长),我们需要建模的是单位暴露下的索赔发生率,因此必须将offset转换为对数形式后传入模型。此时均值公式变为:
$\mu = \exp(\text{线性预测项} + \log(\text{offset})) = \text{offset} \times \exp(\text{线性预测项})$
既符合“索赔数=暴露量×发生率”的业务逻辑,又避免了指数运算溢出。
修改后的可运行代码
import pandas as pd import statsmodels.formula.api as smf import statsmodels.api as sm import numpy as np df = pd.DataFrame({'target': [225,248,338,563,270,297,405,675,428,470,641,1069,788,866,1181,1969], 'var1': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D'], 'var2': ['X', 'Y', 'Z', 'P', 'X', 'Y', 'Z', 'P', 'X', 'Y', 'Z', 'P', 'X', 'Y', 'Z', 'P'], 'offset': [250,1423,324,5245,135,1345,13145,234,754,2352,355,675,255,245,42,234]}) # 将offset转换为对数形式传入模型 Model = smf.glm(formula='target ~ var1', offset=np.log(df['offset']), data=df, family=sm.families.Poisson(link=sm.families.links.log())) fit = Model.fit() print(fit.summary())
验证说明
运行修改后的代码,不会再出现溢出警告和ValueError。模型输出的系数对应各var1组别相对于基准组的发生率对数差值,结合对数offset,可直接推导每组的期望索赔数。
内容的提问来源于stack exchange,提问作者Simranjeet Singh
相关产品推荐
相关产品推荐

