python实现泊松回归

news2024/11/25 2:05:39

1 什么是基于计数的数据?

基于计数的数据包含以特定速率发生的事件发生率可能会随着时间的推移或从一次观察到下一次观察而发生变化。以下是基于计数的数据的一些示例:

  • 每小时穿过十字路口的车辆数量
  • 每月去看医生的人数
  • 每月发现的类地行星数量

计数数据集具有以下特征:

  • 整数数据:数据由非负整数组成:[0… ∞] 。普通最小二乘回归等回归技术可能不适合对此类数据进行建模,因为 OLSR 最适合实数,例如 -656.0、-0.00000345、13786.1 ETC。
  • 偏斜分布:数据可能包含少量值的大量数据点,从而使频率分布相当偏斜。请、参见上面的直方图示例。
  • 稀疏性:数据可能反映了伽马射线爆发等罕见事件的发生,从而使数据变得稀疏。
  • 发生率:为了创建模型,可以假设事件 λ 有一定的发生率来驱动此类数据的生成。事件发生率可能会随着时间的推移而发生变化。

下表包含在纽约市各桥梁上骑行的骑自行车者的计数。从2017年4月1日到2017年10月31日,每天都会测量计数。

以下是布鲁克林大桥上骑自行车的人计数的时间顺序图:

2 计数回归模型

泊松回归模型负二项式回归模型是开发计数回归模型的两种流行技术。其他可能包括有序 Logit、有序 Probit 和非线性最小二乘模型

最好从泊松回归模型开始,并将其用作更复杂或约束较少的模型的“控制”。卡梅伦和特里维迪在他们的**《计数数据回归分析》**一书中说道:

“一个合理的做法是估计泊松模型和负二项式模型。”

在本节中,将使用泊松回归模型对布鲁克林大桥上观察到的骑自行车者计数进行回归。

3 泊松模型简介

泊松分布具有以下概率质量函数。

泊松分布的期望值(平均值)是 λ。因此,在缺乏其他信息的情况下,人们应该期望在任何单位时间间隔(例如 1 小时、1 天等)内看到 λ 事件。对于任何时间间隔 t,人们都期望看到 λt 事件。

  1. 常数 λ 的泊松回归模型

如果事件发生率 λ 是恒定的,则可以简单地使用修改的平均模型来预测未来的事件计数。在这种情况下,可以将所有计数的预测值设置为该恒定值 λ

下图说明了常数 λ 的场景:

  1. 非常数 λ 的泊松回归模型

检查一种更常见的情况,其中 λ 可以从一个观察值更改为下一个观察值。在这种情况下,假设 λ 的值受到解释变量向量(也称为预测变量、回归变量或回归变量)的影响,将这个回归变量矩阵称为 X

回归模型的作用是将观察到的计数 y 拟合到回归值矩阵 X 。

在纽约市骑自行车者计数数据集中,回归变量为日期、星期几、高温、低温和降水量。还可以引入额外的回归量,例如从日期派生的月份和日期,并且可以自由地删除现有的回归量,例如日期:

y 与 X 的拟合是通过固定回归系数 β 向量的值来实现的。

在泊松回归模型中,事件计数 y 被假定为泊松分布,这意味着观察 y 的概率是事件率向量 λ 的函数

泊松回归模型的工作是通过链接函数将观测计数 y 拟合到回归矩阵 X,该链接函数将速率向量 λ 表示为回归系数 β 和 回归矩阵 X 的函数

下图说明了泊松回归模型的结构。

将 λ 与 X 连接起来的良好链接函数 f(.) 是什么?事实证明,以下指数链接函数效果很好:

即使当回归量 X 或回归系数 β 具有负值时,该链接函数也使** λ 保持非负值**。这是基于计数的数据的要求。

一般来说,有:

4 泊松回归模型的形式化说明

基于计数的数据的泊松回归模型的完整规范如下:

对于数据集中由 y_i 表示的与回归变量 x_i 行对应的第 i 个观测值,观测计数 y_i 的概率是按照以下 PMF 的泊松分布:

其中第 i 个样本的平均速率 λ_i 由前面所示的指数链接函数给出。在这里重现它:

一旦模型在数据集上得到充分训练,回归系数 β 就已知,模型就可以进行预测了。为了预测与观察到的回归量 x_p 输入行相对应的事件计数 y_p,可以使用以下公式:

所有这些都取决于成功训练模型的能力,以便已知回归系数向量 β。

接下来看看这个训练是如何进行的。

5 训练泊松回归模型

训练泊松回归模型涉及查找回归系数 β 的值,这将使观察到的计数 y 的向量最有可能。

识别系数 β 的技术称为最大似然估计 (MLE)。

使用骑自行车者计数数据集来说明 MLE 技术。看一下该数据集的前几行:

假设红框中显示的骑自行车者计数来自泊松过程。因此可以说它们发生的概率是由泊松 PMF 给出的。以下是前 4 次出现的概率:

可以类似地计算训练集中观察到的所有 n 个计数的概率。

注意,在上面的公式中,λ_1,λ_2,λ_3,…,λ_n是使用link函数计算的,如下所示:

其中 x_1、x_2、x_3、x_4 是回归矩阵的前 4 行。

训练集中 n 个计数 y_1, y_2,…,y_n 的整个集合出现的概率是各个计数出现的联合概率

计数 y 服从泊松分布,y_1, y_2,…,y_n 是独立的随机变量,相应地给出 x_1, x_2,…,x_n。因此,y_1、y_2、…、y_n 出现的联合概率可以表示为各个概率的简单乘法。以下是整个训练集的联合概率:

让我们回想一下,λ_1、λ_2、λ_3、…、λ_n 通过回归系数 β 链接到回归向量 x_1、x_2、x_3、…、x_n。

β 的什么值将使给定的观察计数 y 集最有可能出现?它是上式中所示的联合概率达到最大值时的β值。它是 β 的值,其中联合概率函数的对β的变化率为 0。换句话说,它是通过对联合概率方程对 β 进行微分而得到的方程的解并将该微分方程设置为 0。

联合概率方程的对数微分比原方程更容易。对数方程的解产生相同的 β 最优值。

这个对数方程称为对数似然函数。对于泊松回归,对数似然函数由以下等式给出:

上式是将前面所示的联合概率函数两边取自然对数,并将 λ_i 替换为 exp(x_i*β) 后得到的。

如前所述,对数似然方程对 β 进行微分,并将其设置为零。这个运算提供了以下等式:

求解回归系数 β 的方程将得到 β 的最大似然估计 (MLE)。

为了求解上述方程,使用迭代方法,例如迭代重加权最小二乘法 (IRLS)。

6 执行泊松回归的步骤摘要

总之,以下是对基于计数的数据集执行泊松回归的步骤:

  • 首先,确保数据集包含计数。一种判断方法是它仅包含非负整数值,表示某个时间间隔内某个事件发生的次数。在骑自行车者计数数据集中,它是每天穿过布鲁克林大桥的骑自行车者的数量。
  • 找出(或猜测)会影响观察到的计数的回归变量。在骑自行车者计数数据集中,回归变量包括星期几、最低气温、最高气温、降水量等。
  • 制定回归模型将用于训练的训练数据集,以及应保留的测试数据集。不要根据测试数据训练模型。
  • 使用合适的统计软件(例如 Pythonstatsmodels 包)在训练数据集上配置和拟合泊松回归模型。
  • 通过在测试数据集上运行模型来测试模型的性能,以生成预测计数。将它们与测试数据集中的实际计数进行比较。
  • 使用拟合优度度量来确定模型在训练数据集上的训练效果。

7 如何在 Python 中训练泊松回归模型

目标是为观察到的骑车人计数 y 建立泊松回归模型。将使用经过训练的模型来预测模型在训练期间未见过的布鲁克林大桥上每日骑自行车的人数。

首先导入所有必需的包。

import pandas as pd
from patsy import dmatrices
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt

为计数数据集创建一个 pandas DataFrame。

df = pd.read_csv('nyc_bb_bicyclist_counts.csv', header=0, infer_datetime_format=True, parse_dates=[0], index_col=[0])

我们将向 X 矩阵添加一些导出的回归变量。

ds = df.index.to_series()
df['MONTH'] = ds.dt.month
df['DAY_OF_WEEK'] = ds.dt.dayofweek
df['DAY'] = ds.dt.day

我们不会使用 Date 变量作为回归量,因为它包含绝对日期值,但我们不需要做任何特殊的事情来删除 Date,因为它已经被用作 pandas DataFrame 的索引。所以它在 X 矩阵中对我们来说是不可用的。

让我们创建训练和测试数据集。

mask = np.random.rand(len(df)) < 0.8
df_train = df[mask]
df_test = df[~mask]
print('Training data set length='+str(len(df_train)))
print('Testing data set length='+str(len(df_test)))

以 Patsy 表示法设置回归表达式。BB_COUNT 是因变量,它取决于回归变量:DAY、DAY_OF_WEEK、MONTH、HIGH_T、LOW_T 和 PRECIP。

expr = “”“BB_COUNT ~ DAY + DAY_OF_WEEK + MONTH + HIGH_T + LOW_T + PRECIP”“”

为训练和测试数据集设置 X 和 y 矩阵。 Patsy 让这一切变得非常简单。

y_train, X_train = dmatrices(expr, df_train, return_type='dataframe')
y_test, X_test = dmatrices(expr, df_test, return_type='dataframe')

使用 statsmodels GLM 类,在训练数据集上训练泊松回归模型。

poisson_training_results = sm.GLM(y_train, X_train, family=sm.families.Poisson()).fit()

打印总结。

print(poisson_training_results.summary())

这会打印出以下内容:

那么模型表现如何?对测试数据集做一些预测。

poisson_predictions = poisson_training_results.get_prediction(X_test)
#summary_frame() returns a pandas DataFrame
predictions_summary_frame = poisson_predictions.summary_frame()
print(predictions_summary_frame)

以下是输出的前几行:

绘制测试数据的预测计数与实际计数。

predicted_counts=predictions_summary_frame['mean']
actual_counts = y_test['BB_COUNT']
fig = plt.figure()
fig.suptitle('Predicted versus actual bicyclist counts on the Brooklyn bridge')
predicted, = plt.plot(X_test.index, predicted_counts, 'go-', label='Predicted counts')
actual, = plt.plot(X_test.index, actual_counts, 'ro-', label='Actual counts')
plt.legend(handles=[predicted, actual])
plt.show()

这是输出:

该模型似乎或多或少地跟踪了实际计数的趋势,尽管在许多情况下其预测与实际值相差甚远。

绘制实际计数与预测计数的关系图。

plt.clf()
fig = plt.figure()
fig.suptitle('Scatter plot of Actual versus Predicted counts')
plt.scatter(x=predicted_counts, y=actual_counts, marker='.')
plt.xlabel('Predicted counts')
plt.ylabel('Actual counts')
plt.show()

8 泊松回归模型的拟合优度

泊松分布的期望值(即均值)和方差均为 λ。大多数现实世界的数据都违反了这个相当严格的条件。

泊松回归模型失败的一个常见原因是数据不满足泊松分布规定的均值 = 方差标准。

statsmodels GLMResults 类上的 summary() 方法显示了一些有用的拟合优度统计数据,可帮助评估泊松回归模型是否能够成功拟合训练数据。

报告的偏差和皮尔逊卡方值非常大。考虑到这些值,几乎不可能实现良好的拟合。为了在某​​个置信水平(例如 95% (p=0.05))下定量确定拟合优度,在 χ2 表中查找 p=0.05 和残差自由度=163 的值。 (DF 残差 = 观察次数减去 DF 模型])。

将此卡方值与观察到的统计数据进行比较,在本例中为 GLMResults 中报告的偏差或皮尔逊卡方值。在 p=0.05 且 DF 残差 = 163 时,标准卡方表中的卡方值为 193.791,远小于报告的统计数据 23030 和 23300。

因此,根据此测试,泊松回归模型尽管展示了对测试数据集的“良好”视觉拟合,但与训练数据的拟合却相当差。

参考:
https://timeseriesreasoning.com/contents/poisson-regression-model/
https://omarfsosa.github.io/poisson_regression_in_python
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.PoissonRegressor.html
https://mengte.online/archives/12747

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1561718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ Tutorial

参考API : Overview (RabbitMQ Java Client 5.20.0 API) 参考文档: RabbitMQ: One broker to queue them all | RabbitMQ 目录 结构 Hello World consumer producer 创建连接API解析 创建连接工厂 生产者生产消息 消费者消费消息 队列声明 工作队列Work Queues 公平…

1033 To Fill or Not to Fill

是否有能到达的站点 无&#xff0c;输出当前距离&#xff08;最后一个到达站点距离满油箱状态下行走距离&#xff09;有 有价格更低的站点 如果油量不足以到达新站点&#xff0c;加刚好到达该站点的油量&#xff08;只加可到达范围内最便宜的油&#xff09;有价格更高的站点 在…

【带你了解下前端开发语言有那些】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

[flink 实时流基础] 输出算子(Sink)

学习笔记 Flink作为数据处理框架&#xff0c;最终还是要把计算处理的结果写入外部存储&#xff0c;为外部应用提供支持。 文章目录 **连接到外部系统****输出到文件**输出到 Kafka输出到 mysql自定义 sink 连接到外部系统 Flink的DataStream API专门提供了向外部写入数据的方…

8_springboot_shiro_jwt_多端认证鉴权_多Reaml管理

1. 目标 前面一直讨论的是只有一个Reaml的场景&#xff0c;Shiro是可以管理多个Realm的。那么什么场景下&#xff0c;我们需要定义多个Realm&#xff0c;以及Shiro框架是如何管理多个Realm的&#xff0c;他们是如何工作的。本章将会解释上面的问题&#xff0c;最后会配置前面章…

MySQL中MHA故障排查

文章目录 MySQL故障排查MySQL主从环境常见故障1、故障一1.1 故障现象1.2 报错原因1.3 解决方法 2、故障二2.1 故障现象2.2 报错原因2.3 解决方法 3、故障三3.1 故障现象3.2 报错原因3.3 解决方法 4、故障四4.1 故障现象4.2 问题分析4.3 解决方法 5、故障五5.1 故障现象5.2 报错…

neo4j使用详解(六、cypher即时时间函数语法——最全参考)

Neo4j系列导航&#xff1a; neo4j及简单实践 cypher语法基础 cypher插入语法 cypher插入语法 cypher查询语法 cypher通用语法 cypher函数语法 6.时间函数-即时类型 表示具体的时刻的时间类型函数 6.1.date函数 年-月-日时间函数&#xff1a; yyyy-mm-dd 6.1.1.获取date da…

深度学习500问——Chapter05: 卷积神经网络(CNN)(3)

文章目录 5.14 理解转置卷积与棋盘效应 5.14.1 标准卷积 5.14.2 转置卷积 5.15 卷积神经网络的参数设置 5.16 提高卷积神经网络的泛化能力 5.17 卷积神经网络在不同领域的应用 5.17 .1 联系 5.17.2 区别 5.14 理解转置卷积与棋盘效应 5.14.1 标准卷积 在理解转置卷积之前&…

从学习海底捞到学习巴奴,中国餐饮带洋快餐重归“产品主义”

俗话说“民以食为天”&#xff0c;吃饭一向是国人的头等大事&#xff0c;餐饮业也是经济的强劲助推力。新世纪以来&#xff0c;餐饮业不断讲述着热辣滚烫的商业故事。 2006年&#xff0c;拥有“必胜客”、“肯德基”等品牌的餐饮巨头百胜集团&#xff0c;组织两百多名区域经理…

代码随想录算法训练营第24天|理论基础 |77. 组合

理论基础 jia其实在讲解二叉树的时候&#xff0c;就给大家介绍过回溯&#xff0c;这次正式开启回溯算法&#xff0c;大家可以先看视频&#xff0c;对回溯算法有一个整体的了解。 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法&#xff08;理…

Windows安装禅道系统结合Cpolar实现公网访问内网BUG管理服务

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

竞技之道-打造成功竞技游戏的实战指南【文末送书】

文章目录 理解竞技游戏的本质游戏力&#xff1a;竞技游戏设计实战教程【文末送书】 在当今数字化时代&#xff0c;游戏已经不再是一种单纯的娱乐方式&#xff0c;而是成为了一门具有巨大商业潜力的产业。特别是竞技游戏&#xff0c;它们引领着全球数十亿玩家的潮流&#xff0c;…

引用,内联函数,auto函数,指针nullptr

一&#xff1a;引用 1.1 该文章的引用是对上一篇引用的进行补充和完善 按理来说&#xff0c;double可以隐式转换为int&#xff0c;那起别名的时候为什么不可以类型转换呢&#xff1f; 那是因为&#xff0c;在类型转换的时候&#xff0c;会创建一个临时变量&#xff0c;让后再…

基于kalman的单目标追踪,以及demo测试(Python and C++)

一.卡尔曼滤波简单介绍 我们可以在任何含有不确定信息的动态系统中的使用卡尔曼滤波&#xff0c;对系统的下一步动作做出有根据的猜测。猜测的依据是预测值和观测值&#xff0c;首先我们认为预测值和观测值都符合高斯分布且包含误差&#xff0c;然后我们预设预测值的误差Q和观测…

OMNet项目1 —— Linux环境配置

项目环境搭建&#xff0c;软件版本Ubuntu16&#xff0c;OMNet5.0 Linux配置环境步骤 安装VMWare虚拟机16.25&#xff08;个人号养老版本&#xff09;下载ISO镜像文件Ubuntu16 链接&#xff1a;https://pan.baidu.com/s/1SETyn6t4qIUfli1uRRgm3w?pwdf4ua 提取码&#xff1a;f…

软件设计师25--逻辑结构设计

软件设计师25--逻辑结构设计 考点1&#xff1a;关系模式相关概念数据模型关系模型相关概念完整性约束 考点2&#xff1a;E-R图转换关系模式逻辑结构设计 - E-R模型转关系模式E - R图转关系模式 考点1&#xff1a;关系模式相关概念 数据模型 层次模型网状模型关系模型面向对象…

第四百三十六回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"不同平台上换行的问题"相关的内容&#xff0c;本章回中将介绍如何在页面上显示蒙板层.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…

ElMessageBox.confirm中内容换行

ElMessageBox.confirm(导入结果&#xff1a;<br/>成功导入${res.successCount}条数据&#xff0c;导入失败${res.errorList.length}条数据。<br/>${str},"提示",{confirmButtonText: "确定",cancelButtonText: "取消",type: "w…

云原生应用(5)之Dockerfile精讲及新型容器镜像构建技术

一、容器与容器镜像之间的关系 说到Docker管理的容器不得不说容器镜像&#xff0c;主要因为容器镜像是容器模板&#xff0c;通过容器镜像我们才能快速创建容器。 如下图所示&#xff1a; Docker Daemon通过容器镜像创建容器。 二、容器镜像分类 操作系统类 CentOS Ubuntu 在…

38.HarmonyOS鸿蒙系统 App(ArkUI)堆叠布局结合弹性布局

层叠布局用于在屏幕上预留一块区域来显示组件中的元素&#xff0c;提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠&#xff0c;容器中的子元素&#xff08;子组件&#xff09;依次入栈&#xff0c;后一个子元素覆盖前一个子元素&#xff0c;子元素…