使用Statsmodels GLM泊松回归预测Quantity各取值概率的技术疑问
解答:泊松回归中预测特定Quantity取值的概率
嘿,你的疑问抓得很准,咱们一步步理清楚这件事:
首先,你的核心理解是对的
泊松回归的本质就是给每个样本拟合出一个唯一的均值μ,这个μ由你输入的自变量(Month、cannibal_numbers、category_performance)通过回归方程计算而来,而每个样本的Quantity取k值(比如1、2、3)的概率,正是基于该样本自己的μ值计算的泊松分布概率。
具体来说,泊松模型的逻辑是:
- 先通过对数链接函数把自变量的线性组合映射为均值μ:
$$\ln(\mu) = \beta_0 + \beta_1 \times \text{Month} + \beta_2 \times \text{cannibal_numbers} + \beta_3 \times \text{category_performance}$$ - 然后用泊松分布的概率质量函数(PMF)计算每个k值的概率:
$$P(\text{Quantity}=k|\mu) = \frac{e^{-\mu} \times \mu^k}{k!}$$
所以理论上,只要两个样本的自变量取值不同,拟合出的μ就应该不同,对应的概率也会不一样。
为什么你的结果里前几行概率相同?
看你给出的结果示例,前3行的概率完全一致,这只有一种可能:这3个样本的拟合μ值是相同的。你可以先检查下series['poisson_predict']列的取值——如果这几行的μ确实一样,那概率自然相同;如果μ不同但概率相同,那可能是代码里的数组广播出了小问题。
不过你当前的代码逻辑是完全正确的:
- 用
sm.GLM拟合泊松模型,得到每个样本的预测均值(也就是μ) - 用
stats.poisson.pmf结合广播机制,给每个μ计算对应k值的概率
给你几个优化和验证的小建议
验证μ的唯一性:把自变量和拟合的μ值放在一起查看,确认不同自变量的样本是否有不同的μ:
print(series[['Month','cannibal_numbers','category_performance','poisson_predict']])如果发现自变量不同但μ相同,那可能是模型拟合的问题(比如某个自变量的系数被拟合为0),或者数据本身有异常。
让结果更清晰:可以给概率列命名,直接对应Quantity的取值,方便解读:
n = 4 # 你想要的最大Quantity值 counts = np.arange(1, n+1) predict_prob = stats.poisson.pmf(counts, np.asarray(series['poisson_predict'])[:, None]) # 给结果列命名 results = pd.DataFrame(predict_prob, columns=[f'P(Quantity={k})' for k in counts]) # 合并回原数据集 final_df = pd.concat([series, results], axis=1)检查μ的合法性:泊松分布要求μ必须为正,Statsmodels的泊松GLM通过对数链接函数保证了这一点,你可以快速验证下:
assert (series['poisson_predict'] > 0).all(), "拟合的μ出现非正值,模型有问题!"
总结
你当前的实现思路是完全正确的,每个样本的概率由其自身的拟合μ决定,不同样本(自变量不同)的概率理应不同;如果出现多个样本概率相同,优先排查这些样本的μ值是否一致即可。
内容的提问来源于stack exchange,提问作者Murcielago
相关产品推荐
相关产品推荐

