我正在开发一个“预测模型即服务”的应用程序,其结构如下:
- 离线训练模型
- 定期将模型参数上传到“预测服务器”
- 预测服务器将单个观察作为输入,并输出预测
我正在尝试使用 patsy,但遇到了以下问题:当单个预测出现时,如何将其转换为正确的形状,使其看起来像一行训练数据?
当训练数据中的 DesignInfo 在内存中可用时,patsy 文档提供了一个示例: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
我也可以简单地将矩阵列作为字符串保存并从该在线重建矩阵,但这似乎有点脆弱。
有没有好的方法来做到这一点?