масштабирование sklearn RandomForestClassifier для RandomizedSearchCV - PullRequest
3 голосов
/ 27 марта 2019

Я тренирую sklearn.ensemble.RandomForestClassifier() на одном узле кластера, который имеет 28 процессоров и ~ 190 ГБ ОЗУ. Обучение только одному этому классификатору проходит довольно быстро, использует все ядра компьютера и использует ~ 93 ГБ ОЗУ:

x_train,x_test,y_train,y_test=sklearn.model_selection.train_test_split(x,y,test_size=.25,random_state=0)

clf=sklearn.ensemble.RandomForestClassifier(n_estimators=100,
                                            random_state=0,
                                            n_jobs=-1,
                                            max_depth=10,
                                            class_weight='balanced',
                                            warm_start=False,
                                            verbose=2)
clf.fit(x_train,y_train)

с выводом:

[Parallel(n_jobs=-1)]: Done  88 out of 100 | elapsed:  1.9min remaining:   15.2s
[Parallel(n_jobs=-1)]: Done 100 out of 100 | elapsed:  2.0min finished
CPU times: user 43min 10s, sys: 1min 33s, total: 44min 44s
Wall time: 2min 20s

Тем не менее, эта конкретная модель кажется неоптимальной, с правильной производительностью ~ 80%. Поэтому я хочу оптимизировать гиперпараметры для модели, используя sklearn.model_selection.RandomizedSearchCV(). Поэтому я настроил поиск следующим образом:

rfc = sklearn.ensemble.RandomForestClassifier()
rf_random = sklearn.model_selection.RandomizedSearchCV(estimator=rfc, 
                                                       param_distributions=random_grid, 
                                                       n_iter=100, 
                                                       cv=3, 
                                                       verbose=2, 
                                                       random_state=0, 
                                                       n_jobs=2, 
                                                       pre_dispatch=1)
rf_random.fit(x, y)

Но я не могу найти настройки для n_jobs и pre_dispatch, которые эффективно используют оборудование. Вот несколько примеров выполнения и результаты:

n_jobs   pre_dispatch    Result
===========================================================================
default       default    Utilizes all cores but Job killed - out of memory
    -1              1    Job killed - out of memory
    12              1    Job killed - out of memory
     3              1    Job killed - out of memory
     2              1    Job runs, but only utilizes 2 cores, takes >230min (wall clock) per model

Как я могу получить производительность, которую я вижу при обучении автономной RandomForestClassifier при выполнении поиска гиперпараметра? И как автономная версия распараллеливается так, что она не создает копии моего большого набора данных, как при поиске по сетке?


EDIT: Следующая комбинация параметров эффективно использовала все ядра для обучения каждого человека RandomForestClassifier без распараллеливания самого поиска гиперпараметра или увеличения использования оперативной памяти.

model = sklearn.ensemble.RandomForestClassifier(n_jobs=-1, verbose=1)
search = sklearn.model_selection.RandomizedSearchCV(estimator=model, 
                                                    param_distributions=random_grid, 
                                                    n_iter=10, 
                                                    cv=3, 
                                                    verbose=10, 
                                                    random_state=0,
                                                    n_jobs=1,
                                                    pre_dispatch=1)
with joblib.parallel_backend('threading'):
    search.fit(x, y)

1 Ответ

1 голос
/ 29 марта 2019

Если тренировка с одним классификатором насыщает все ваши ядра, то распараллеливать поиск по сетке тоже нечего.Установите n_jobs = 1 для gridsearch и оставьте n_jobs = -1 для классификатора.Это должно избежать состояния нехватки памяти.

...