如何将线性回归与泊松分布(泊松回归)关联起来?

问题描述 投票:0回答:1

我正在寻找一种将线性回归泊松分布结合起来的方法。经过简单的线性回归后,其结果是我想在泊松分布中使用的数值,因为我需要概率并且我需要概率离散来表示在给定的情况下连续且独立发生的事件的数量时间间隔.

我的情况是: 有一个自变量

Team_A__goal_scored = [1, 2, 2, 3, 1]
和一个因变量
Team_B__goal_conceded = [2, 1, 3, 0, 1]
,我想计算 A 队可以准确得分
2 goals
到 B 队的概率(因此将 A 队的进攻和 B 队的进攻联系起来)防御)。运行回归并使用
test = myfunc(2)
设置 2 个目标作为输出,我得到
1.28
:

import numpy
from scipy import stats

Team_B__goal_conceded = [1, 2, 2, 3, 1] #Var indipendent (x)
Team_A__goal_scored = [2, 1, 3, 0, 1] ##Var dipendent (y)

slope, intercept, r, p, std_err = stats.linregress(Team_B__goal_conceded, Team_A__goal_scored)

def myfunc(Team_B__goal_conceded):
   return slope * Team_B__goal_conceded + intercept

regression_scored_2 = myfunc(2) #result: 1.28

问题:具体问题是我需要一个概率,而不是通过执行简单的线性回归,我获得例如

1.28
,这不是概率。

回顾一下,我知道

Team_B__goal_conceded
Team_A__goal_scored
的最初起点,我知道我想要实现什么(A队为B队精确得分
2
进球的概率),但我不知道如何我可以实现它。考虑到线性回归不适合我,因为我没有得到百分比,我认为“也许”解决方案可能是泊松回归(也称为对数线性回归)可能对我有用,但是我在使用它时遇到了麻烦。我不确定这是否是我正在寻找的解决方案,因此我正在寻找知道如何使用它并告诉我它是否对我想要实现的目标有用以及谁告诉我如何使用的人使用它。如果情况并非如此,那么肯定还有其他方法可以在泊松分布中使用线性回归的结果。

期望:我想要得到的最终输出是运行回归后足球队进0球、1球、2球、3球等的个人概率。准确地说,我只需要恰好

2
目标,所以我想要这个最终输出:

The probability that Team A scores exactly 2 goals against Team B is: x %

我的代码: 我尝试使用 sklearn.linear_model.PoissonRegressor,但它无法正常工作。正如我上面所说,我什至不知道这是否是最适合我的情况的解决方案,或者是否有更好、更合适的方法。如果情况并非如此,那么肯定还有其他方法可以在泊松分布中使用线性回归的结果。

from sklearn import linear_model
clf = linear_model.PoissonRegressor()
Team_A__goal_scored = [1, 2, 2, 3, 1] #Var indipendent (x)
Team_B__goal_conceded = [2, 1, 3, 0, 1] #Var dipendent (y)

a=clf.fit(Team_A__goal_scored, Team_B__goal_conceded)
print("Fit a Generalized Linear Model: ", a, "\n")

b = clf.score(Team_A__goal_scored, Team_B__goal_conceded)
print("Compute D^2, the percentage of deviance explained: ", b, "\n")

c = clf.coef_
print("Estimated coefficients for the linear predictor: ", c, "\n")

d= clf.intercept_
print("Intercept (a.k.a. bias) added to linear predictor: ", d, "\n")

e=clf.predict([[1, 1], [3, 4]])
print("Predict using GLM with feature matrix X: ", e, "\n")

我收到此错误:

ValueError: Expected 2D array, got 1D array instead:
array=[1. 2. 2. 3. 1.].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

因为列表应该像(如scikit-learn链接所示)例如:

X = [[1, 2], [2, 3], [3, 4], [4, 3]] and y = [12, 17, 22, 21]
,但我不明白如何以这种方式使用我的列表。

我也不知道如何设置结果必须恰好是

2
进球(A队对B队进2球的概率)

谢谢你

python python-3.x scikit-learn scipy statistics
1个回答
0
投票

您使用

PoissonRegressor
的方法看起来不错,但它需要一个 2D 数组来表示特征 (
X
)。您可以使用
numpy.reshape
:

重塑一维数组
import numpy as np
from sklearn.linear_model import PoissonRegressor

Team_A__goal_scored = np.array([1, 2, 2, 3, 1]).reshape(-1, 1)
Team_B__goal_conceded = np.array([2, 1, 3, 0, 1])

然后就可以拟合模型了:

clf = PoissonRegressor()
clf.fit(Team_A__goal_scored, Team_B__goal_conceded)

然后你就可以做出预测(例如

Team_A__goal_scored = 2
):

lambda_pred = clf.predict(np.array([[2]]))[0]

然后您可以使用泊松概率质量函数求出正好进 2 个球的概率:

from scipy.stats import poisson

probability_two_goals = poisson.pmf(2, lambda_pred)

这给出了 A 队对阵 B 队正好进 2 个球的概率。

© www.soinside.com 2019 - 2024. All rights reserved.