28

我正在开发一个“预测模型即服务”的应用程序,其结构如下:

  • 离线训练模型
  • 定期将模型参数上传到“预测服务器”
  • 预测服务器将单个观察作为输入,并输出预测

我正在尝试使用 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

我也可以简单地将矩阵列作为字符串保存并从该在线重建矩阵,但这似乎有点脆弱。

有没有好的方法来做到这一点?

4

1 回答 1

1

假设您的目标是能够在不重新训练的情况下重新启动服务器,看起来您最好的选择(直到 patsy 实现酸洗)将是 pickle dataeq_string以及任何由train_model. 然后在重新启动服务器后,您可以取消腌制data并再次eq_string调用dmats = patsy.dmatrices(eq_string,data)。这应该运行得非常快,因为它并没有真正训练模型,只是预处理你的数据。然后,您还将解开由train_model(未在问题中显示)计算的参数,并且服务器应该准备好对新输入进行预测。

请注意,如果您将其拆分为客户端和服务器组件,则服务器应该执行上面讨论的所有操作,并且客户端应该只发送input_data您问题中定义的内容。(客户永远不需要看到dmatsdesign_info。)

于 2017-05-16T21:10:47.210 回答