Scikit-learn: GridSearchCV параллельное выполнение с зависанием собственного счетчика

Созданный на 24 февр. 2014  ·  99Комментарии  ·  Источник: scikit-learn/scikit-learn

Я часами искал эту проблему и могу последовательно ее воспроизвести:

clf = GridSearchCV( sk.LogisticRegression(),
                            tuned_parameters,
                            cv = N_folds_validation,
                            pre_dispatch='6*n_jobs', 
                            n_jobs=4,
                            verbose = 1,
                            scoring=metrics.make_scorer(metrics.scorer.f1_score, average="macro")
                        )

Этот фрагмент кода аварийно завершает работу из-за scoring = metrics.make_scorer (metrics.scorer.f1_score, average = "macro"), где метрики относятся к модулю sklearn.metrics. Если я уберу строку scoring = ..., параллельное выполнение будет работать. Если я хочу использовать оценку f1 в качестве метода оценки, мне нужно отменить параллельное выполнение, установив n_jobs = 1.

Есть ли способ определить другой метод оценки, не теряя возможности параллельного выполнения?

Спасибо

Самый полезный комментарий

Хм, это, вероятно, связано с проблемами многопроцессорной обработки в Windows. Может быть, @GaelVaroquaux или @ogrisel могут помочь.
Я не знаю, что делает блокнот из __name__ == "__main__" .
Попробуйте определять метрику не в записной книжке, а в отдельном файле и импортировать его. Думаю, это исправит.
На самом деле это не связано с GridSearchCV, но связано с некоторым интересным взаимодействием между многопроцессорной обработкой Windows, записной книжкой IPython и joblib.

Все 99 Комментарий

Это удивительно, поэтому нам нужно выяснить, в чем проблема, и убедиться, что она работает!

Не могли бы вы рассказать поподробнее:

  • Что вы имеете в виду под «вылетами»?
  • Что это за версия scikit-learn? Если это 0,14, происходит ли это в текущей разрабатываемой версии?
  • Многопроцессорность имеет проблемы, связанные с платформой. На какой платформе вы находитесь? (например, import platform; platform.platform() )
  • Вы пробовали это на разных наборах данных?

FWIW, у моей машины нет проблем с установкой iris с этим фрагментом в разрабатываемой версии sklearn.

Спасибо за быстрый ответ.

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

Это scikit-learn версия 0.14, последнее обновление и запуск с использованием Enthought Canopy.

Я использую платформу «Windows-7-6.1.7601-SP1».

Я углублюсь в подробности, представив общий пример проблемы. Я думаю, это связано с тем, что GridSearchCV помещается в цикл for. (Чтобы не тратить слишком много времени, вам, вероятно, следует начать с метода run_tune_process (), который вызывается в нижней части кода и вызывает метод, содержащий GridSearchCV () в цикле for)

Код:

import sklearn.metrics as metrics
from sklearn.grid_search import GridSearchCV
import numpy as np
import os
from sklearn import datasets
from sklearn import svm as sk


def tune_hyperparameters(trainingData, period):
    allDataTrain = trainingData

    # Define hyperparameters and construct a dictionary of them
    amount_kernels = 2
    kernels = ['rbf','linear']
    gamma_range =   10. ** np.arange(-5, 5)
    C_range =       10. ** np.arange(-5, 5)
    tuned_parameters = [
                        {'kernel': ['rbf'],     'gamma': gamma_range , 'C': C_range},
                        {'kernel': ['linear'],  'C': C_range}
                       ]

    print("Tuning hyper-parameters on period = " + str(period) + "\n")

    clf = GridSearchCV( sk.SVC(), 
                        tuned_parameters,
                        cv=5,
                        pre_dispatch='4*n_jobs', 
                        n_jobs=2,
                        verbose = 1,
                        scoring=metrics.make_scorer(metrics.scorer.f1_score, average="macro")
                        )
    clf.fit(allDataTrain[:,1:], allDataTrain[:,0:1].ravel())

    # other code will output some data to files, graphs and will save the optimal model with joblib package


    #   Eventually we will return the optimal model
    return clf

def run_tune_process(hyperparam_tuning_method,trainingData, testData):    
    for period in np.arange(0,100,10):
                clf = hyperparam_tuning_method(trainingData,period)

                y_real = testData[:,0:1].ravel()
                y_pred = clf.predict(testData[:,1:])

# import some data to play with
iris = datasets.load_iris()
X_training = iris.data[0:100,:]  
Y_training = (iris.target[0:100]).reshape(100,1)
trainingset = np.hstack((Y_training, X_training))

X_test = iris.data[100:150,:]  
Y_test = (iris.target[100:150]).reshape(50,1)
testset = np.hstack((Y_test, X_test))

run_tune_process(tune_hyperparameters,trainingset,testset)

Еще раз, этот код работает на моем компьютере только тогда, когда я изменяю n_jobs на 1 или когда я не определяю аргумент scoring =.

Как правило, многопроцессорность в Windows вызывает множество проблем. Но я
не знаю, почему это должно соотноситься с пользовательским показателем. Есть
ничего о среднем параметре = макрос в 0.14, который предполагает, что это должно быть
вероятность зависания выше, чем среднее значение по умолчанию (взвешенное). При разработке
голова, это завершается за 11 секунд на моем MacBook и за 7 секунд в версии 0.14
(это то, во что стоит посмотреть!)

Можете ли вы попробовать это в текущей разрабатываемой версии, чтобы узнать,
это все еще проблема?

25 февраля 2014 г., 20:40, adverley [email protected] написал:

Спасибо за быстрый ответ.

Под сбоем я на самом деле имею в виду замораживание. Это больше не продолжается и
также больше нет активности, которую нужно отслеживать в процессе python
диспетчер задач windows. Процессы все еще существуют и потребляют
постоянный объем ОЗУ, но не требует времени обработки.

Это scikit-learn версия 0.14, последнее обновление и запуск с использованием Enthought.
Навес.

Я использую платформу «Windows-7-6.1.7601-SP1».

Я углублюсь в подробности, представив общий пример проблемы. я
думаю, это связано с тем, что GridSearchCV помещается в цикл for. (К
не тратьте слишком много времени, вам, вероятно, следует начать с
run_tune_process () метод, который вызывается внизу кода
и вызывает метод, содержащий GridSearchCV () в цикле for)
Код:

импортировать sklearn.metrics как метрики
из sklearn.grid_search import GridSearchCV
импортировать numpy как np
импорт ОС
из наборов данных импорта sklearn
из sklearn импортировать svm как sk

def tune_hyperparameters (trainingData, период):
allDataTrain = trainingData

# Define hyperparameters and construct a dictionary of them
amount_kernels = 2
kernels = ['rbf','linear']
gamma_range =   10. ** np.arange(-5, 5)
C_range =       10. ** np.arange(-5, 5)
tuned_parameters = [
                    {'kernel': ['rbf'],     'gamma': gamma_range , 'C': C_range},
                    {'kernel': ['linear'],  'C': C_range}
                   ]

print("Tuning hyper-parameters on period = " + str(period) + "\n")

clf = GridSearchCV( sk.SVC(),
                    tuned_parameters,
                    cv=5,
                    pre_dispatch='4*n_jobs',
                    n_jobs=2,
                    verbose = 1,
                    scoring=metrics.make_scorer(metrics.scorer.f1_score, average="macro")
                    )
clf.fit(allDataTrain[:,1:], allDataTrain[:,0:1].ravel())

# other code will output some data to files, graphs and will save the optimal model with joblib package


#   Eventually we will return the optimal model
return clf

def run_tune_process (hyperparam_tuning_method, trainingData, testData):
за период в np.arange (0,100,10):
clf = hyperparam_tuning_method (тренировочные данные, период)

            y_real = testData[:,0:1].ravel()
            y_pred = clf.predict(testData[:,1:])

импортировать данные для игры

iris = datasets.load_iris ()
X_training = iris.data [0: 100 ,:]
Y_training = (iris.target [0: 100]). Reshape (100,1)
тренировочный набор = np.hstack ((Y_training, X_training))

X_test = iris.data [100: 150 ,:]
Y_test = (iris.target [100: 150]). Reshape (50,1)
testset = np.hstack ((Y_test, X_test))

run_tune_process (tune_hyperparameters, обучающий набор, набор тестов)

Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -35990430.
.

(В качестве побочного момента, @ogrisel , я отмечаю, что, кажется, гораздо больше joblib
накладные расходы на распараллеливание в мастере - по крайней мере, в OS X - этого не было
в 0,14 ...)

25 февраля 2014 г. в 21:52 Джоэл Нотман [email protected] написал :

Как правило, многопроцессорность в Windows вызывает множество проблем. Но я
не знаю, почему это должно соотноситься с пользовательским показателем. Есть
ничего о среднем параметре = макрос в 0.14, который предполагает, что это должно быть
вероятность зависания выше, чем среднее значение по умолчанию (взвешенное). При разработке
голова, это завершается за 11 секунд на моем MacBook и за 7 секунд в версии 0.14
(это то, во что стоит посмотреть!)

Можете ли вы попробовать это в текущей разрабатываемой версии, чтобы узнать,
это все еще проблема?

25 февраля 2014 г., 20:40, adverley [email protected] написал:

Спасибо за быстрый ответ.

Под сбоем я на самом деле имею в виду замораживание. Это больше не продолжается и
также больше нет активности, которую нужно отслеживать в процессе python
диспетчер задач windows. Процессы все еще существуют и потребляют
постоянный объем ОЗУ, но не требует времени обработки.

Это scikit-learn версия 0.14, последнее обновление и запуск с использованием Enthought.
Навес.

Я использую платформу «Windows-7-6.1.7601-SP1».

Я углублюсь в подробности, представив общий пример проблемы.
Я думаю, это связано с тем, что GridSearchCV помещается в цикл for. (К
не тратьте слишком много времени, вам, вероятно, следует начать с
run_tune_process () метод, который вызывается внизу кода
и вызывает метод, содержащий GridSearchCV () в цикле for)
Код:

импортировать sklearn.metrics как метрики
из sklearn.grid_search import GridSearchCV
импортировать numpy как np
импорт ОС
из наборов данных импорта sklearn
из sklearn импортировать svm как sk

def tune_hyperparameters (trainingData, период):
allDataTrain = trainingData

# Define hyperparameters and construct a dictionary of them
amount_kernels = 2
kernels = ['rbf','linear']
gamma_range =   10. ** np.arange(-5, 5)
C_range =       10. ** np.arange(-5, 5)
tuned_parameters = [
                    {'kernel': ['rbf'],     'gamma': gamma_range , 'C': C_range},
                    {'kernel': ['linear'],  'C': C_range}
                   ]

print("Tuning hyper-parameters on period = " + str(period) + "\n")

clf = GridSearchCV( sk.SVC(),
                    tuned_parameters,
                    cv=5,
                    pre_dispatch='4*n_jobs',
                    n_jobs=2,
                    verbose = 1,
                    scoring=metrics.make_scorer(metrics.scorer.f1_score, average="macro")
                    )
clf.fit(allDataTrain[:,1:], allDataTrain[:,0:1].ravel())

# other code will output some data to files, graphs and will save the optimal model with joblib package


#   Eventually we will return the optimal model
return clf

def run_tune_process (hyperparam_tuning_method, trainingData, testData):
за период в np.arange (0,100,10):
clf = hyperparam_tuning_method (тренировочные данные, период)

            y_real = testData[:,0:1].ravel()
            y_pred = clf.predict(testData[:,1:])

импортировать данные для игры

iris = datasets.load_iris ()
X_training = iris.data [0: 100 ,:]
Y_training = (iris.target [0: 100]). Reshape (100,1)
тренировочный набор = np.hstack ((Y_training, X_training))

X_test = iris.data [100: 150 ,:]
Y_test = (iris.target [100: 150]). Reshape (50,1)
testset = np.hstack ((Y_test, X_test))

run_tune_process (tune_hyperparameters, обучающий набор, набор тестов)

Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -35990430.
.

Это не имеет ничего общего с кастомными бомбардировщиками. Это хорошо известная особенность многопроцессорной обработки Python в Windows: вам нужно запустить все, что использует n_jobs=-1 в блоке if __name__ == '__main__' иначе вы получите зависания / сбои. Может быть, нам стоит задокументировать это где-нибудь на видном месте, например, в README?

вам нужно запустить все, что использует n_jobs = -1 в if name ==
' основной ' блок, иначе вы получите зависания / сбои.

Что ж, хорошая новость в том, что в настоящее время joblib выдает значимую ошибку.
сообщение о такой аварии, а не вилка бомбы.

@GaelVaroquaux дает ли текущий scikit-learn это сообщение об ошибке? Если так, то проблему можно считать исправленной, ИМХО.

@GaelVaroquaux дает ли текущий scikit-learn это сообщение об ошибке? Если да, то
вопрос можно считать исправленным, ИМХО.

Это должно сработать. Единственный способ убедиться - это проверить. Я иду прямо
сейчас, и я не могу загрузить для этого виртуальную машину Windows.

Я не собираюсь устанавливать компилятор C в Windows только для этого. Извините, но я правда винду не делаю :)

Я не собираюсь устанавливать компилятор C в Windows только для этого. Извини но я
правда винду не делаю :)

У меня есть виртуальная машина Windows. Я могу проверить. Это просто вопрос поиска
мало времени сделать это.

@larsmans , вы совершенно правы. Пользовательский объект скоринга был моей ошибкой, проблема действительно заключается в многопроцессорной обработке в окнах. Я пробовал этот же код на Linux, и он хорошо работает.

Я не получаю никаких сообщений об ошибках, потому что он не дает сбоев, он просто перестает делать что-либо значимое.

@adverley Не могли бы вы попробовать самую последнюю версию с GitHub на вашем компьютере с Windows?

Закрытие из-за отсутствия обратной связи, и, вероятно, это известная проблема, исправленная в новой библиотеке вакансий.

Не уверен, связано ли это, кажется, есть.

В windows пользовательский счетчик по-прежнему зависает. Столкнулся с этой веткой в ​​гугле - убрал бомбардир, и поиск по сетке работает.

Когда он зависает, он не показывает сообщения об ошибке. Также было создано 3 процесса Python (потому что я установил n_jobs = 3). Однако загрузка ЦП остается равной 0 для всех процессов Python. Я использую ноутбук IPython.

Можете поделиться кодом бомбардира? Это кажется маловероятным.

Ваш бомбардир где-нибудь использует joblib / n_jobs? Этого не должно быть, и это может вызвать проблемы (хотя я думаю, что joblib должен это обнаружить).

Конечно - вот полный код - http://pastebin.com/yUE26SNs

Функция счетчика - "score_model", она не использует joblib.

Это запускается из командной строки, но не из IPython Notebook. Сообщение об ошибке -
AttributeError: Can't get attribute 'score_model' on <module '__main__' (built-in)>;

Затем IPython и все порожденные экземпляры python становятся бездействующими - беззвучно - и больше не отвечают ни на какой код Python, пока я не перезапущу его.

Исправьте ошибку атрибута, тогда все заработает.
Вы делаете импорт pylab в ноутбуке IPython? В остальном все должно быть так же.

Ну, я не знаю, что вызывает AttributeError ... Хотя это, скорее всего, связано с библиотеками заданий, поскольку _ это происходит только тогда, когда n_jobs больше 1_, отлично работает с n_jobs=1 .

Ошибка говорит о том, что атрибут score_model отсутствует в __main__ , независимо от того, есть ли у меня if __name__ == '__main__' в блокноте IPython или нет.

(Я понял, что строка с ошибкой вставлена ​​неправильно выше - я отредактировал в сообщении выше.)

Я не использую pylab.

Вот полное расширенное сообщение об ошибке - http://pastebin.com/23y5uHT2

Хм, это, вероятно, связано с проблемами многопроцессорной обработки в Windows. Может быть, @GaelVaroquaux или @ogrisel могут помочь.
Я не знаю, что делает блокнот из __name__ == "__main__" .
Попробуйте определять метрику не в записной книжке, а в отдельном файле и импортировать его. Думаю, это исправит.
На самом деле это не связано с GridSearchCV, но связано с некоторым интересным взаимодействием между многопроцессорной обработкой Windows, записной книжкой IPython и joblib.

ребята ... спасибо за ветку. В любом случае, я должен был проверить эту ветку раньше, потратил на это 5 часов своего времени. Пытаюсь запустить параллельную обработку. Большое спасибо :)
ЧТОБЫ ДОБАВИТЬ ОТЗЫВ: все еще замораживает. Я столкнулся с той же проблемой, когда при наличии моей собственной функции стоимости make_Score ... моя система начала зависать. Когда я не использовал пользовательскую функцию стоимости, я не сталкивался с этими зависаниями при параллельной обработке

Лучший способ превратить эти 5 часов во что-то полезное для проекта - предоставить нам отдельный пример, воспроизводящий проблему.

У меня возникла та же проблема при работе Windows 10 в записной книжке Jupyter, когда я пытался использовать настраиваемую систему оценки во вложенной перекрестной проверке и n_jobs = -1. Я получал сообщение AttributeError: Can't get attribute 'custom_scorer' on <module '__main__' (built-in)>; .
Как предложил @amueller , импорт настраиваемого

У меня такая же проблема на OSX 10.10.5

То же самое.
OSX 10.12.5

Пожалуйста, дайте воспроизводимый фрагмент кода. Мы хотели бы разобраться в этом. Это трудно понять без кода, включая данные, который показывает нам проблему.

Просто запустите эти строки в оболочке Python

import numpy as np
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.preprocessing import RobustScaler
from sklearn.metrics import classification_report
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_predict

np.random.seed(1234)
X = np.random.sample((1000, 100))
Y = np.random.sample((1000)) > 0.5
svc_pipeline = Pipeline([('pca', PCA(n_components=95)), ('svc', SVC())])
predictions = cross_val_predict(svc_pipeline, X, Y, cv=30, n_jobs=-1)
print classification_report(Y, predictions)

Обратите внимание, что удаление шага PCA из конвейера решает проблему.

Больше информации:

Дарвин-16.6.0-x86_64-i386-64bit
('Python', '2.7.13 (по умолчанию, 4 апреля 2017 г., 08:47:57) \ n [Apple LLVM 8.1.0, совместимый с GCC 4.2.1 (clang-802.0.38)]')
('NumPy', '1.12.1')
('SciPy', '0,19.1')
('Scikit-Learn', '0.18.2')

поскольку вы не используете индивидуальный счетчик очков, следует ли считать, что это
отдельный вопрос?

8 августа 2017 г. в 18:15 "boazsh" [email protected] написал:

Просто запустите эти строки в оболочке Python

from sklearn.decomposition import PCAfrom sklearn.svm import SVCfrom sklearn.preprocessing import RobustScalerfrom sklearn.metrics import classes_reportfrom sklearn.pipeline import Pipelinefrom sklearn.model_selection import cross_val_predict

X = np.random.sample ((1000, 100))
Y = np.random.sample ((1000))> 0,5
svc_pipeline = конвейер ([('pca', PCA (n_components = 95)), ('svc', SVC ())])
predictions = cross_val_predict (svc_pipeline, X, Y, cv = 30, n_jobs = -1) print classification_report (Y, predictions)

Обратите внимание, что удаление шага PCA из конвейера решает проблему.

Больше информации:

scikit-learn == 0.18.2
scipy == 0.19.1
numpy == 1.12.1

-
Вы получили это, потому что прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-320885103 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAEz6-6Klhc67b5kZ17fFTxc8RfZQ_BWks5sWBkLgaJpZM4BkiD9
.

Когда я впервые столкнулся с этой проблемой, я использовал настраиваемую систему оценки, но, пытаясь максимально упростить пример кода, я обнаружил, что она не обязательно должна содержать настраиваемую систему оценки. По крайней мере, на моей машине. Импорт счетчика очков в моем случае тоже не помог. Во всяком случае, симптомы похожи. Сценарий зависает навсегда, и загрузка ЦП низкая.

@boazsh большое спасибо за фрагмент, хотя он не детерминирован, можете ли вы отредактировать его и использовать np.random.RandomState чтобы гарантировать, что случайные числа всегда одинаковы при каждом запуске.

Также существует обходной путь, если вы используете Python 3, предложенный, например, в https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment -187683383.

На данный момент у меня нет возможности протестировать это на OSX, но, возможно, я смогу попробовать в ближайшие дни.

Некоторая полезная информация (просто добавьте то, чего не хватает, в свой предыдущий комментарий https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-320885103):

import platform; print(platform.platform())
import sys; print("Python", sys.version)
import numpy; print("NumPy", numpy.__version__)
import scipy; print("SciPy", scipy.__version__)
import sklearn; print("Scikit-Learn", sklearn.__version__)

Также как вы установили scikit-learn, с pip, с conda, с одним из менеджеров пакетов OSX (brew и т. Д.)?

Обновлен фрагмент (используется np.random.seed)

Дарвин-16.6.0-x86_64-i386-64bit
('Python', '2.7.13 (по умолчанию, 4 апреля 2017 г., 08:47:57) \ n [Apple LLVM 8.1.0, совместимый с GCC 4.2.1 (clang-802.0.38)]')
('NumPy', '1.12.1')
('SciPy', '0,19.1')
('Scikit-Learn', '0.18.2')

Обновлен фрагмент (используется np.random.seed)

Отлично, большое спасибо!

Также как вы установили scikit-learn, с pip, с conda, с одним из менеджеров пакетов OSX (brew и т. Д.)?

Вы ответили на этот вопрос, я не могу найти вашего ответа ...

Простите, пропустил - пип.

FWIW, у меня нет проблем с запуском этого фрагмента с помощью:

платформа для импорта; печать (platform.platform ())
Дарвин-16.7.0-x86_64-i386-64bit
import sys; print ("Python", sys.version)
Python 2.7.12 | Continuum Analytics, Inc. | (по умолчанию, 2 июля 2016 г., 17:43:17)
[GCC 4.2.1 (на основе Apple Inc., сборка 5658) (LLVM, сборка 2336.11.00)]
import numpy; print ("NumPy", число .__ версия__)
NumPy 1.13.1
импортный scipy; print ("SciPy", scipy .__ version__)
SciPy 0.19.1
импортный склеарн; print ("Scikit-Learn", sklearn .__ version__)
Scikit-Learn 0.18.2

Не могли бы вы также указать verbose = 10 в cross_val_predict, чтобы мы могли
посмотреть, где это у вас ломается?

8 августа 2017 года в 22:59 boazsh [email protected] написал:

Простите, пропустил - пип.

-
Вы получили это, потому что прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-320948362 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AAEz67S64KIXUGvARGjvxBOw_4aCAdqhks5sWFu0gaJpZM4BkiD9
.

@jnothman Я предполагаю, что ваша среда conda использует MKL, а не Accelerate. Эта проблема зависания характерна для Accelerate и многопроцессорной обработки Python. http://scikit-learn.org/stable/faq.html#why -do-i-sometime-get-a-crash-freeze-with-n-jobs-1-under-osx-or-linux для получения дополнительной информации. .

pip, с другой стороны, будет использовать колеса, которые поставляются с Accelerate (на момент написания).

Чтобы избежать этой конкретной ошибки (кроме JOBLIB_START_METHOD), можно использовать MKL (например, через conda) или OpenBLAS (например, через канал conda-forge).

Ничего не печатается ...

screen shot 2017-08-08 at 16 43 35

@jnothman Я предполагаю, что ваша среда conda использует MKL, а не Accelerate.

@jnothman, если вы хотите воспроизвести проблему, IIRC, вы можете создать среду с Accelerate на OSX с чем-то вроде:

conda create -n test-env python=3 nomkl scikit-learn ipython

FWIW Я не могу воспроизвести проблему на моей виртуальной машине OS X. Я попытался имитировать как можно более близкие версии

Darwin-16.1.0-x86_64-i386-64bit
('Python', '2.7.13 |Continuum Analytics, Inc.| (default, Dec 20 2016, 23:05:08) \n[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]')
('NumPy', '1.12.1')
('SciPy', '0.19.1')
('Scikit-Learn', '0.18.2')

Хм, на самом деле я могу воспроизвести, но ваш фрагмент не был полным воспроизведением. Вот обновленный фрагмент:

import numpy as np
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn.preprocessing import RobustScaler
from sklearn.metrics import classification_report
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_predict

np.random.seed(1234)
X = np.random.sample((1000, 100))
Y = np.random.sample((1000)) > 0.5
svc_pipeline = Pipeline([('pca', PCA(n_components=95)), ('svc', SVC())])
PCA(n_components=95).fit(X, Y) # this line is required to reproduce the freeze
predictions = cross_val_predict(svc_pipeline, X, Y, cv=30, n_jobs=-1)
print(classification_report(Y, predictions))

В любом случае это известная проблема с Accelerate и многопроцессорностью Python. Существуют обходные пути, которые были перечислены в предыдущих сообщениях. Самый простой из них - это, вероятно, использовать conda и убедиться, что вы используете MKL, а не Accelerate.

В более долгосрочной перспективе (вероятно, scikit-learn 0.20) эта проблема будет универсально решена новым локальным сервером для joblib: https://github.com/scikit-learn/scikit-learn/issues/7650

Наличие исправления для многопроцессорности, зависящего от версии scikit-learn, является симптомом проблем с поставкой ....

Наличие исправления для многопроцессорности, зависящего от версии scikit-learn, является симптомом проблем с поставкой ....

Недавно я прочитал следующее, что мне показалось интересным:
https://lwn.net/Articles/730630/rss

У меня аналогичная проблема с RandomizedSearchCV; висит бесконечно. Я использую 3-летний MacBook Pro, 16 ГБ оперативной памяти и Core i7, а моя версия scikit-learn - 0,19.

Непонятно то, что он работал в прошлую пятницу !!! В понедельник утром я возвращаюсь и пытаюсь бежать, а он просто зависает. Из предыдущих запусков я знаю, что для завершения требуется около 60 минут, но я ждал намного дольше, и ничего не происходит, он просто зависает, нет сообщений об ошибках, ничего, и мой компьютер нагревается и высасывает энергию, как будто завтра не наступит. Код ниже. Я попытался изменить n_iter на 2 и n_jobs = 1 после прочтения некоторых комментариев, и это сработало. Так что это может иметь какое-то отношение к n_jobs = -1. Тем не менее, в прошлую пятницу этот код работал нормально! он просто ненавидит понедельники. Размер моего набора данных меньше 20 тыс. Примеров с размерностью <100 ..

from sklearn.metrics import make_scorer
from sklearn.cross_validation import cross_val_score
from sklearn.grid_search import RandomizedSearchCV
import sklearn_crfsuite

crf = sklearn_crfsuite.CRF(
    algorithm='lbfgs', 
    max_iterations=100, 
    all_possible_transitions=True
)
params_space = {
    'c1': scipy.stats.expon(scale=0.5),
    'c2': scipy.stats.expon(scale=0.05),
}

f1_scorer = make_scorer(metrics.flat_f1_score, 
                        average='weighted', labels=labels)
rs = RandomizedSearchCV(crf, params_space, 
                        cv=3, 
                        verbose=1, 
                        n_jobs=-1, 
                        n_iter=50, 
                        scoring=f1_scorer)

rs.fit(X_train, y_train)  # THIS IS WHERE IT FREEZES

что такое crf? просто чтобы исключить возможность, не могли бы вы попробовать использовать
return_train_score = Неверно?

Очень вероятно, что эта проблема @KaisJM связана с хорошо известным ограничением ускорения с многопроцессорной обработкой, см. Наш часто задаваемый вопрос .

Как вы установили scikit-learn?

Также для справки в будущем, можете ли вы вставить вывод:

import platform; print(platform.platform())
import sys; print("Python", sys.version)
import numpy; print("NumPy", numpy.__version__)
import scipy; print("SciPy", scipy.__version__)
import sklearn; print("Scikit-Learn", sklearn.__version__)

это работало в прошлую пятницу !! С тех пор я ничего не сделал. Я думаю, что scikit learn является частью anaconda, но я обновился с помощью pip (pip install --upgrade sklearn), но это было до того, как у меня возникла эта проблема .. Я нормально запустил код после обновления до 0.19.

вот результат печати выше:

Darwin-15.6.0-x86_64-i386-64bit
('Python', '2.7.12 |Continuum Analytics, Inc.| (default, Jul  2 2016, 17:43:17) \n[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)]')
('NumPy', '1.13.1')
('SciPy', '0.19.1')
('Scikit-Learn', '0.19.0')

@jnothman : я использую RandomizedSearchCV из sklearn.grid_search, у которого нет параметра return_train_score. Я знаю, что sklearn.grid_search является устаревшим. Я попробую вариант из sklearn.model_selection, но что-то подсказывает мне, что у меня будет такая же проблема). Обновлен исходный комментарий с дополнительной информацией и кодом.

Можете ли вы опубликовать вывод conda list | grep numpy . Я бы дико предположил, что, обновив scikit-learn с помощью pip, вы также обновили numpy с помощью pip, и у вас есть колеса numpy, которые используют Accelerate и имеют ограничение, упомянутое выше.

Небольшой совет:

  • опубликуйте полностью автономный фрагмент (для следующего выпуска). Это означает, что любой может скопировать и вставить его в сеанс IPython и легко попытаться воспроизвести. Это даст вам лучший шанс получить хорошую обратную связь.
  • если вы используете conda, придерживайтесь conda для управления пакетами, доступными через conda. Используйте pip только тогда, когда это необходимо.
  • Если вы настаиваете на том, что хотите использовать pip install --update , я настоятельно рекомендую вам использовать pip install --update --no-deps . В противном случае, если пакет зависит, скажем, от numpy, и у вас нет последней версии numpy, numpy будет обновлен с помощью pip, чего вы не хотите.

Ах да, кстати, sklearn.grid_search устарел, вы, вероятно, захотите использовать sklearn.model_selection в какой-то момент не слишком далеко в будущем.

Хороший совет, спасибо. Так есть ли обходной путь для понижения версии numpy? какое ограничение вы имеете в виду? ссылку на FAQ выше? Я прочитал это, но я этого не понимаю (я просто парень с алгоритмами :)).

вывод conda list | grep numpy

numpy 1.12.0
numpy 1.12.0 py27_0
numpy 1.13.1
numpydoc 0.7.0

Ничего себе установлено три numpy, я видел два раньше, но никогда не три ... в любом случае это похоже на проблему, о которой я упоминал, т.е. что вы смешали pip и conda, что является плохой идеей для данного пакета.

pip uninstall -y # maybe a few times to make sure you have removed pip installed packages
conda install numpy -f

Надеюсь, после этого у вас будет один numpy, который использует MKL.

На вашем месте я бы дважды проверил, что у вас нет такой же проблемы для других основных научных пакетов, например scipy и т. Д.

Причина, по которой я прибегаю к pip для некоторых пакетов, заключается в том, что conda не имеет некоторых пакетов, что на самом деле очень расстраивает, потому что я знаю, что смешивать pip с conda - плохая идея. В следующий раз, когда это произойдет, я воспользуюсь опцией --no-deps.

одна вещь, которую я должен был упомянуть, это то, что я установил Spyder в среде python, в которой работал. Однако я смог запустить код после установки Spyder как в Spyder, так и в Jupyter.

Я удалил Spyder и перечисленные выше numpys, переустановил bumpy с conda (который обновил scikit до 0.19) и по-прежнему получаю ту же ошибку. Что-то могло произойти из-за установки Spyder, но тогда почему он работал в течение дня, а затем внезапно останавливался?

ок, ничего не работает !! мне просто создать новую среду (используя conda) и переустановить все там? это решит проблему или сделает ее хуже?

Звучит, стоит попробовать!

создал новый env и установил все с помощью conda, по-прежнему зависает на неопределенный срок. только один экземпляр каждой упаковки и т. д.

n_jobs = 1 работает, но, конечно, занимает вечность (это работало и в предыдущем env). n_jobs = -1 - это то, что зависает на неопределенный срок.

conda list | grep numpy
numpy                     1.13.1           py27hd567e90_2


Darwin-15.6.0-x86_64-i386-64bit
('Python', '2.7.13 |Continuum Analytics, Inc.| (default, Dec 20 2016, 23:05:08) \n[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]')
('NumPy', '1.13.1')
('SciPy', '0.19.1')
('Scikit-Learn', '0.19.0')

Тогда я не знаю. Единственный способ, которым мы можем заняться - это опубликовать полностью автономный фрагмент кода, который мы можем просто скопировать и вставить в сеанс IPython и посмотреть, сможем ли мы воспроизвести проблему.

постараюсь создать минимальный пример, воспроизводящий проблему. Мне нужно сделать это для более эффективной отладки.

Я прочитал FAQ, на который вы ссылаетесь о "Accelerate" ... мне это не сильно помогло. Я понял, что вызов fork (), НЕ за которым следует вызов exec (), - это плохо. Я немного погуглил по этому поводу, и пока ничего даже не намекает на обходной путь. Не могли бы вы указать на дополнительную информацию, более подробно о том, в чем проблема? Благодарность,

Попробуйте этот фрагмент (взято из https://github.com/numpy/numpy/issues/4776):

import multiprocessing as mp

import numpy as np


def compute(n):
    print('Enter')
    np.dot(np.eye(n), np.eye(n))
    print('Exit')


print('\nWithout multiprocessing:')
compute(1000)

print('\nWith multiprocessing:')
workers = mp.Pool(1)
results = workers.map(compute, (1000, 1000))
  • Если это зависает (то есть не завершается в течение одной секунды), это означает, что вы используете Accelerate, и замораживание является известным ограничением многопроцессорной обработки Python. Временное решение - не использовать Accelerate. В OSX вы можете сделать это с помощью conda, которая по умолчанию использует MKL. Вы также можете использовать OpenBLAS с помощью conda-forge.
  • Если он не зависает, значит, вы не используете Accelerate, и нам потребуется отдельный фрагмент кода для расследования.

постараюсь воспроизвести с минимальным кодом.

Without multiprocessing:
Enter
Exit

With multiprocessing:
Enter
Exit
Enter
Exit

@GaelVaroquaux scikit-learn - это не приложение, а библиотека в богатой экосистеме. Если бы все делали то, что делаем мы, все рухнуло бы. Это довольно четкий сигнал, что нам нужно что-то менять. И есть много ситуаций, когда из этого комментария верно обратное.

Я использовал виртуальный экземпляр ubuntu в движке облачных вычислений Google (bumpy, spicy, scikit и т. Д. Были не самыми актуальными). Код работал нормально. Затем я установил Gensim. Это обновило numpy и scipy до последних версий и установило несколько других необходимых вещей (boto, bz2file и smart_open). После этого код зависает. Я надеюсь, что это дает полезную информацию о причинах зависания.

после установки Gensim
numpy (1.10.4) обновлен до numpy (1.13.3)
scipy (0.16.1) обновлен до scipy (0.19.1)

больше информации:
Проведя небольшое исследование, я обнаружил, что libblas, liblapack и liblapack_atlas отсутствуют в моем / usr / lib /, также я не видел каталог / usr / lib / atlas-base /. Я не знаю, были ли они там, и установка gensim удалила их, так как он обновил numpy и т.д., но это вероятно, поскольку код работал до установки gensim. Я установил их с помощью sudo apt-get --yes install libatlas-base-dev и "_update-alternatives_" в соответствии с расширенными инструкциями по установке scikit, но это не помогло, код по-прежнему зависает с n_jobs = -1.

Я думаю, проблема в том, что numpy использует OpenBlas. Переключим на АТЛАС и посмотрим, что будет.

>>> import numpy as np
>>> np.__config__.show()
lapack_opt_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
blas_opt_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
openblas_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
openblas_lapack_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
blas_mkl_info:
  NOT AVAILABLE

Все та же проблема. Следующее работает нормально, если я не вставлю n_jobs = -1.

from sklearn.metrics import fbeta_score

def f2_score(y_true, y_pred):
    y_true, y_pred, = np.array(y_true), np.array(y_pred)
    return fbeta_score(y_true, y_pred, beta=2, average='binary')

clf_rf = RandomForestClassifier()
grid_search = GridSearchCV(clf_rf, param_grid=param_grid, scoring=make_scorer(f2_score), cv=5)
grid_search.fit(X_train, y_train)  

@paulaceccon - ваши установки Numpy и Scipy используют ATLAS или OpenBLAS?

Сложно следить за тем, что вы сделали @KaisJM. С точки зрения сопровождающего, нам нужен полностью автономный фрагмент кода Python, чтобы посмотреть, сможем ли мы его воспроизвести. Если мы сможем воспроизвести, только тогда мы сможем исследовать и попытаться понять, что происходит. Если это произойдет только тогда, когда вы установите gensim и вам удастся последовательно воспроизвести это поведение, тогда нам потребуются полные инструкции, как создать среду Python, в которой есть проблема, по сравнению со средой Python, в которой проблемы нет.

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

согласно расширенным инструкциям по установке

@KaisJM , кстати, эта страница устарела, так как в настоящее время колеса доступны для Linux и содержат собственный OpenBLAS. Если вы установите выпущенный scikit-learn с помощью pip, вы будете использовать OpenBLAS.

@lesteve , вы говорите, что Openblas больше не зависает?

@lesteve paula опубликовала фрагмент с той же проблемой. Я вижу, что это не полный код, но я надеюсь, что он дает некоторую подсказку. Я могу сделать здесь фрагмент «завершенным» и опубликовать его для вас. Однако очевидно, что "устаревшая", как вы ее называете, страница инструкций, возможно, не так уж и устарела. Наибольшая вероятность состоит в том, что OpenBLAS вызывает те сборы, о которых они говорят на этой странице.

Эти инструкции устарели, поверьте мне. Если вы читаете подробности, там написано «но можно заморозить joblib / multiprocessing до OpenBLAS версии 0.2.8-4». Я проверил недавнее колесо numpy, и оно содержит OpenBLAS 0.2.8.18. Замораживание, о котором они говорят, находится в https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -334155175, которого у вас, похоже, нет.

Я вижу, что это не полный код, но я надеюсь, что он дает некоторую подсказку

Не на самом деле нет. У нас есть отчеты пользователей, которые, кажется, указывают на то, что зависание все еще может произойти, но ни один из них нам не удалось воспроизвести AFAIK. Это, кажется, указывает на то, что эта проблема возникает при очень специфической комбинации факторов. Если кто-то, у кого есть проблема, не потратит какое-то время и не поймет, как воспроизводить контролируемым образом, и нам не удастся воспроизвести, мы просто не сможем что-либо с этим поделать.

Я могу сделать здесь фрагмент "завершенным" и опубликовать для вас

Это было бы прекрасно. Было бы здорово, если бы вы могли проверить, вызывает ли такой фрагмент все еще зависание в отдельной среде conda (или virtualenv, в зависимости от того, что вы используете).

@lesteve @paulaceccon : Я взял отрывок кода Паулы и сделал полный

import platform; print(platform.platform())
import sys; print("Python", sys.version)
import numpy as np; print("NumPy", np.__version__)
import scipy; print("SciPy", scipy.__version__)
import sklearn; print("Scikit-Learn", sklearn.__version__)

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification

import scipy.stats
from sklearn.metrics import make_scorer
from sklearn.grid_search import RandomizedSearchCV
#from sklearn.model_selection import RandomizedSearchCV
#from sklearn.model_selection import GridSearchCV
from sklearn.metrics import fbeta_score

X, y = make_classification(n_samples=1000, n_features=4,
                           n_informative=2, n_redundant=0,
                           random_state=0, shuffle=False)

clf_rf = RandomForestClassifier(max_depth=2, random_state=0)

def f2_score(y_true, y_pred):
    y_true, y_pred, = np.array(y_true), np.array(y_pred)
    return fbeta_score(y_true, y_pred, beta=2, average='binary')

param_grid = {'max_depth':[2, 3, 4], 'random_state':[0, 3, 7, 17]}

grid_search = RandomizedSearchCV(clf_rf, param_grid, n_jobs=-1, scoring=make_scorer(f2_score), cv=5)

grid_search.fit(X, y)

@KaisJM Я думаю, что будет более полезно, если вы начнете со своего сценария замораживания и сумеете упростить и опубликовать полностью автономный, который зависает за вас.

@lesteve Согласен. Я создал новую среду python2, подобную той, которая была у меня до установки Gensim. Код работал нормально, НЕТ зависаний с n_jobs = -1. Более того, Numpy использует OpenBLAS и имеет ту же конфигурацию, что и среда, в которой наблюдается зависание (та, в которой был установлен Gensim). Похоже, что openblas не является причиной этого зависания.

bumpy.__config__.show()
lapack_opt_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
blas_opt_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
openblas_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
openblas_lapack_info:
    libraries = ['openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
blas_mkl_info:
  NOT AVAILABLE

@KaisJM Я запускаю здесь тот же фрагмент (окна), и он зависает.

from sklearn.datasets import make_classification
X, y = make_classification()

from sklearn.ensemble import RandomForestClassifier
clf_rf_params = {
    'n_estimators': [400, 600, 800],
    'min_samples_leaf' : [5, 10, 15],
    'min_samples_split' : [10, 15, 20],
    'criterion': ['gini', 'entropy'],
    'class_weight': [{0: 0.51891309,  1: 13.71835531}]
}

import numpy as np
def ginic(actual, pred):
    actual = np.asarray(actual) # In case, someone passes Series or list
    n = len(actual)
    a_s = actual[np.argsort(pred)]
    a_c = a_s.cumsum()
    giniSum = a_c.sum() / a_s.sum() - (n + 1) / 2.0
    return giniSum / n

def gini_normalizedc(a, p):
    if p.ndim == 2:  # Required for sklearn wrapper
        p = p[:,1]   # If proba array contains proba for both 0 and 1 classes, just pick class 1
    return ginic(a, p) / ginic(a, a)

from sklearn import metrics
gini_sklearn = metrics.make_scorer(gini_normalizedc, True, True)

from sklearn.model_selection import GridSearchCV

clf_rf = RandomForestClassifier()
grid = GridSearchCV(clf_rf, clf_rf_params, scoring=gini_sklearn, cv=3, verbose=1, n_jobs=-1)
grid.fit(X, y)

print (grid.best_params_)

Знаю, что это неудобно, но при запуске с _собственной_ метрикой не зависало.

У меня похожая проблема. Я запускал тот же код и просто хотел обновить модель новыми данными за месяц, и она перестала работать. Я считаю, что sklearn тем временем обновился до 0.19

Запуск GridSearchCV или RandomizedSearchCV в цикле и n_jobs> 1 будет молча зависать в Jupiter и IntelliJ:

for trial in tqdm(range(NUM_TRIALS)):
    ...
    gscv = GridSearchCV(estimator=estimator, param_grid=param_grid,
                          scoring=scoring, cv=cv, verbose=1, n_jobs=-1)
    gscv.fit(X_data, y_data)

    ...

Следуя рекомендации

Дарвин-16.6.0-x86_64-i386-64bit
Python 3.6.1 | Пользовательский интерфейс Anaconda (x86_64) | (по умолчанию, 11 мая 2017 г., 13:04:09)
[GCC 4.2.1, совместимый с Apple LLVM 6.0 (clang-600.0.57)]
NumPy 1.13.1
SciPy 0.19.1
Scikit-Learn 0.19.0

Список $ conda | grep numpy
неровный 0,2 пункта
numpy 1.13.1 py36_0
numpy 1.13.3 пункт
numpydoc 0.6.0 py36_0

$ pip удалить numpy

Список $ conda | grep numpy
неровный 0,2 пункта
numpy 1.13.1 py36_0
numpydoc 0.6.0 py36_0

$ conda install numpy -f // скорее всего ненужно

Список $ conda | grep numpy
неровный 0,2 пункта
numpy 1.13.1 py36_0
numpydoc 0.6.0 py36_0

Исправлена ​​моя проблема.

@paulaceccon ваша проблема связана с

https://stackoverflow.com/questions/36533134/cant-get-attribute-abc-on-module-main-from-abc-h-py
Если вы объявите пул до объявления функции, которую пытаетесь использовать параллельно, он выдаст эту ошибку. Измените порядок, и эта ошибка больше не будет.

Следующий код запустит ваш код:

import multiprocessing

if __name__ == '__main__':
    multiprocessing.set_start_method('spawn')

    from external import *

    from sklearn.datasets import make_classification
    X, y = make_classification()

    from sklearn.ensemble import RandomForestClassifier
    clf_rf_params = {
        'n_estimators': [400, 600, 800],
        'min_samples_leaf' : [5, 10, 15],
        'min_samples_split' : [10, 15, 20],
        'criterion': ['gini', 'entropy'],
        'class_weight': [{0: 0.51891309,  1: 13.71835531}]
    }

    from sklearn.model_selection import GridSearchCV

    clf_rf = RandomForestClassifier()
    grid = GridSearchCV(clf_rf, clf_rf_params, scoring=gini_sklearn, cv=3, verbose=1, n_jobs=-1)
    grid.fit(X, y)

    print (grid.best_params_)

с external.py

import numpy as np
def ginic(actual, pred):
    actual = np.asarray(actual) # In case, someone passes Series or list
    n = len(actual)
    a_s = actual[np.argsort(pred)]
    a_c = a_s.cumsum()
    giniSum = a_c.sum() / a_s.sum() - (n + 1) / 2.0
    return giniSum / n

def gini_normalizedc(a, p):
    if p.ndim == 2:  # Required for sklearn wrapper
        p = p[:,1]   # If proba array contains proba for both 0 and 1 classes, just pick class 1
    return ginic(a, p) / ginic(a, a)

from sklearn import metrics
gini_sklearn = metrics.make_scorer(gini_normalizedc, True, True)

Результаты на 8 ядрах

Подбираем по 3 складки для каждого из 54 кандидатов, всего 162 места
{'class_weight': {0: 0.51891309, 1: 13.71835531}, 'критерий': 'gini', 'min_samples_leaf': 10, 'min_samples_split': 20, 'n_estimators': 400}

Проблема все еще существует, ребята. Я использую настраиваемый счетчик, и он продолжает работать вечно, когда я устанавливаю n_jobs на что-нибудь. Когда я вообще не указываю n_jobs, он работает нормально, но в остальном зависает.

Можете ли вы предоставить отдельный фрагмент кода для воспроизведения проблемы? Пожалуйста, прочтите https://stackoverflow.com/help/mcve для получения более подробной информации.

По-прежнему сталкиваюсь с этой проблемой с тем же образцом кода.

Windows-10-10.0.15063-SP0
Python 3.6.4 | Пользовательская версия Anaconda (64-разрядная версия) | (по умолчанию, 16 января 2018 г., 10:22:32) [MSC v.1900, 64 бит (AMD64)]
NumPy 1.14.1
SciPy 1.0.0
Scikit-Learn 0.19.1

Можете ли вы предоставить отдельный фрагмент кода для воспроизведения проблемы? Пожалуйста, прочтите https://stackoverflow.com/help/mcve для получения более подробной информации.

Я подозреваю, что это та же старая проблема с многопроцессорностью в Windows. см. наш FAQ

Я протестировал код в https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -337985212 на thomberg1.

ОС: Windows 10 x64 10.0.16299.309
Пакет Python: WinPython-64bit-3.6.1
тупой (1.14.2)
scikit-learn (0.19.1)
scipy (1.0.0)

Он отлично работал в Jupyter Notebook и в командной строке.

Привет, у меня такая же проблема, поэтому я не хотел открывать новую, которая могла привести к почти идентичной теме.

-Macos
-Анаконда
-scikit-learn 0.19.1
-scipy 1.0.1
-numpy 1.14.2

# MLP for Pima Indians Dataset with grid search via sklearn
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import GridSearchCV
import numpy

# Function to create model, required for KerasClassifier
def create_model(optimizer='rmsprop', init='glorot_uniform'):
  # create model
  model = Sequential()
  model.add(Dense(12, input_dim=8, kernel_initializer=init, activation='relu'))
  model.add(Dense(8, kernel_initializer=init, activation='relu'))
  model.add(Dense(1, kernel_initializer=init, activation='sigmoid'))
  # Compile model
  model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
  return model

# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]


# create model
model = KerasClassifier(build_fn=create_model, verbose=0)
# grid search epochs, batch size and optimizer
optimizers = ['rmsprop', 'adam']
init = ['glorot_uniform', 'normal', 'uniform']
epochs = [50, 100, 150]
batches = [5, 10, 20]
param_grid = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, init=init)
grid = GridSearchCV(estimator=model, param_grid=param_grid)
grid_result = grid.fit(X, Y)
# summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
  print("%f (%f) with: %r" % (mean, stdev, param))

Код взят из учебника: https://machinelearningmastery.com/use-keras-deep-learning-models-scikit-learn-python/
Я попытался изменить параметр n_jobs на 1, -1, но ничего из этого не сработало. Намек?

он запускается, если я добавляю многопроцессорный импорт и оператор if, как показано ниже - я не работаю с keras, поэтому у меня нет большего понимания

import multiprocessing

if __name__ == '__main__':

    # MLP for Pima Indians Dataset with grid search via sklearn
    from keras.models import Sequential
    from keras.layers import Dense
    from keras.wrappers.scikit_learn import KerasClassifier
    from sklearn.model_selection import GridSearchCV
    import numpy

    # Function to create model, required for KerasClassifier
    def create_model(optimizer='rmsprop', init='glorot_uniform'):
      # create model
      model = Sequential()
      model.add(Dense(12, input_dim=8, kernel_initializer=init, activation='relu'))
      model.add(Dense(8, kernel_initializer=init, activation='relu'))
      model.add(Dense(1, kernel_initializer=init, activation='sigmoid'))
      # Compile model
      model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
      return model

    # fix random seed for reproducibility
    seed = 7
    numpy.random.seed(seed)
    # load pima indians dataset
    dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
    # split into input (X) and output (Y) variables
    X = dataset[:,0:8]
    Y = dataset[:,8]


    # create model
    model = KerasClassifier(build_fn=create_model, verbose=0)
    # grid search epochs, batch size and optimizer
    optimizers = ['rmsprop', 'adam']
    init = ['glorot_uniform', 'normal', 'uniform']
    epochs = [5]
    batches = [5, 10, 20]
    param_grid = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, init=init)
    grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=12, verbose=1)
    grid_result = grid.fit(X, Y)
    # summarize results
    print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
    means = grid_result.cv_results_['mean_test_score']
    stds = grid_result.cv_results_['std_test_score']
    params = grid_result.cv_results_['params']
    for mean, stdev, param in zip(means, stds, params):
      print("%f (%f) with: %r" % (mean, stdev, param))

Подбираем по 3 складки для каждого из 18 кандидатов, всего 54 места.

Лучшее: 0,675781 с использованием {'batch_size': 5, 'epochs': 5, 'init': 'glorot_uniform', 'optimizer': 'adam'}
0,621094 (0,036225) с: {'batch_size': 5, 'epochs': 5, 'init': 'glorot_uniform', 'optimizer': 'rmsprop'}
0,675781 (0,006379) с: {'batch_size': 5, 'epochs': 5, 'init': 'glorot_uniform', 'optimizer': 'adam'}
...
0,651042 (0,025780) с: {'batch_size': 20, 'epochs': 5, 'init': 'uniform', 'optimizer': 'adam'}


информация о версии при необходимости
sys 3.6.4 | Anaconda custom (64-разрядная версия) | (по умолчанию, 16 января 2018 г., 12:04:33)
[GCC 4.2.1 Compatible Clang 4.0.1 (теги / RELEASE_401 / final)]
numpy 1.14.2
панды 0.22.0
sklearn 0.19.1
фонарик 0.4.0a0 + 9692519
IPython 6.2.1
керас 2.1.5

компилятор: GCC 4.2.1 Compatible Clang 4.0.1 (теги / RELEASE_401 / final)
система: Дарвин
выпуск: 17.5.0
машина: x86_64
процессор: i386
Количество ядер процессора: 24
переводчик: 64бит

Спасибо @ thomberg1 , но добавив

import multiprocessing
if __name__ == '__main__':

не помогло. Проблема все та же

Та же проблема на моей машине при использовании настраиваемой функции оценки в GridsearchCV .
питон 3.6.4,
scikit-learn 0.19.1,
окна 10.,
Количество ядер процессора: 24

@byrony, можете ли вы предоставить код для воспроизведения? вы использовали if __name__ == "__main__" ?

Я несколько раз сталкивался с подобной проблемой на своей машине при использовании n_jobs=-1 или n_jobs=8 в качестве аргумента для GridsearchCV но с использованием аргумента счетчика по умолчанию.

  • Python 3.6.5,
  • scikit-learn 0.19.1,
  • Arch Linux,
  • Количество ядер процессора: 8.

Вот код, который я использовал:

from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import MinMaxScaler
from sklearn.decomposition import PCA
from sklearn.utils import shuffle
from sklearn.neural_network import MLPClassifier
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np


def main():

    df = pd.read_csv('../csvs/my_data.csv', nrows=4000000)    

    X = np.array(list(map(lambda a: np.fromstring(a[1:-1] , sep=','), df['X'])))
    y = np.array(list(map(lambda a: np.fromstring(a[1:-1] , sep=','), df['y'])))

    scalerX = MinMaxScaler()
    scalerY = MinMaxScaler()
    X = scalerX.fit_transform(X)
    y = scalerY.fit_transform(y)

    grid_params = {
        'beta_1': [ .1, .2, .3, .4, .5, .6, .7, .8, .9 ],
        'activation': ['identity', 'logistic', 'tanh', 'relu'],
        'learning_rate_init': [0.01, 0.001, 0.0001]
    }

    estimator = MLPClassifier(random_state=1, 
                              max_iter=1000, 
                              verbose=10,
                              early_stopping=True)

    gs = GridSearchCV(estimator, 
                      grid_params, 
                      cv=5,
                      verbose=10, 
                      return_train_score=True,
                      n_jobs=8)

    X, y = shuffle(X, y, random_state=0)

    y = y.astype(np.int16)    

    gs.fit(X, y.ravel())

    print("GridSearchCV Report \n\n")
    print("best_estimator_ {}".format(gs.best_estimator_))
    print("best_score_ {}".format(gs.best_score_))
    print("best_params_ {}".format(gs.best_params_))
    print("best_index_ {}".format(gs.best_index_))
    print("scorer_ {}".format(gs.scorer_))
    print("n_splits_ {}".format(gs.n_splits_))

    print("Exporting")
    results = pd.DataFrame(data=gs.cv_results_)
    results.to_csv('../csvs/gs_results.csv')


if __name__ == '__main__':
    main()

Я знаю, что это большой набор данных, поэтому я ожидал, что для получения результатов потребуется некоторое время, но затем через 2 дня он просто перестал работать (скрипт продолжает выполняться, но не использует никаких ресурсов, кроме ОЗУ и свопа).

captura de pantalla de 2018-05-25 17-53-11

captura de pantalla de 2018-05-25 17-54-59

Заранее спасибо!

@amueller Я не использовал if __name__ == "__main__" . Ниже мой код, он работает, только когда n_jobs=1

def neg_mape(true, pred):
    true, pred = np.array(true)+0.01, np.array(pred)
    return -1*np.mean(np.absolute((true - pred)/true))

xgb_test1 = XGBRegressor(
    #learning_rate =0.1,
    n_estimators=150,
    max_depth=3,
    min_child_weight=1,
    gamma=0,
    subsample=0.8,
    colsample_bytree=0.8,
    objective= 'reg:linear',
    nthread=4,
    scale_pos_weight=1,
    seed=123,
)

param_test1 = {
    'learning_rate':[0.01, 0.05, 0.1, 0.2, 0.3],
}

gsearch1 = GridSearchCV(estimator = xgb_test1, param_grid = param_test1, scoring=neg_mape, n_jobs=4, cv = 5)

Вы используете XGBoost. Я не знаю, чем они занимаются внутри, вполне возможно, что проблема в этом. Можете попробовать посмотреть, помогает ли добавление if __name__ ?
В противном случае я не думаю, что для этого есть решение.

@ Pazitos10 Можете ли вы воспроизвести с синтетическими данными и / или данными меньшего размера? Я не могу воспроизвести без ваших данных, и было бы хорошо воспроизвести в более короткие сроки.

@amueller Хорошо, я снова

@amueller , запуск скрипта с 50 тыс. строк работает

captura de pantalla de 2018-05-26 13-09-00

captura de pantalla de 2018-05-26 13-09-51

Проблема в том, что я не знаю, будут ли эти результаты лучшими для всего моего набора данных. Любой совет?

Похоже, у вас закончился баран. Возможно, вместо этого попробуйте использовать Keras, это, вероятно, лучшее решение для крупномасштабных нейронных сетей.

@amueller О, хорошо. Вместо этого я попробую использовать Керас. Еще раз спасибо!

Это не имеет ничего общего с кастомными бомбардировщиками. Это хорошо известная особенность многопроцессорной обработки Python в Windows: вам нужно запустить все, что использует n_jobs=-1 в блоке if __name__ == '__main__' иначе вы получите зависания / сбои. Может быть, нам стоит задокументировать это где-нибудь на видном месте, например, в README?

Возможно, это идея для scikit, что в случае Windows для изменения функции
И используйте очереди для подачи задач в набор рабочих процессов и сбора результатов.
Как описано здесь: https://docs.python.org/2/library/multiprocessing.html#windows
а для 3.6 здесь: https://docs.python.org/3.6/library/multiprocessing.html#windows

@PGTBoos это исправлено в scikit-learn 0.20.0

Была ли эта страница полезной?
0 / 5 - 0 рейтинги