Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使statsmodels GLM.fit_约束结果可拾取/存储并可重新加载_Python_Pickle_Reload_Statsmodels_Glm - Fatal编程技术网

Python 如何使statsmodels GLM.fit_约束结果可拾取/存储并可重新加载

Python 如何使statsmodels GLM.fit_约束结果可拾取/存储并可重新加载,python,pickle,reload,statsmodels,glm,Python,Pickle,Reload,Statsmodels,Glm,带有参数约束的GLS(或OLS)回归可以很容易地使用方法运行,如下面的代码(或) 如何使由此类statsmodels GLM.fit_constrained()回归产生的GLMresults对象可拾取,以便可以存储估计结果,以便在以后的任何时候重新用于新会话中的预测 从fit_constrained()获取并包含相关估计结果的GLMresults对象有其方法,通常可以将该对象pickle到文件中 此.save()用于标准(无约束)GLM回归sm.GLM.fit()的结果。但是,它不适用于sm.g

带有参数约束的GLS(或OLS)回归可以很容易地使用方法运行,如下面的代码(或)

如何使由此类statsmodels GLM.fit_constrained()回归产生的GLMresults对象可拾取,以便可以存储估计结果,以便在以后的任何时候重新用于新会话中的预测

从fit_constrained()获取并包含相关估计结果的GLMresults对象有其方法,通常可以将该对象pickle到文件中

此.save()用于标准(无约束)GLM回归sm.GLM.fit()的结果。但是,它不适用于sm.glm.fit_unconstraint()的结果。相反,它抛出了一个pickle错误,这似乎是因为patsy DesignMatrixBuilder不可pickle,所以它链接到了从未解决的问题。这至少适用于我的Python 3.6.3(在Windows上运行)

例如:

import statsmodels
import statsmodels.api as sm
import pandas as pd

# Define exapmle data & Constraints:
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(100, 5)), columns=list('ABCDF'))
y = df['A']
X = df[['B','C','D','F']]
constraints = ['B + C + D', 'C - F'] # Add two linear constraints on parameters: B+C+D = 0 & C-F = 0
statsmodels.genmod.families.links.identity()
OLS_from_GLM = sm.GLM(y, X)

# Unconstrained regression:
result_u = OLS_from_GLM.fit()
result_u.save('myfile_u.pickle') # This works

# Constrained regression - save() fails
result_c = OLS_from_GLM.fit_constrained(constraints)
result_c.save('myfile_c.pickle') # This fails with pickling error (tested in Python 3.6.3 on Windows): "NotImplementedError: Sorry, pickling not yet supported. See https://github.com/pydata/patsy/issues/26 if you want to help."
有没有一种方法可以使fit_unconstraint()的结果易于拾取,即/或存储


下面我建议第一个解决方案答案;到目前为止,它是微不足道的,对我来说效果很好。然而,我不知道这是否真的是明智的,或者它的风险是否很大和/或是否存在任何更好的替代解决方案。

我只是通过删除(注释掉)这一行来实现这一点
res.\u results.constraints=lc
在statsmodels的active
generalized\u linear\u model.py
script中的函数定义中(在我的例子中,位于virtualenv文件夹\env\Lib\site packages\statsmodels\genmod\generalized\u linear\u model.py中)

闲置这条线似乎没有给我的工作带来任何问题;我现在可以很容易地保存和重新加载pickle文件,并使用它根据存储的估计做出正确的预测;重新加载后,所施加的参数约束将保持不变,并且使用.predict()进行的预测将保持不变


我想知道这个程序是否有任何重大风险。我不熟悉statsmodels库的内部工作,尤其是它的glm.fit_constrated()方法。我认为在一个不理解的模块中改变任何东西都是不明智的。然而,这是我能够方便地对GLM参数施加各种约束,并能够保存回归结果以便在以后的会话中随时重新使用它进行预测的唯一方法。

在我看来像个bug,我不知道patsy的约束不能被修改。我打开了@Josef:Great,我喜欢你在那里提出的修改fit_constrated以存储更原始的约束,而不是有问题的MatrixDesignBuilder元素的建议!更简单的解决方法可能是在酸洗之前将
约束设置为None,类似于
结果。\u results.constraints=None
@Josef:也许吧!但这真的更简单吗?这可能更令人困惑:如果以后我必须从存储的对象中了解是否使用了任何约束,并且我发现显式的“None”,我会认为没有约束;如果这个变量根本不存在,我当然知道不知道。或者我错了,因为.constraints成员无论如何都是对象的一部分,显式设置为None可以避免可能的错误值。。[在这种情况下,可以考虑是否应首先重新定义类/对象,使其不包含.constriants成员]从这个意义上讲,它更简单,因为您不必编辑计算机上的statsmodels源代码。如果要删除该属性,则可以在酸洗之前在results实例中对其进行
del
。您还有其他特定于
fit\u constrated
的属性,如
results.k\u constr
fit\u constrated
返回常规结果实例。当它返回受约束的结果实例时,可以将约束信息添加到摘要中。但事实并非如此。你当然是对的,“…=没有”(我以前把某件事搞混了);比更改sm源代码要好得多。如果你把它作为一个官方的答案,我想它应该是被接受的答案。另外,你建议的“del”看起来很有前途,我不知道这个功能,谢谢。