GridSearchCV зависает на окнах с любым n_jobs - PullRequest
0 голосов
/ 07 октября 2018

У меня сейчас проблема с методом GridSearchCV из библиотеки обучения scikit.Я боролся с этим уже неделю, и пока не могу решить это.Он продолжает зависать при вызове, чтобы оптимизировать линейный SVM по параметру C.Странная вещь, это происходит не только при назначении n_jobs = -1, но и с 1 n_jobs, поэтому я не думаю, что многопроцессорность - это особая проблема.Кроме того, он отлично работает, когда я передаю ему массив формы X (2448, 1024), но полностью замирает, когда я передаю ему массив формы (5202, 1024).

Данные I 'm, наполняя его: float64 массивами разных форм от (2448, 1024), который прекрасно работает, до (7956, 1024)

Вещи, которые я уже пробовал:

  • Использование многопоточности, как предложено в https://stackoverflow.com/a/47929603/9699979
  • Сокращение количества n_jobs до 1
  • Назначение небольшого количества заданий pre_dispatch.Он начал вычислять первые несколько многословных строк, указывая на подходящий C, а затем заморозился.
  • Добавление блока if __name__ == '__main__', как предложено в https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-37311446
  • Запуск кода изтерминал, а не из Jupyter Notebook, где я работал

Я не могу запустить следующий код, как предложено в https://github.com/dmlc/xgboost/issues/2163#issuecomment-314524070, так как я запускаю свой кодв Windows.

from multiprocessing import pool, get_context
forkserver = get_context('forkserver')
p = forkserver.Pool()

На заметку: я подгоняю его к функции f1, а не к точности по умолчанию, что может быть проблемой, как видно из следующих потоков:

Вот некоторые фрагменты кода:

 from sklearn.externals.joblib import parallel_backend

 scaler = StandardScaler()
 X = scaler.fit_transform(fv_train.data) #traininig samples
 y = fv_train.axes[0] #class labels
 X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size = 0.1, train_size = 0.9)


clf = SVC(kernel = 'linear', probability=True)
scoring = ['f1']
C_range = np.linspace(start=1000, stop=10000, num=4, endpoint = True)
param_grid = dict(C = C_range)
grid = GridSearchCV(clf, param_grid = param_grid, scoring = scoring, cv = 3,
                    refit = 'f1', verbose = 42, n_jobs=-1, pre_dispatch=3)
with parallel_backend('threading'):
    grid.fit(X_train, y_train)

1 Ответ

0 голосов
/ 07 октября 2018

Попробуйте указать свой код в __name__ == '__main__', запустите его из командной строки Windows, но без использования оператора parallel_backend.Указание GridSearhCV с n_jobs должно обрабатывать многопроцессорность само по себе.

clf = SVC(kernel = 'linear', probability=True)
scoring = ['f1']
param_grid = {'C': np.linspace(start=1000, stop=10000, num=4, endpoint = True)}
grid = GridSearchCV(clf, param_grid = param_grid, scoring = scoring, cv = 3,
                refit = 'f1', verbose = 42, n_jobs=-1, pre_dispatch=3)
grid.fit(X_train, y_train)

Откройте диспетчер задач Windows и посмотрите, что происходит во время работы.Посмотрите на процент вашего процессора, вашей оперативной памяти и посмотрите на процессы Windows.Обычно вы хотите, чтобы ваш процессор становился очень высоким, и вы должны увидеть несколько процессов с именем Python в списке процессов.Это может зависать, потому что вы используете полную загрузку процессора.

Другая возможность состоит в том, что n_jobs не был реализован для скоринга f1.Вы можете попробовать запустить ваш код без оператора n_jobs, например:

clf = SVC(kernel = 'linear', probability=True)
scoring = ['f1']
param_grid = {'C': np.linspace(start=1000, stop=10000, num=4, endpoint = True)}
grid = GridSearchCV(clf, param_grid = param_grid, scoring = scoring, cv = 3,
                refit = 'f1', verbose = 42, pre_dispatch=3)
grid.fit(X_train, y_train)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...