2017-10-05 113 views
1

我正在尝试构建分布式按需建模生产系统,并希望将数十万个小型模型保存在内存中(并将它们传输到数据库和进程之间)。我正在看statsmodels。可以修剪statsmodels结果序列化?

我最感兴趣的只是能够保存模型的系数并在模型上调用预测。

它看起来像statsmodels包含TONS附加信息(O(原始数据大小)),这是根本不需要用于此用例。序列化的大小是几兆字节,而系数的大小只有几个字节。这充满了我的数据库,并且杀死了分布式处理和缓存性能,只需很长的时间就可以序列化和反序列化。通过在内存中保留两个数量级以上的模型,删除非系数数据可能会导致两个数量级的加速。

在statsmodels,有一般的方式:

  • 我可以请求非输出的系数数据不生成,或
  • 从对象中删除,或
  • 提取系数(这很容易)和使用它们来进行预测(这似乎不那么容易)的方法

我使用各种statsmodels模型,但主要是GLM和Logit。

我看起来并不重要。结果对象参考引用原始数据的模型对象。我无法让它适用于单个模型,但是(通过逐个删除字段)。但是,是否有适用于所有型号的通用型方法?

回答

2

Statsmodels在为此目的而添加的结果类中有一个remove_data方法。首先,大多数结果是懒散计算的,所以在调用fit之后,返回的结果实例还不包含许多结果统计信息。但是,它会提供模型和基础数据以根据需要计算这些结果统计数据。例如,调用results.summary()需要计算其中的很多或大部分。

如果我们不需要计算这些统计量,或者因为我们已经拥有了所有我们想要的或者我们只想做预测,那么我们可以删除所有大型数组和数据以减少内存需求。这通过呼叫results.remove_data()完成。

http://www.statsmodels.org/devel/generated/statsmodels.discrete.discrete_model.LogitResults.remove_data.html

https://github.com/statsmodels/statsmodels/issues/1729

注意,模型和效果类保持一个白名单什么应该被丢弃。这可能是在某些情况下,白名单不完整。 (在这种情况下,一个错误报告将不胜感激。)

一个警告,patsy的公式不能被腌制。因此,有或没有remove_data的酸洗当前需要在使用时重新创建配方,如果环境不包含所需的信息,那么这可能不起作用。如果使用patsy来转换新数据进行预测,则这是相关的。如果不使用公式,这是无关紧要的。

到问题的最后部分: 目前没有独立的预测功能。预测方法在模型内硬编码,或GLM中的链接函数。所以,目前没有办法预测没有创建模型实例。 (在最简单的情况下,例如使用刚性阵列,它甚至不需要是具有完整数据集的模型。)

+0

甜!非常感谢 – user48956

+1

我在相关问题上增加了两个段落。还有一个技巧就是存储“params”,然后用新的或人造的数据创建一个假模型,这些数据只用于简单的预测。 'model.predict(params,exog,offset)'。但是,这并不是单元测试,也不是“正式”支持。 – user333700