Python 如何将statsmodels公式和参数保存为文本,以便以后进行预测?
python中的Statsmodels提供了一种很好的方法,可以使用各种R样式的公式进行线性拟合,并根据结果进行预测。进行预测所需的一切都应该包含在公式和拟合参数列表中。我只想保存这些(例如,在文本配置文件或其他脚本中,这样就不会有pickle等) 那么,只要给出原始公式和拟合参数,有没有简单的方法重建模型并进行预测 我也愿意选择Python 如何将statsmodels公式和参数保存为文本,以便以后进行预测?,python,regression,curve-fitting,statsmodels,Python,Regression,Curve Fitting,Statsmodels,python中的Statsmodels提供了一种很好的方法,可以使用各种R样式的公式进行线性拟合,并根据结果进行预测。进行预测所需的一切都应该包含在公式和拟合参数列表中。我只想保存这些(例如,在文本配置文件或其他脚本中,这样就不会有pickle等) 那么,只要给出原始公式和拟合参数,有没有简单的方法重建模型并进行预测 我也愿意选择statsmodels的替代方案 例如: 将numpy导入为np 将statsmodels.formula.api作为sm导入 作为pd进口熊猫 将matplotlib
statsmodels
的替代方案
例如:
将numpy导入为np
将statsmodels.formula.api作为sm导入
作为pd进口熊猫
将matplotlib.pyplot作为plt导入
#示例数据
x=np.mgrid[-1:1:10000j]
y=np.sin(x*5)
z=1+2*x+3*y+4*x*y+5*x**2+6*y**2+(np.random.rand(len(x))-.5)
df=pd.DataFrame(data=np.c_uux,y,z],columns=['x','y','z'])
#拟合数据
公式='z~1+x*y+I(x**2)+I(y**2)'
结果=sm.ols(公式,数据=df).fit()
打印(result.summary())
#以文本格式保存公式和参数
保存的_公式='z~'+'+'.join(result.params.index).replace('Intercept','1')#(这是必需的吗?)
已保存的参数=result.params.values
打印(保存的公式)
打印(保存的参数)
#加载公式/参数
model=result.predict#我一直在深入挖掘,它看起来像是statsmodels
使用patsy
作为函数语言,并生成数组来进行矩阵运算。因此,可以用patsy手动重新实现“预测”功能,如下所示:
# Save formula and params in text freindly way
#saved_formula = 'z ~ ' + '+'.join(result.params.index).replace('Intercept','1') # (is this necessary?)
saved_formula = formula
saved_params = result.params.to_dict()
# Load the formula/params
import patsy
def predict(data, formula) :
formula_rhs = formula.split('~')[1].strip()
x_data = patsy.dmatrix(formula_rhs, data=df)
ordered_terms = x_data.design_info.term_names
ordered_params = list(map(saved_params.get, ordered_terms))
return x_data @ ordered_params
model = lambda x : predict(x, saved_formula)
这可以简化一点,但我担心重构矩阵中的参数顺序可能与原始矩阵不同。不确定这是否真的会引起关注,但我认为我所做的并不是。我更改了要保存为字典的参数。生成新的数据矩阵,然后在我知道列的顺序后,我从保存的参数dict中提取参数
# Save formula and params in text freindly way
#saved_formula = 'z ~ ' + '+'.join(result.params.index).replace('Intercept','1') # (is this necessary?)
saved_formula = formula
saved_params = result.params.to_dict()
# Load the formula/params
import patsy
def predict(data, formula) :
formula_rhs = formula.split('~')[1].strip()
x_data = patsy.dmatrix(formula_rhs, data=df)
ordered_terms = x_data.design_info.term_names
ordered_params = list(map(saved_params.get, ordered_terms))
return x_data @ ordered_params
model = lambda x : predict(x, saved_formula)
import json
saved_params_string = json.dumps(saved_params)
json.loads(saved_params_string)