如何坚持patsy DesignInfo?
我工作的一个应用程序,它是一种“预测模型作为一种服务”,结构如下:如何坚持patsy DesignInfo?
- 火车模型离线
- 定期上传模型参数的“预测服务器“
- 预测服务器需要输入一个单一的观察,并输出预测
我试图使用懦夫,但是遇到了以下问题:当一个预测进来,我怎么转换它正确的形状,使它看起来像是一排训练数据?
的帕齐文档提供了一个例子,当从训练数据的DesignInfo可用存储:http://patsy.readthedocs.io/en/latest/library-developers.html#predictions
# offline model training
import patsy
data = {'animal': ['cat','cat','dog','raccoon'],'cuteness': [3,6,10,4]}
eq_string = "cuteness ~ animal"
dmats = patsy.dmatrices(eq_string,data)
design_info = dmats[1].design_info
train_model(dmats)
# online predictions
input_data = {'animal': ['raccoon']}
# if the DesignInfo were available, I could do this:
new_dmat = build_design_matrices([design_info],
input_data)
make_prediction(new_dmat, trained_model)
然后输出:
[DesignMatrix with shape (1, 3)
Intercept animal[T.dog] animal[T.raccoon]
1 0 1
Terms:
'Intercept' (column 0)
'animal' (columns 1:3)]
注意,这行是相同的形状作为训练数据;它有一列animal[T.dog]
。在我的应用程序中,我没有办法访问DesignInfo来为新数据构建DesignMatrix。具体而言,预测服务器如何知道训练数据中有多少其他类别的动物以及以何种顺序?
我想我可能只是咸菜,但事实证明这是不支持尚未:https://github.com/pydata/patsy/issues/26
我也可以简单地保持矩阵列作为一个字符串,并重建从网上矩阵,但是这似乎是一个有点脆弱。
有没有很好的方法来做到这一点?
假设你的目标是能够重新启动无需重新参加培训的服务器,它看起来像你的最佳选择(直到帕齐实现酸洗)将腌制data
,eq_string
和任何参数由train_model
计算。然后在重新启动服务器后,您可以取下data
和eq_string
,然后再拨打dmats = patsy.dmatrices(eq_string,data)
。这应该运行得非常快,因为它不是真的在训练模型,只是预处理数据。然后,您还可以取消train_model
(未在问题中显示)计算的参数,并且服务器应准备好对新输入进行预测。
请注意,如果您将此分解为客户端和服务器组件,则服务器应完成上述讨论的所有内容,客户端应将其发送给您的问题中定义的input_data
。 (客户不需要看到dmats
或design_info
。)
您能否在服务器中保留'design_info'? (看起来好像会自动发生。)然后,客户端只需向服务器发送新的'input_data',服务器就会运行'new_dmat'和'make_prediction'行。或者您是否需要关闭并重新启动服务器而不进行再培训?在这种情况下,听起来你需要保存原始的'dmats'和'train_model()'找到的参数。那是你在找什么? –