Python中的零膨胀泊松模型

3

我想使用python3构建一个零膨胀泊松模型,我在statsmodel库中发现了statsmodels.discrete.count_model.ZeroInflatePoisson函数。
但是我不确定如何使用它。看起来我应该这样做:
ZIFP(Y_train,X_train).fit()
但是当我想使用X_test进行预测时,它告诉我X_test的长度与X_train不匹配。 或者是否有其他包适用于拟合这个模型? 这是我使用的代码:

X1 = [random.randint(0,1) for i in range(200)]
X2 = [random.randint(1,2) for i in range(200)]
y = np.random.poisson(lam = 2,size = 100).tolist()
for i in range(100):y.append(0)
df['x1'] = x1
df['x2'] = x2
df['y'] = y
df_x = df.iloc[:,:-1]
x_train,x_test,y_train,y_test = train_test_split(df_x,df['y'],test_size = 0.3)
clf = ZeroInflatedPoisson(endog = y_train,exog = x_train).fit()
clf.predict(x_test)

ValueError:operands could not be broadcat together with shapes (140,)(60,)

也尝试过:

clf.predict(x_test,exog = np.ones(len(x_test)))

ValueError: shapes(60,) and (1,) not aligned: 60 (dim 0) != 1 (dim 0)

展示你尝试过的实际代码。模型名称为ZeroInflatedPoissonfitpredict的使用方式与statsmodels中的其他模型相同,只是增加了用于零膨胀部分的选项。 - undefined
train_x, test_x, train_y, test_y = train_test_split(data_x, data['y'], test_size=0.3) clf = ZeroInflatedPoisson(endog=train_x, exog=train_y).fit() clf.predict(test_x) ValueError: 无法将形状为(140,)和(60,)的操作数进行广播 - undefined
2个回答

3
这看起来像是一个bug。
据我所见:
如果在通胀模型中没有指定解释变量exog_infl,则使用一个由1组成的数组来模拟恒定的通胀概率。然而,如果predict中的exog_infl为None,则使用model.exog_infl作为解释变量,该数组长度等于训练样本的长度。
为了解决问题,在predict中指定正确长度的一维数组即可。
请尝试:
clf.predict(test_x, exog_infl=np.ones(len(test_x))

我猜如果在模型中使用了曝光,但在预测时未明确指定,那么同样的问题也会发生。

我尝试过了。它显示出"ValueError: shapes (60,) and (1,) not aligned: 60 (dim 0) != (dim 0)"。如果我在训练中对exog_infl数组进行对齐,那么每次进行预测时都需要更改吗? - undefined
编辑你的问题并添加完整的回溯或至少显示形状不匹配的最后部分。信息丰富的回溯是Python的一个很棒的特性。 - undefined
“ZeroInflated 模型通常需要两个 exog,如果 exog_infl 为 None,则无法正确处理。因此,在 statsmodels 中修复此问题之前,需要一个变通方法和完整的规范。(ZeroInflated 是新功能,因此仍存在可用性错误,直到有足够的反馈来修复这些错误。)” - undefined
我更新了我的代码。我尝试了clf.predict(x_test,exog_infl = len(x_test))。它有效果。但是我不知道这个exog_infl是否有意义。 - undefined
为什么通常的零膨胀模型需要两个外生变量的解释? - undefined
@Mithril 零膨胀模型是由两个部分构成的模型,一个用于零膨胀,另一个用于计数。零膨胀概率可以是常数,此时 exog_infl 只是全为1,或者它可以依赖于其他解释变量。 - undefined

2

我遇到了同样的问题,导致我来到了这个帖子。正如Josef所指出的那样,似乎你需要提供一个正确长度的1-D数组给exog_infl才能工作。 然而,Josef提供的代码缺少了1-D数组部分,因此生成所需数组所需的完整行实际上是

Original Answer翻译成:"最初的回答"

clf.predict(test_x, exog_infl=np.ones((len(test_x),1))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接