如何坚持patsy DesignInfo?

exp*_*rer 26 python pickle python-3.x patsy

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

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

我正在尝试使用patsy,但遇到以下问题:当单个预测进入时,如何将其转换为正确的形状,使其看起来像一行训练数据?

patsy文档提供了一个示例,当训练数据中的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)
Run Code Online (Sandbox Code Playgroud)

然后是输出:

[DesignMatrix with shape (1, 3)
   Intercept  animal[T.dog]  animal[T.raccoon]
           1              0                  1
   Terms:
     'Intercept' (column 0)
     'animal' (columns 1:3)]
Run Code Online (Sandbox Code Playgroud)

请注意,此行与训练数据的形状相同; 它有一个列animal[T.dog].在我的应用程序中,我没有办法访问DesignInfo来为新数据构建DesignMatrix.具体而言,预测服务器如何知道训练数据中有多少其他类别的动物以及按什么顺序排列?

我以为我可以腌它但事实证明这还不支持:https://github.com/pydata/patsy/issues/26

我也可以简单地将矩阵列作为字符串保留并从在线重建矩阵,但这看起来有点脆弱.

有没有办法做到这一点?

Mat*_*ipp 1

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

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