2015-01-05 2 views
1

나는 훈련 데이터 (~ 30mb)에 맞게 scikit-learn Random Forest를 사용하고 있으며, 내 랩톱은 응용 프로그램 메모리가 중단되는 것을 계속합니다. 테스트 데이터는 교육 데이터보다 몇 배 더 큽니다. Macbook Air 2GHz 8GB 메모리 사용.랜덤 포레스트 : 메모리 부족으로 인해

이 문제를 해결할 수있는 방법은 무엇입니까?

rf = RandomForestClassifier(n_estimators = 100, n_jobs=4) 
print "20 Fold CV Score: ", np.mean(cross_validation.cross_val_score(rf, X_train_a, y_train, cv=20, scoring='roc_auc')) 
+0

사용중인 scikit-learn의 버전은 무엇입니까? 0.15 버전에서는 포리스트에서 메모리 소비가 크게 향상되었습니다. –

+0

'0.15.2'. 순차적으로 구축 된 GBRT로 전환을 시도했지만 어떻게 든 메모리가 부족합니다. EC2 클러스터에서 실행하거나 무작위 샘플링을 실제로 시도해야한다는 의미입니까? – ananuc

+0

@AndreasMueller : Advanced Sklearn에 대한 유용한 토론에 감사드립니다. 어쩌면 거기에서 몇 가지 아이디어를 시도해 볼 수 있습니다. EC2에 대한 ogrisel의 병렬 ML 튜토리얼을 살펴볼 기회가 없습니다. 어떤 시점을 넘어서서 회전하는 EC2 클러스터를 고려할 필요가 있는지 궁금합니다. – ananuc

답변

1

가장 좋은 방법은 인수를 조정하는 것입니다.

n_jobs=4 

이렇게하면 컴퓨터가 동시에 4 개의 트레인 테스트 사이클을 계산하게됩니다. 다른 Python 작업은 별도의 프로세스에서 실행되므로 전체 데이터 세트도 복사됩니다. 메모리를 절약하려면 n_jobs을 2 또는 1로 줄이십시오. n_jobs==4는 메모리의 4 배를 사용합니다 n_jobs==1.

cv=20 

이렇게하면 데이터가 20 개로 나뉘며 코드는 20 개의 train-test 반복을 수행합니다. 즉, 학습 데이터는 원본 데이터 19 개 크기입니다. 확실히 10으로 줄일 수 있지만 정확도 추정치가 나빠질 수 있습니다. 많은 메모리를 절약하지는 않지만 런타임을 더 빠르게 만듭니다.

이 값을 줄이면 메모리는 거의 절약되지만 임의의 포리스트에는 더 적은 트리가 포함되어 있기 때문에 알고리즘이 더 빠르게 실행됩니다.

요약하면 메모리를 절약하기 위해 n_jobs을 2로 줄이는 것이 좋습니다 (런타임의 2 배 증가). 런타임을 보완하기 위해 cv을 10 (런타임의 2 배 절약)으로 변경하는 것이 좋습니다. 그래도 도움이되지 않으면 n_jobs을 1로 변경하고 예상 수를 50으로 줄입니다 (처리 속도가 2 배 빨라짐).