我已经在 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
看起来您导入 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()