10

我正在尝试使用OLS 实现的predict()功能。statsmodels.formula.api当我将新数据框传递给函数以获取样本外数据集的预测值时,result.predict(newdf)返回以下错误:'DataFrame' object has no attribute 'design_info'. 这是什么意思,我该如何解决?完整的追溯是:

    p = result.predict(newdf)
  File "C:\Python27\lib\site-packages\statsmodels\base\model.py", line 878, in predict
    exog = dmatrix(self.model.data.orig_exog.design_info.builder,
  File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 2088, in __getattr__
    (type(self).__name__, name))
AttributeError: 'DataFrame' object has no attribute 'design_info'

编辑:这是一个可重现的例子。当我腌制然后取消腌制结果对象(我需要在我的实际项目中这样做)时,似乎会发生错误:

import cPickle
import pandas as pd
import numpy as np
import statsmodels.formula.api as sm

df = pd.DataFrame({"A": [10,20,30,324,2353], "B": [20, 30, 10, 1, 2332], "C": [0, -30, 120, 11, 2]})

result = sm.ols(formula="A ~ B + C", data=df).fit()
print result.summary()

test1 = result.predict(df) #works

f_myfile = open('resultobject', "wb")
cPickle.dump(result, f_myfile, 2)
f_myfile.close()
print("Result Object Saved")


f_myfile = open('resultobject', "rb")
model = cPickle.load(f_myfile)

test2 = model.predict(df) #produces error
4

1 回答 1

14

据我所知,pandas DataFrame 的酸洗和取消酸洗不会保存和恢复用户附加的属性。

由于公式信息当前与原始设计矩阵的 DataFrame 一起存储,因此在 unpickling Results 和 Model 实例后,此信息会丢失。

如果您不使用分类变量和转换,则可以使用 patsy.dmatrix 构建正确的设计矩阵。我认为以下应该有效

x = patsy.dmatrix("B + C", data=df)  # df is data for prediction
test2 = model.predict(x, transform=False)

或者直接为预测构建设计矩阵也应该有效注意,我们需要显式添加一个公式默认添加的常数。

from statsmodels.api import add_constant
test2 = model.predict(add_constant(df[["B", "C"]]), transform=False)

如果公式和设计矩阵包含(有状态)变换和分类变量,那么没有原始公式信息就无法方便地构造设计矩阵。在这种情况下,手动构建它并明确地进行所有计算是很困难的,并且失去了使用公式的所有优势。

design_info唯一真正的解决方案是独立于数据框来腌制公式信息orig_exog

于 2013-12-22T04:44:12.007 回答