trim statsmodels 可以序列化吗?
Can trim statsmodels result for serialization?
我正在尝试构建一个分布式按需建模生产系统,并希望在内存中保留数十万个小模型(并将它们传输到数据库和进程之间)。我正在查看统计模型。
我最感兴趣的只是能够保存模型的系数并在模型上调用预测。
看起来 statsmodels 包含 TONS 的附加信息(O(原始数据大小)),而这些信息对于此用例来说根本不需要。序列化的大小是几兆字节,而系数的大小只有几个字节。这填满了我的数据库并破坏了分布式处理和缓存性能,其中大量时间仅用于序列化和反序列化。通过在内存中保留两个数量级以上的模型,删除非系数数据可能会导致两个数量级的加速。
在statsmodels中,有没有通用的方法:
- 我可以要求不生成非输出系数数据,或者
- 从对象中删除它,或者
- 提取系数(这很容易)以及使用它们进行预测的方法(这似乎不太容易)
我使用了多种统计模型,但主要是 GLM 和 Logit。
我看起来并不平凡。结果对象引用模型对象,模型对象引用原始数据。我不能让它适用于单个模型,但是(通过一个一个地删除字段)。但是是否有适用于所有模型的通用方法?
Statsmodels 在结果 类 中有一个 remove_data
方法,正是为此目的而添加的。首先,大多数结果都是惰性计算的,因此在调用 fit 之后,返回的结果实例还不包含很多结果统计信息。但是,它持有对模型和基础数据的引用,以按需计算这些结果统计信息。例如,调用 results.summary()
需要计算很多或大部分。
如果我们不需要计算这些统计数据,因为我们已经有了所有想要的统计数据,或者我们只想进行预测,那么我们可以删除所有大型数组和数据以减少内存需求。这是通过调用 results.remove_data()
.
完成的
https://github.com/statsmodels/statsmodels/issues/1729
请注意,模型和结果 类 维护一个应该删除的白名单。可能是在某些情况下白名单不完整。 (在这种情况下,我们将不胜感激。)
请注意,patsy 的公式不能被腌制。因此,使用或不使用 remove_data
的酸洗目前需要在使用时重新创建公式,如果环境不包含所需信息,这可能无法正常工作。如果 patsy 用于转换新数据以进行预测,则这是相关的。不使用公式无关
问题的最后一部分:
目前没有独立的预测功能。预测方法在模型内部进行硬编码,或者在 GLM 中使用 link 函数。所以,目前没有办法在不创建模型实例的情况下进行预测。 (在最简单的情况下,例如,仅使用 numpy 数组,它甚至不需要是具有完整数据集的模型。)
我正在尝试构建一个分布式按需建模生产系统,并希望在内存中保留数十万个小模型(并将它们传输到数据库和进程之间)。我正在查看统计模型。
我最感兴趣的只是能够保存模型的系数并在模型上调用预测。
看起来 statsmodels 包含 TONS 的附加信息(O(原始数据大小)),而这些信息对于此用例来说根本不需要。序列化的大小是几兆字节,而系数的大小只有几个字节。这填满了我的数据库并破坏了分布式处理和缓存性能,其中大量时间仅用于序列化和反序列化。通过在内存中保留两个数量级以上的模型,删除非系数数据可能会导致两个数量级的加速。
在statsmodels中,有没有通用的方法:
- 我可以要求不生成非输出系数数据,或者
- 从对象中删除它,或者
- 提取系数(这很容易)以及使用它们进行预测的方法(这似乎不太容易)
我使用了多种统计模型,但主要是 GLM 和 Logit。
我看起来并不平凡。结果对象引用模型对象,模型对象引用原始数据。我不能让它适用于单个模型,但是(通过一个一个地删除字段)。但是是否有适用于所有模型的通用方法?
Statsmodels 在结果 类 中有一个 remove_data
方法,正是为此目的而添加的。首先,大多数结果都是惰性计算的,因此在调用 fit 之后,返回的结果实例还不包含很多结果统计信息。但是,它持有对模型和基础数据的引用,以按需计算这些结果统计信息。例如,调用 results.summary()
需要计算很多或大部分。
如果我们不需要计算这些统计数据,因为我们已经有了所有想要的统计数据,或者我们只想进行预测,那么我们可以删除所有大型数组和数据以减少内存需求。这是通过调用 results.remove_data()
.
https://github.com/statsmodels/statsmodels/issues/1729
请注意,模型和结果 类 维护一个应该删除的白名单。可能是在某些情况下白名单不完整。 (在这种情况下,我们将不胜感激。)
请注意,patsy 的公式不能被腌制。因此,使用或不使用 remove_data
的酸洗目前需要在使用时重新创建公式,如果环境不包含所需信息,这可能无法正常工作。如果 patsy 用于转换新数据以进行预测,则这是相关的。不使用公式无关
问题的最后一部分: 目前没有独立的预测功能。预测方法在模型内部进行硬编码,或者在 GLM 中使用 link 函数。所以,目前没有办法在不创建模型实例的情况下进行预测。 (在最简单的情况下,例如,仅使用 numpy 数组,它甚至不需要是具有完整数据集的模型。)