可以修剪statsmodels结果进行序列化吗?

时间:2017-10-05 03:14:26

标签: python statsmodels

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

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

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

在statsmodels中,有一般的方法:

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

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

我看起来并不琐碎。结果对象引用引用原始数据的模型对象。我无法使其适用于单个模型,但(通过逐个删除字段)。但是有适用于所有模型的通用方法吗?

1 个答案:

答案 0 :(得分: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中的链接功能。因此,如果不创建模型实例,目前无法预测。 (在最简单的情况下,例如只使用numpy数组,它甚至不需要是具有完整数据集的模型。)