2017-10-05 12 views
1

私は分散型オンデマンドモデリングプロダクションシステムを構築しようとしており、数十万の小さなモデルをメモリに保存したい(そしてそれらをデータベースとプロセス間でやり取りする)。私は統計モデルを見ている。シリアル化のために統計情報の結果をトリミングできますか?

私は、モデルの係数を保存し、モデルで予測を呼び出すことができることに主に関心があります。

statsmodelsには、このユースケースでは必要のないTONSの追加情報(O(元のデータサイズ))が含まれているようです。シリアライズされたサイズは数メガバイトですが、係数のサイズはわずか数バイトです。これにより、データベースが一杯になり、分散処理とキャッシュのパフォーマンスが低下します。単純なシリアライズとデシリアライズには多くの時間が費やされます。非係数データを削除すると、メモリに2桁以上多くのモデルを保存することで、2桁のスピードアップが得られる可能性があります。

statsmodelsで

、一般的な方法がある:

  • 私が生成されないように非出力係数データを求め、又は
  • オブジェクトから削除、または
  • 抽出することができます(簡単に)係数を使用して予測を行う方法(あまり簡単ではないようです)

私はさまざまな統計モデルを使用していますが、主にGLMとLogitを使用しています。

私は些細なように見えません。結果オブジェクトは元のデータを参照するモデルオブジェクトを参照します。個々のモデルでは動作させることはできませんが(フィールドを1つずつ削除することによって)しかし、すべてのモデルで機能する汎用的な方法がありますか?

答えて

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配列の場合、完全なデータセットを持つモデルである必要はありません)

+0

Sweet!ありがとうございました – user48956

+1

私は関連する問題について2つの段落を追加しました。また、 'params'を保存してから単純な予測のためだけに機能する新しいデータや人工データを使って偽のモデルを作成するといったトリックもあります。 'model.predict(params、exog、offset)'です。しかし、これは単体テストではなく、「正式に」サポートされているわけでもありません。 – user333700

関連する問題