没有名为“statsmodels.genmod.penalties”的模块[已关闭]

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

我已经在 Jupyter Notebook 中安装了

statsmodels
库。 现在,当我尝试执行我的代码时,它说没有名为
statsmodels.genmod.penalties
的模块。

我认为我以错误的方式导入

L1
惩罚。但我也无法正确实施。

下面是我正在努力解决的代码,

import statsmodels.api as sm
from statsmodels.genmod.families import links 
from statsmodels.genmod.generalized_linear_model import GLM 
from statsmodels.genmod.cov_struct import CovStruct 
from statsmodels.genmod.families.family import Binomial, NegativeBinomial, Gamma, Gaussian, InverseGaussian, Poisson, Tweedie 
from statsmodels.genmod.families.varfuncs import Binomial as Binomial_VarFunc 
from statsmodels.genmod.families.links import Logit 
from statsmodels.genmod.generalized_linear_model import *
from statsmodels.genmod.penalties import L1

import numpy as np

np.random.seed(123)

n = np.random.randint(0,2000)

#sample size
p = 20

#no. of variables
sigma = np.full((p,p), 0.5)

# True covariance matrix
np.fill_diagonal(sigma, 1)

X = np.random.multivariate_normal(mean = np.zeros(p), cov = sigma, size = n)

# generate mutlivariate normal data
y = (np.random.rand(n) < 0.5).astype(int)

X = sm.add_constant(X)

penalty = sm.penalties.L1(alpha = 0.1) # use L1 penalty with alpha parameter

输出:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[21], line 23
     19 y = (np.random.rand(n) < 0.5).astype(int)
     21 X = sm.add_constant(X)
---> 23 penalty = sm.penalties.L1(alpha = 0.1) # use L1 penalty with alpha parameter
     25 model = sm.GLM(y, X, family = sm.families.Binomial(link = sm.families.links.logit), penalized = True, penalty = penalty)
     27 result = model.fit()
AttributeError: module 'statsmodels.api' has no attribute 'penalties'

如果我从

sm
中删除
sm.penalties.L1
那么我会收到此错误。

NameError                                 Traceback (most recent call last)
Cell In[22], line 23
     19 y = (np.random.rand(n) < 0.5).astype(int)
     21 X = sm.add_constant(X)
---> 23 penalty = penalties.L1(alpha = 0.1) # use L1 penalty with alpha parameter
     25 model = sm.GLM(y, X, family = sm.families.Binomial(link = sm.families.links.logit), penalized = True, penalty = penalty)
     27 result = model.fit()
NameError: name 'penalties' is not defined
python statsmodels
1个回答
0
投票

看起来您导入 L1 惩罚模块的方式存在一个小问题。正确的导入方式是从

statsmodels.base
而不是
statsmodels.api
。这是更正后的导入语句:

from statsmodels.base import penalties

您的代码应该或多或少如下所示。这应该可以解决导入问题并允许您在代码中使用 L1 惩罚。

import statsmodels.api as sm
from statsmodels.genmod.families import links 
from statsmodels.genmod.generalized_linear_model import GLM 
from statsmodels.genmod.cov_struct import CovStruct 
from statsmodels.genmod.families.family import Binomial, NegativeBinomial, Gamma, Gaussian, InverseGaussian, Poisson, Tweedie 
from statsmodels.genmod.families.varfuncs import Binomial as Binomial_VarFunc 
from statsmodels.genmod.families.links import Logit 
from statsmodels.genmod.generalized_linear_model import *
from statsmodels.base import penalties  # Corrected import

import numpy as np

np.random.seed(123)

n = np.random.randint(0, 2000)

# sample size
p = 20

# no. of variables
sigma = np.full((p, p), 0.5)

# True covariance matrix
np.fill_diagonal(sigma, 1)

X = np.random.multivariate_normal(mean=np.zeros(p), cov=sigma, size=n)

# generate multivariate normal data
y = (np.random.rand(n) < 0.5).astype(int)

X = sm.add_constant(X)

penalty = penalties.L1(alpha=0.1)  # use L1 penalty with alpha parameter
model = sm.GLM(y, X, family=sm.families.Binomial(link=sm.families.links.logit), penalized=True, penalty=penalty)
result = model.fit()

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