ディスクに保存されたときのランダムフォレストの禁止サイズ


9

cPickleを使用してディスクに保存した場合:https ://stackoverflow.com/questions/20662023/save-python-random-forest-model-to-file 、私のランダムフォレストは6.57 GBです。

with open('rforest.cpickle', 'wb') as f:
    cPickle.dump(rforest, f)

Herokuでホストされているpython APIを介して予測を行うためにフォレスト自体を使用したいと思います。もちろん、そのファイルサイズは許容できません。

ファイルサイズが非常に大きいのはなぜですか?アンサンブルには500本のツリーがあります。保存したいのは、予測として使用されるため、完成したツリー自体だけです。ディスク上に約7 GBのスペースを必要とする500のツリーのそれぞれを構成するのは、実際のノードとエッジですか?

scikitlearnのrandomforestregressorを使用しました:

def buildForest(self, X_train, y_train):
    rf = RandomForestRegressor(n_estimators=500, verbose=1)
    rf.fit_transform(X_train, y_train)
    return rf

また、APIを介してモデルにアクセスできるようにするより良い方法がある場合は、それも知っておくとよいでしょう。

更新:予測能力をほとんど失うことなく100ツリーに減らしたため、保存サイズは1.3 GBになりました。


1
ロルと私は私のものは大きいと思いました。私のランダムフォレストは330 Mb必要でしたが、奇妙なことに、ファイルのサイズが非常に大きいと思ったので、ここに来て、あなたのフォレストが6.57 Gbを使用しているのを確認しました。あなたのレコード数はわかりませんが、違いが出ると思います。私も500本の木を使用しています、私は100、500から1000にしようとしたので、500に戻った精度にかなりの違いに気付かなかった
AndroidMarshmallow

回答:


4

各木のサイズは、その深さに大きく依存します。したがって、最大深度を変更しmax_depthます()。(デフォルトの「なし」ではなく)有限数に設定してから、この数を減らしてみてください。さらに(または代替として)min_samples_splitまたはを増やしてみてくださいmin_samples_split

機能を分析して、重要な機能のみを保持することもできます。最も簡単な方法はclf.feature_importances_、あなたの森を見ることです。(一般的に、重要な特徴を見つけることはそれ自体が芸術と科学です。)無関係な特徴を除外し、森を再建します。


2

これを試して:

import pickle
with open('rforest.pickle', 'wb') as f:
    pickle.dump(rforest, f, -1)

注意:パラメータ「-1」を使用すると、モデルファイルのサイズが大幅に削減されます。

ドキュメントによると:

pickle.dump(obj、file [、protocol])

プロトコルバージョン0は元のASCIIプロトコルであり、以前のバージョンのPythonと下位互換性があります。プロトコルバージョン1は古いバイナリ形式であり、以前のバージョンのPythonとも互換性があります。プロトコルバージョン2はPython 2.3で導入されました。新しいスタイルのクラスをより効率的に漬けることができます。

protocolパラメータを省略すると、プロトコル0が使用されます。プロトコルが負の値またはHIGHEST_PROTOCOLとして指定されている場合、最高のプロトコルバージョンが使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.