2013-01-23 3 views
1

커다란 파이썬 객체를로드하는 응용 프로그램이 있습니다.이 클래스는 직렬화 된 scikit-learn 분류 자 ​​및 관련 어휘입니다.scikit-learn의 느린 unpickling 문제를 해결합니다. OneVsRest RandomForests

분류기는 크기가 커서 메모리에로드하는 것이 중요하지 않습니다 (1-100MB 정도). 실제 판독은 빠르지 만, unpickling에는 4MB 분류 자의 경우 약 10 초가 소요됩니다.

cPickle.dumps/cPickle.loads보다 개체를 serialize/deserialize하는 빠른 방법이 있습니까?

추가 정보 :

분류기는 10 개 요소 중 하나 - 대 - 나머지 랜덤 포레스트의 인스턴스입니다. 분류기는 약 1,000 개의 샘플, 약 500 개의 특징 및 52 개의 가능한 라벨에 대해 교육을 받았습니다. 이것에 대해 github.com/scikit-learn에서 문제를 개방 과정에있어

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} 

다음 min_density 파라미터 cPickle.load 0.1


cprofile 명령 출력으로 설정된다.

답변

2

joblib picker를 사용해 보셨습니까? 그것은 sklearn 패키지에 번들 것 :

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

편집가 : 실제로 임의 숲에 대한 기본적 최고 protocolo으로 산세하는 것은 빠른 것 같다 :

>>> 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가 : 프로필 보고서에 따라, 문제는 의사 난수 생성기 인스턴스의 unpickling 것 같습니다. 데이터 세트의 모양과 함께 모델을 교육하고 scikit-learn 프로젝트의 github 발행 추적기에 버그로 프로파일 링 보고서를 포함시키는 정확한 파이썬 조각을 제공해 주시겠습니까?

+0

현재 저는 cPickle 덤프를 사용 중이며 HIGHEST_PROTOCOL을 (를)로드하고 있습니다. 나는 joblib을 시도하지 않았지만 나는 그것을 줄 수 있다고 생각한다. 어쩌면 내가 평행하게 욕설을 나눌 수 있을까? – Maus

+0

로드를 먼저 프로파일 링하는 것이 좋습니다. – ogrisel

+0

프로파일 링 출력에 감사드립니다. 제 대답의 두 번째 편집을 참조하십시오. – ogrisel

관련 문제