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 と一緒に保存されているため、結果とモデルのインスタンスを unpickle すると、この情報は失われます。

カテゴリ変数と変換を使用しない場合は、patsy.dmatrix を使用して正しい designmatrix を構築できます。私は次のように動作するはずだと思います

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 に答える