2014-04-14 3 views
0

분류 문제로 sklearn의 RandomForestClassifier을 사용하고 있습니다. 나는 각 나무에 대한 (아주) 큰 세트의 부분 집합을 잡으면서 숲의 나무들을 개별적으로 훈련시키고 싶다. 그러나 수동으로 나무에 딱 들어 맞으면 메모리 사용량이 늘어납니다.sklearn의 수동 트리밍 메모리 사용량

다음은 RandomForestClassifierfit 기능을 사용하는 사용자 정의 적합의 memory_profiler을 사용하는 라인 별 메모리 프로필입니다. 내가 알 수있는 한, 소스 피팅 함수는 사용자 정의 피팅과 동일한 단계를 수행합니다. 그래서 모든 여분의 기억을주는 것은 무엇입니까 ??

정상 적합 :

Line # Mem usage Increment Line Contents 
================================================ 
17 28.004 MiB 0.000 MiB @profile 
18        def normal_fit(): 
19 28.777 MiB 0.773 MiB X = random.random((1000,100)) 
20 28.781 MiB 0.004 MiB Y = random.random(1000) < 0.5 
21 28.785 MiB 0.004 MiB rfc = RFC(n_estimators=100,n_jobs=1) 
22 28.785 MiB 0.000 MiB rfc.n_classes_ = 2 
23 28.785 MiB 0.000 MiB rfc.classes_ = array([False, True],dtype=bool) 
24 28.785 MiB 0.000 MiB rfc.n_outputs_ = 1 
25 28.785 MiB 0.000 MiB rfc.n_features_ = 100 
26 28.785 MiB 0.000 MiB rfc.bootstrap = False 
27 37.668 MiB 8.883 MiB rfc.fit(X,Y) 

사용자 정의에 맞게 :

Line # Mem usage Increment Line Contents 
================================================ 
4 28.004 MiB 0.000 MiB @profile 
5        def custom_fit(): 
6 28.777 MiB 0.773 MiB X = random.random((1000,100)) 
7 28.781 MiB 0.004 MiB Y = random.random(1000) < 0.5 
8 28.785 MiB 0.004 MiB rfc = RFC(n_estimators=100,n_jobs=1) 
9 28.785 MiB 0.000 MiB rfc.n_classes_ = 2 
10 28.785 MiB 0.000 MiB rfc.classes_ = array([False, True],dtype=bool) 
11 28.785 MiB 0.000 MiB rfc.n_outputs_ = 1 
12 28.785 MiB 0.000 MiB rfc.n_features_ = 100 
13 73.266 MiB 44.480 MiB for i in range(rfc.n_estimators): 
14 72.820 MiB -0.445 MiB  rfc._make_estimator() 
15 73.262 MiB 0.441 MiB  rfc.estimators_[-1].fit(X,Y,check_input=False) 
+0

sklearn의 버전은 무엇입니까? –

+0

나는 0.14.1을 사용하고있다 –

+0

'X' 대신'X.T'로 이것을 시도 할 수 있습니까? –

답변

0

는 후속 :

내가 대신 하나의 트리를 구축하고 피클을 통해 덤핑에 대한 파이썬 스크립트를 작성합니다. 그런 다음 RF 모델을 만들고 덤프하기 위해 쉘 스크립팅과 최종 파이썬 스크립트와 함께 모든 것을 붙입니다. 이 방법으로 메모리는 각각의 트리가 생성 된 후에 각각 고유 한 실행 스레드를 가지고 반환됩니다.

구현은 _parallel_build_tree 메서드와 관련이 있다고 생각하는 방식으로 메모리 문제를 해결하지만 사용자 지정 구현은 그 점에서 다릅니다. 답변으로 내 해결 방법을 게시하지만, 미래에 누군가가 이전에 내게 계몽 수 있다면, 나는 그것을 고맙게 생각합니다.