2017-10-05 120 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