3

非常に大きなPythonオブジェクトをロードするアプリケーションがあります。それらはシリアル化されたscikit-learn分類子とそれに関連する語彙です。

分類子は十分に大きいため(1〜100 MBのオーダー)、メモリにロードするのは簡単な作業ではありません。実際の読み取りは高速ですが、ピッキング解除には長い時間がかかり、4MBの分類子の場合は約10秒かかります。

cPickle.dumps / cPickle.loadsよりも高速にオブジェクトをシリアル化/逆シリアル化する方法はありますか?

追加情報:

分類子は、10個の要素からなる1対残りのランダムフォレストのインスタンスです。分類器は、約1,000のサンプル、約500の特徴、および52の可能なラベルでトレーニングされました。min_densityパラメータは0に設定されます。


cPickle.loadのcProfile出力:

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000  300.168  300.168 <ipython-input-4-9b8a128f290d>:1(loader)
        1    0.899    0.899  301.067  301.067 <string>:1(<module>)
    51380  288.151    0.006  288.151    0.006 __init__.py:93(__RandomState_ctor)
    51380    0.059    0.000    0.404    0.000 fromnumeric.py:1774(amax)
        1   11.613   11.613  300.168  300.168 {cPickle.load}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
    51380    0.344    0.000    0.344    0.000 {method 'max' of 'numpy.ndarray' objects}
        1    0.000    0.000    0.000    0.000 {open}

私はgithub.com/scikitで問題を開く過程にあります-これについて学びましょう。

4

1 に答える 1

2

joblibピッカーを使用しようとしましたか?sklearnパッケージにバンドルされています:

>>> from sklearn.externals import joblib
>>> joblib.dump(model, '/path/to/model.pkl')
>>> model_copy = joblib.load('/path/to/model.pkl')

編集:実際にはランダムフォレストの場合、HIGHESTプロトコルを使用したデフォルトのピクルス処理の方が速いようです:

>>> from cPickle import dump, load, HIGHEST_PROTOCOL
>>> dump(model, open('/tmp/model_highest.pkl', 'wb'), HIGHEST_PROTOCOL)
>>> load(open('/tmp/model_highest.pkl', 'rb'))

Edit2:プロファイルレポートに基づくと、問題は疑似乱数ジェネレータインスタンスの選択解除にあるようです。データセットの形状とともにモデルをトレーニングするために使用している正確なPythonスニペットを提供し、それをscikit-learnプロジェクトのgithub課題追跡システムのバグとしてプロファイリングレポートと一緒に含めてください。

于 2013-01-23T09:21:54.153 に答える