Scikit-learn: 자체 스코어러가 정지된 GridSearchCV 병렬 실행

에 만든 2014년 02월 24일  ·  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")
                        )

이 스니펫은 메트릭이 sklearn.metrics 모듈을 참조하는 스코어링=metrics.make_scorer(metrics.scorer.f1_score, average="macro") 때문에 충돌합니다. score=... 행을 취소하면 병렬 실행이 작동합니다. f1 점수를 평가 방법으로 사용하려면 n_jobs = 1로 설정하여 병렬 실행을 취소해야 합니다.

병렬 실행 가능성을 잃지 않고 다른 점수 방법을 정의할 수 있는 방법이 있습니까?

감사 해요

가장 유용한 댓글

흠, 그것은 Windows의 다중 처리 문제와 관련이 있을 수 있습니다. @GaelVaroquaux 또는 @ogrisel 이 도움이 될 수 있습니다.
노트북이 __name__ == "__main__" 무엇을 만드는지 모르겠습니다.
메트릭을 노트북에서 정의하지 말고 별도의 파일로 정의하여 가져오십시오. 나는 그것이 그것을 고칠 것이라고 생각합니다.
이것은 실제로 GridSearchCV와 관련이 없지만 Windows 다중 처리, IPython 노트북 및 joblib 간의 흥미로운 상호 작용입니다.

모든 99 댓글

이것은 놀라운 일이므로 우리는 문제가 무엇인지 알아내고 제대로 작동하는지 확인해야 합니다!

좀 더 자세히 알려주실 수 있습니까?

  • "충돌"은 무엇을 의미합니까?
  • 이것은 scikit-learn의 어떤 버전입니까? 0.14라면 현재 개발 버전에서도 계속 발생하나요?
  • 다중 처리에는 플랫폼별 문제가 있습니다. 어떤 플랫폼에 있습니까? (예: import platform; platform.platform() )
  • 다른 데이터 세트에서 시도해 보셨습니까?

FWIW, 내 컴퓨터는 sklearn의 개발 버전에서 이 스니펫으로 홍채를 맞추는 데 문제가 없습니다.

빠른 답변 감사합니다.

충돌은 실제로 동결을 의미합니다. 더 이상 계속되지 않으며 Windows 작업 관리자의 python 프로세스에서 더 이상 모니터링할 활동도 없습니다. 프로세스는 여전히 존재하며 일정한 양의 RAM을 소비하지만 처리 시간이 필요하지 않습니다.

이것은 scikit-learn 버전 0.14이며, 마지막으로 업데이트되었으며 Enthought Canopy를 사용하여 실행됩니다.

저는 "Windows-7-6.1.7601-SP1" 플랫폼에 있습니다.

문제의 일반적인 예를 제공하여 더 깊이 들어갈 것입니다. for 루프에 배치되는 GridSearchCV와 관련이 있다고 생각합니다. (너무 많은 시간을 낭비하지 않으려면 코드 맨 아래에서 호출되고 for 루프에서 GridSearchCV()를 포함하는 메서드를 호출하는 run_tune_process() 메서드에서 시작해야 합니다.

암호:

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로 변경하거나 score= 인수를 정의하지 않은 경우에만 내 컴퓨터에서 작동합니다.

일반적으로 Windows의 다중 처리에는 많은 문제가 발생합니다. 하지만 나는
이것이 맞춤 측정항목과 상관관계가 있어야 하는 이유를 모르겠습니다. 거기
0.14의 평균=매크로 옵션에 대해서는 다음과 같아야 함을 시사하는 내용이 없습니다.
기본 평균(가중치)보다 중단될 가능성이 더 큽니다. 개발시
머리, 이것은 내 맥북에서는 11초, 버전 0.14에서는 7초 안에 완료됩니다.
(그것은 조사해야 할 일입니다!)

현재 개발 버전에서 이것을 시도해 볼 수 있습니까?
아직도 문제야?

2014년 2월 25일 20시 40분에 adverley [email protected] 은 다음과 같이 썼습니다.

빠른 답변 감사합니다.

충돌은 실제로 동결을 의미합니다. 더 이상 계속되지 않고
또한 파이썬 프로세스에서 더 이상 모니터링할 활동이 없습니다.
윈도우 작업관리자. 프로세스는 여전히 존재하며
일정한 양의 RAM을 사용하지만 처리 시간이 필요하지 않습니다.

이것은 scikit-learn 버전 0.14이며 Enthought를 사용하여 마지막으로 업데이트되고 실행됩니다.
천개.

저는 "Windows-7-6.1.7601-SP1" 플랫폼에 있습니다.

문제의 일반적인 예를 제공하여 더 깊이 들어갈 것입니다. NS
for 루프에 배치되는 GridSearchCV와 관련이 있다고 생각하십시오. (NS
시간을 너무 많이 낭비하지 마십시오.
코드 하단에서 호출되는 run_tune_process() 메서드
for 루프에서 GridSearchCV()를 포함하는 메서드를 호출합니다.
암호:

sklearn.metrics를 지표로 가져오기
sklearn.grid_search에서 GridSearchCV 가져오기
numpy를 np로 가져오기
수입 OS
sklearn 가져오기 데이터 세트에서
sklearn에서 svm을 sk로 가져오기

def tune_hyperparameters(trainingData, 기간):
allDataTrain = 교육 데이터

# 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:])

가지고 놀 데이터 가져오기

홍채 = 데이터 세트.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)
테스트 세트 = np.hstack((Y_test, X_test))

run_tune_process(tune_hyperparameters, trainingset, testset)

이 이메일에 직접 답장하거나 Gi tHubhttps://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -35990430에서 확인하세요.
.

( 부수적으로 @ogrisel , 더 많은 joblib가 있는 것 같습니다.
마스터의 병렬화 오버헤드 -- 적어도 OS X에서는 -- 거기에 없었습니다.
0.14에서...)

2014년 2월 25일 21:52, Joel Nothman [email protected]작성 :

일반적으로 Windows의 다중 처리에는 많은 문제가 발생합니다. 하지만 나는
이것이 맞춤 측정항목과 상관관계가 있어야 하는 이유를 모르겠습니다. 거기
0.14의 평균=매크로 옵션에 대해서는 다음과 같아야 함을 시사하는 내용이 없습니다.
기본 평균(가중치)보다 중단될 가능성이 더 큽니다. 개발시
머리, 이것은 내 맥북에서는 11초, 버전 0.14에서는 7초 안에 완료됩니다.
(그것은 조사해야 할 일입니다!)

현재 개발 버전에서 이것을 시도해 볼 수 있습니까?
아직도 문제야?

2014년 2월 25일 20시 40분에 adverley [email protected] 은 다음과 같이 썼습니다.

빠른 답변 감사합니다.

충돌은 실제로 동결을 의미합니다. 더 이상 계속되지 않고
또한 파이썬 프로세스에서 더 이상 모니터링할 활동이 없습니다.
윈도우 작업관리자. 프로세스는 여전히 존재하며
일정한 양의 RAM을 사용하지만 처리 시간이 필요하지 않습니다.

이것은 scikit-learn 버전 0.14이며 Enthought를 사용하여 마지막으로 업데이트되고 실행됩니다.
천개.

저는 "Windows-7-6.1.7601-SP1" 플랫폼에 있습니다.

문제의 일반적인 예를 제공하여 더 깊이 들어갈 것입니다.
for 루프에 배치되는 GridSearchCV와 관련이 있다고 생각합니다. (NS
시간을 너무 많이 낭비하지 마십시오.
코드 하단에서 호출되는 run_tune_process() 메서드
for 루프에서 GridSearchCV()를 포함하는 메서드를 호출합니다.
암호:

sklearn.metrics를 지표로 가져오기
sklearn.grid_search에서 GridSearchCV 가져오기
numpy를 np로 가져오기
수입 OS
sklearn 가져오기 데이터 세트에서
sklearn에서 svm을 sk로 가져오기

def tune_hyperparameters(trainingData, 기간):
allDataTrain = 교육 데이터

# 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:])

가지고 놀 데이터 가져오기

홍채 = 데이터 세트.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)
테스트 세트 = np.hstack((Y_test, X_test))

run_tune_process(tune_hyperparameters, trainingset, testset)

이 이메일에 직접 답장하거나 Gi tHubhttps://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -35990430에서 확인하세요.
.

이것은 커스텀 스코어러와 아무 관련이 없습니다. 이것은 Windows에서 Python 다중 처리의 잘 알려진 기능 입니다. if __name__ == '__main__' 블록에서 n_jobs=-1 를 사용하는 모든 것을 실행해야 합니다. 그렇지 않으면 정지/충돌이 발생합니다. 예를 들어 README와 같이 눈에 띄게 어딘가에 이것을 문서화해야 할까요?

if name ==에서 n_jobs= -1을 사용하는 모든 것을 실행해야 합니다.
' main ' 차단 또는 정지/충돌이 발생합니다.

글쎄, 좋은 소식은 요즘 joblib에서 의미있는 오류가 발생한다는 것입니다.
이러한 충돌에 대한 메시지가 아니라 포크 폭탄입니다.

@GaelVaroquaux 는 현재 scikit-learn에서 해당 오류 메시지를 표시합니까? 그렇다면 문제가 해결된 것으로 간주할 수 있습니다. IMHO.

@GaelVaroquaux 는 현재 scikit-learn에서 해당 오류 메시지를 표시합니까? 그렇다면,
문제는 수정된 것으로 간주할 수 있습니다. IMHO.

그것은해야합니다. 확인하는 유일한 방법은 확인하는 것입니다. 나는 이동 중이야
이제 Windows VM을 부팅하여 그렇게 할 수 없습니다.

나는 이것을 위해 Windows에 C 컴파일러를 설치하지 않을 것입니다. 죄송하지만 저는 Windows를 실제로 사용하지 않습니다. :)

나는 이것을 위해 Windows에 C 컴파일러를 설치하지 않을 것입니다. 미안하지만 나는
정말 Windows를하지 마십시오 :)

Windows VM이 있습니다. 확인할 수 있습니다. 찾는 문제일뿐
할 시간이 거의 없습니다.

@larsmans , 당신이 완전히 옳습니다. 커스텀 스코어러 개체는 제 실수였습니다. 문제는 실제로 Windows의 다중 처리에 있습니다. Linux에서 동일한 코드를 시도했는데 잘 실행됩니다.

충돌이 발생하지 않기 때문에 오류 메시지가 표시되지 않고 의미 있는 작업을 중지합니다.

@adverley Windows 상자에서 GitHub의 최신 버전을 사용해 볼 수 있습니까?

피드백 부족으로 인해 종료되며 최신 joblib에서 수정된 알려진 문제일 수 있습니다.

관련이 있는지 확실하지 않은 것 같습니다.

Windows에서 사용자 정의 스코어러는 여전히 멈춥니다. Google에서 이 스레드를 발견했습니다 - 스코어러를 제거하고 그리드 검색이 작동합니다.

정지되면 오류 메시지가 표시되지 않습니다. 3개의 python 프로세스도 생성되었습니다(n_jobs=3으로 설정했기 때문에). 그러나 CPU 사용률은 모든 Python 프로세스에 대해 0으로 유지됩니다. 저는 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 코드에 응답하지 않습니다.

속성 오류를 수정하면 작동합니다.
IPython 노트북에서 pylab 가져오기를 수행합니까? 그렇지 않으면 모든 것이 동일해야 합니다.

글쎄요 AttributeError의 원인이 무엇인지 모르겠습니다... joblibs와 관련이 있을 가능성이 가장 높지만 n_jobs가 1보다 큰 경우에만 발생하기 때문에 n_jobs=1 와 함께 잘 실행됩니다.

오류는 __main__ 에서 score_model 누락된 속성에 대해 설명합니다. IPython Notebook에 if __name__ == '__main__' 가 있는지 여부에 관계없이 이 오류가 발생합니다.

(위에 오류 줄이 잘못 붙여진 것을 깨달았습니다 - 위의 게시물에서 수정했습니다.)

나는 pylab을 사용하지 않습니다.

전체 확장 오류 메시지는 다음과 같습니다. http://pastebin.com/23y5uHT2

흠, 그것은 Windows의 다중 처리 문제와 관련이 있을 수 있습니다. @GaelVaroquaux 또는 @ogrisel 이 도움이 될 수 있습니다.
노트북이 __name__ == "__main__" 무엇을 만드는지 모르겠습니다.
메트릭을 노트북에서 정의하지 말고 별도의 파일로 정의하여 가져오십시오. 나는 그것이 그것을 고칠 것이라고 생각합니다.
이것은 실제로 GridSearchCV와 관련이 없지만 Windows 다중 처리, IPython 노트북 및 joblib 간의 흥미로운 상호 작용입니다.

얘들 아 ... 스레드 주셔서 감사합니다. 어쨌든 나는 전에 이 스레드를 확인했어야 했는데, 이것에 5시간의 시간을 낭비했습니다. 병렬 처리로 실행하려고 합니다. 정말 감사합니다 :)
피드백을 추가하려면: 여전히 멈춥니다. 내 자신의 make_Score 비용 함수가 있을 때 동일한 문제에 직면했습니다. 시스템이 정지되기 시작합니다. 사용자 정의 비용 함수를 사용하지 않을 때 병렬 처리에서 이러한 정지에 직면하지 않았습니다.

이 5시간을 프로젝트에 유용한 것으로 바꾸는 가장 좋은 방법은 문제를 재현하는 독립 실행형 예제를 제공하는 것입니다.

중첩 교차 유효성 검사 및 n_jobs=-1 내에서 사용자 지정 스코어러를 사용하려고 시도하는 Jupyter 노트북에서 작동하는 Windows 10에서 동일한 문제가 발생했습니다. AttributeError: Can't get attribute 'custom_scorer' on <module '__main__' (built-in)>; 메시지를 받았습니다.
@amueller가 제안한 것처럼 노트북에서 정의하는 대신 사용자 정의 스코어러를 가져오는 것이 작동합니다.

OSX 10.10.5에서 똑같은 문제가 있습니다.

여기도 마찬가지입니다.
OSX 10.12.5

재현 가능한 코드 조각을 제공하십시오. 우리는 이 문제를 해결하고 싶습니다. 데이터를 포함하여 문제를 보여주는 코드 없이는 이해하기 어렵습니다.

파이썬 셸에서 이 줄을 실행하기만 하면 됩니다.

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(기본값, 2017년 4월 4일, 08:47:57) \n[GCC 4.2.1 호환 Apple LLVM 8.1.0(clang-802.0.38)]')
('넘파이', '1.12.1')
('사이파이', '0.19.1')
('사이킷런', '0.18.2')

사용자 지정 득점 도구를 사용하지 않으므로
별도의 문제?

2017년 8월 8일 오후 6시 15분에 "boazsh" [email protected] 작성했습니다.

파이썬 셸에서 이 줄을 실행하기만 하면 됩니다.

sklearn.decomposition에서 PCA 가져오기 sklearn.svm에서 가져오기 SVC에서 가져오기 sklearn.preprocessing에서 가져오기 RobustScaler에서 sklearn.metrics 가져오기 classification_report에서 sklearn.pipeline 가져오기

X = np.random.sample((1000, 100))
Y = np.random.sample((1000)) > 0.5
svc_pipeline = 파이프라인([('pca', PCA(n_components=95)), ('svc', SVC())])
예측 = cross_val_predict(svc_pipeline, X, Y, cv=30, n_jobs=-1)print classification_report(Y, 예측)

파이프라인에서 PCA 단계를 제거하면 문제가 해결됩니다.

더 많은 정보:

사이킷런==0.18.2
사이피==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
.

처음 이 문제에 직면했을 때 커스텀 스코어러를 사용하고 있었지만 가능한 한 예제 코드를 단순화하려고 시도하는 동안 커스텀 스코어러가 반드시 포함될 필요는 없다는 것을 알게 되었습니다. 적어도 내 컴퓨터에서는. 득점원을 가져오는 것도 제 경우에는 도움이 되지 않았습니다. 어쨌든 증상은 비슷해 보입니다. 스크립트가 영원히 중단되고 CPU 사용률이 낮습니다.

@boazsh 는 스 니펫에 대해 많은 감사를드립니다. 그러나 결정적이지는 않습니다. 편집하고 np.random.RandomState 를 사용하여 각 실행에서 난수가 항상 동일한지 확인할 수 있습니다.

또한 예를 들어 https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment -187683383에서 제안된 Python 3을 사용하는 경우 해결 방법이 있습니다.

지금은 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__)

또한 OSX 패키지 관리자(brew 등 ...) 중 하나와 함께 pip, conda와 함께 scikit-learn을 어떻게 설치했습니까?

스니펫 업데이트(np.random.seed 사용)

다윈-16.6.0-x86_64-i386-64bit
('Python', '2.7.13(기본값, 2017년 4월 4일, 08:47:57) \n[GCC 4.2.1 호환 Apple LLVM 8.1.0(clang-802.0.38)]')
('넘파이', '1.12.1')
('사이파이', '0.19.1')
('사이킷런', '0.18.2')

스니펫 업데이트(np.random.seed 사용)

대단히 감사합니다!

또한 OSX 패키지 관리자(brew 등 ...) 중 하나와 함께 pip, conda와 함께 scikit-learn을 어떻게 설치했습니까?

이 질문에 답을 하셨습니까? 답변을 찾을 수 없습니다 ...

죄송합니다, 놓쳤습니다 - 핍.

FWIW, 다음과 함께 해당 스니펫을 실행하는 데 문제가 없습니다.

수입 플랫폼; 인쇄(플랫폼.플랫폼())
다윈-16.7.0-x86_64-i386-64bit
수입 시스템; print("파이썬", sys.version)
Python 2.7.12 |Continuum Analytics, Inc.| (기본값, 2016년 7월 2일, 17:43:17)
[GCC 4.2.1(Apple Inc. 빌드 5658 기반)(LLVM 빌드 2336.11.00)]
수입 numpy; print("넘파이", numpy.__버전__)
넘파이 1.13.1
수입 scipy; print("SciPy", scipy.__version__)
사이파이 0.19.1
수입 sklearn; print("사이킷 학습", sklearn.__version__)
사이킷런 0.18.2

cross_val_predict에 verbose=10을 넣어 우리가 아마도
당신을 위해 깨진 곳을 참조하십시오?

2017년 8월 8일 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 환경이 Accelerate가 아닌 MKL을 사용한다고 추측하고 있습니다. 이 정지 문제는 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 환경이 Accelerate가 아닌 MKL을 사용한다고 추측하고 있습니다.

@jnothman 문제를 재현하려는 경우 IIRC에서 다음과 같이 OSX에서 Accelerate를 사용하여 환경을 만들 수 있습니다.

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

FWIW 내 OS X VM에서 문제를 재현할 수 없습니다. 가능한 한 @boazsh 버전을 모방하려고 했습니다.

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를 사용하고 Accelerate가 아닌 MKL을 사용하는 것입니다.

장기적으로(아마도 scikit-learn 0.20) 이 문제는 joblib의 새로운 loky 백엔드에 의해 보편적으로 해결될 것입니다. https://github.com/scikit-learn/scikit-learn/issues/7650

다중 처리에 대한 수정 사항이 scikit-learn 버전에 종속되는 것은 공급업체 문제의 징후입니다....

다중 처리에 대한 수정 사항이 scikit-learn 버전에 종속되는 것은 공급업체 문제의 징후입니다....

나는 최근에 다음을 읽었는데 흥미롭게 느껴졌습니다.
https://lwn.net/Articles/730630/rss

RandomizedSearchCV와 비슷한 문제가 있습니다. 그것은 무기한 중단됩니다. 저는 3년 된 맥북 프로, 16GB 램 및 코어 i7을 사용하고 있으며 제 scikit-learn 버전은 0.19입니다.

수수께끼 같은 부분은 그것이 지난 금요일에 작동했다는 것입니다!!! 월요일 아침에 돌아가서 달리려고 하면 그냥 멈춥니다. 이전 실행에서 완료하는 데 약 60분이 걸린다는 것을 알고 있지만 그보다 훨씬 더 오래 기다렸고 아무 일도 일어나지 않았습니다. 그냥 멈추고 오류 메시지도 없고 아무 것도 없고 컴퓨터가 뜨거워지고 내일이 없는 것처럼 전력이 소모됩니다. 아래 코드. 여기에서 몇 가지 의견을 읽은 후 n_iter를 2 및 n_jobs=1로 변경하려고 시도했는데 효과가 있었습니다. 따라서 n_jobs=-1과 관련이 있을 수 있습니다. 그래도 이 코드는 지난 금요일에 잘 작동했습니다! 월요일을 싫어할 뿐입니다. 내 데이터 세트 크기는 차원이 100 미만인 20,000개 미만의 예입니다.

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 의 문제는 Accelerate with multiprocessing에 대한 잘 알려진 제한 때문일 가능성이 매우 큽니다. FAQ를 참조하세요.

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은 aaconda의 일부라고 생각하지만 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 : return_train_score 매개변수가 없는 sklearn.grid_search의 RandomizedSearchCV를 사용하고 있습니다. 나는 sklearn.grid_search가 더 이상 사용되지 않는다는 것을 알고 있습니다. sklearn.model_selection에서 하나를 시도할 것이지만, 동일한 정확한 문제가 발생할 것이라고 알려줍니다. 추가 정보 및 코드로 원래 주석을 업데이트했습니다.

conda list | grep numpy 의 출력을 게시할 수 있습니까? scikit-learn을 pip로 업데이트하면 numpy도 pip로 업데이트했으며 Accelerate를 사용하고 위에서 언급한 제한 사항이 있는 numpy 바퀴가 있다고 생각합니다.

작은 조언:

  • (다음 호를 위해) 완전히 독립된 스니펫을 게시하세요. 즉, 누구나 IPython 세션에서 복사하여 붙여넣고 쉽게 재현을 시도할 수 있습니다. 이것은 좋은 피드백을 얻을 수 있는 가장 좋은 기회를 줄 것입니다.
  • conda를 사용하는 경우 conda를 통해 사용 가능한 패키지를 관리하려면 conda를 고수하십시오. 필요한 경우에만 pip를 사용하십시오.
  • pip install --update 를 사용하고 싶다면 pip install --update --no-deps 를 사용하는 것이 좋습니다. 그렇지 않으면 패키지가 numpy에 종속되고 최신 numpy가 없는 경우 numpy는 원하지 않는 pip로 업그레이드됩니다.

아, 그리고 BTW, 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

그 후에 MKL을 사용하는 단일 numpy가 있기를 바랍니다.

내가 당신이라면 scipy 등과 같은 다른 핵심 과학 패키지에 대해 동일한 문제가 없는지 다시 확인하겠습니다 ...

내가 일부 패키지에 대해 pip에 의존하는 이유는 conda에 일부 패키지가 없기 때문입니다. pip와 conda를 혼합하는 것이 나쁜 생각이라는 것을 알기 때문에 실제로는 매우 실망스럽습니다. 다음에 이런 일이 발생하면 --no-deps 옵션을 사용하겠습니다.

언급해야 할 한 가지는 내가 작업하고 있던 python 환경에 Spyder를 설치했다는 것입니다. 그러나 Spyder를 설치한 후 Spyder와 Jupyter 모두에서 코드를 실행할 수 있었습니다.

위의 Spyder와 numpys를 제거하고 conda(scikit을 0.19로 업데이트함)로 울퉁불퉁한 것을 다시 설치했지만 여전히 동일한 오류가 발생합니다. Spyder 설치로 인해 문제가 발생했을 수 있지만 왜 하루 동안 작동했다가 갑자기 중지됩니까?

좋아, 아무것도 작동하지 않는다!! 새 환경(conda 사용)을 만들고 거기에 모든 것을 다시 설치해야 합니까? 그것이 해결될 것인가 아니면 악화될 것인가?

시도해 볼 가치가 있습니다!

새 환경을 만들고 conda로 모든 것을 설치했지만 여전히 무기한 멈춥니다. 각 패키지 등의 사본 하나만

n_jobs=1 작동하지만 물론 영원히 걸립니다(이전 환경에서도 작동함). 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 항목을 읽었습니다. 별로 도움이 되지 않습니다. 내가 가져온 것은 fork() NOT 다음에 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))
  • 이것이 멈추면(즉, 1초 이내에 완료되지 않으면) Accelerate를 사용하고 있고 정지는 Python 다중 처리의 알려진 제한 사항입니다. 해결 방법은 Accelerate를 사용하지 않는 것입니다. OSX에서는 기본적으로 MKL을 사용하는 conda로 이를 수행할 수 있습니다. conda-forge를 사용하여 OpenBLAS를 사용할 수도 있습니다.
  • 고정되지 않으면 Accelerate를 사용하지 않는 것이며 조사를 위해 독립 실행형 스니펫이 필요합니다.

최소한의 코드로 재현을 시도합니다.

Without multiprocessing:
Enter
Exit

With multiprocessing:
Enter
Exit
Enter
Exit

@GaelVaroquaux scikit-learn은 앱이 아니라 풍부한 생태계의 라이브러리입니다. 모두가 우리가 하는 대로 하면 모든 것이 무너질 것입니다. 이는 우리가 변화해야 한다는 아주 분명한 신호입니다. 그리고 그 의견과 반대되는 환경이 많이 있습니다.

Google 클라우드 컴퓨팅 엔진에서 우분투 가상 인스턴스를 사용했습니다(범피, 스파이시, scikit 등은 최신 버전이 아님). 코드가 잘 실행되었습니다. 그런 다음 Gensim을 설치했습니다. 이것은 numpy 및 scipy를 최신 버전으로 업데이트하고 필요한 몇 가지 다른 항목(boto, bz2file 및 smart_open)을 설치했습니다. 그 후 코드가 멈춥니다. 이것이 이 정지의 원인에 대한 유용한 단서를 제공하기를 바랍니다.

젠심 설치 후
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을 설치하기 전에 코드가 작동했기 때문일 수 있습니다. 고급 scikit 설치 지침 에 따라 sudo apt-get --yes install libatlas-base-dev 및 "_update-alternatives_"를 사용하여 설치 했지만 도움이 되지 않았고 코드는 여전히 n_jobs=-1로 고정됩니다.

문제는 numpy가 OpenBlas를 사용하고 있다는 것입니다. ATLAS로 전환하고 무슨 일이 일어나는지 볼 것입니다.

>>> 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 은 ATLAS 또는 OpenBLAS를 사용하는 Numpy 및 Scipy 설치입니까?

@KaisJM이 한 일을 따라하기가 조금 어렵습니다. 메인테이너의 관점에서 우리에게 필요한 것은 우리가 재현할 수 있는지 확인하기 위한 완전히 독립된 파이썬 스니펫입니다. 재현할 수 있는 경우에만 조사하고 무슨 일이 일어나고 있는지 이해하려고 할 수 있습니다. gensim을 설치하고 이 동작을 일관되게 재현할 때만 그런 일이 발생한다면 문제가 있는 Python 환경과 문제가 없는 Python 환경을 만드는 방법에 대한 전체 지침이 필요합니다.

이를 위해서는 무시할 수 없는 양의 시간과 노력이 필요합니다. 전적으로 동의합니다. 하지만 그것 없이는 귀하가 직면한 문제를 조사하기 위해 우리가 할 수 있는 일이 많지 않습니다.

고급 설치 지침에 따라

@KaisJM 그건 그렇고, 요즘 휠은 Linux에서 사용할 수 있고 자체 OpenBLAS가 포함되어 있기 때문에 이 페이지는 구식입니다. 릴리스된 scikit-learn을 pip로 설치하면 OpenBLAS를 사용하게 됩니다.

@leste Openblas 가 더 이상 정지를 일으키지 않는다는 말씀이신가요?

@lesteve paula 도 같은 문제가 있는 스니펫을 게시했습니다. 완전한 코드는 아니지만 약간의 단서를 제공하기를 바랍니다. 여기에서 스니펫을 "완료"하고 게시할 수 있습니다. 그러나 "오래된" 지침 페이지가 그렇게 오래되지 않았을 수 있다는 것은 분명합니다. 가장 높은 가능성은 OpenBLAS가 해당 페이지에서 말하는 수수료를 유발하고 있다는 것입니다.

이 지침은 구식입니다. 자세히 읽어보면 "하지만 OpenBLAS 버전 0.2.8-4 이전에는 joblib/multiprocessing을 중지할 수 있음"이라고 나와 있습니다. 최근 numpy 휠을 확인했으며 OpenBLAS 0.2.8.18이 포함되어 있습니다. 그들이 언급하고 있는 동결은 https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -334155175에 있는 것인데, 당신이 가지고 있지 않은 것 같습니다.

완전한 코드가 아니라는 것을 알 수 있지만 약간의 단서를 제공하기를 바랍니다.

정말 아닙니다. 정지가 여전히 발생할 수 있음을 나타내는 것으로 보이는 사용자에 대한 보고서가 있으며 그 중 AFAIK를 재현할 수는 없습니다. 이는 이 문제가 매우 특정한 요소 조합에서 발생함을 나타내는 것 같습니다. 문제가 있는 사람이 시간을 들여 통제된 방식으로 번식하는 방법을 알아내고 우리가 번식에 성공하지 않는 한 우리가 그것에 대해 아무 것도 할 수 없습니다.

여기에서 스니펫을 "완료"하고 게시할 수 있습니다.

정말 좋을 것입니다. 그러한 스니펫이 여전히 별도의 conda 환경(또는 사용하는 것에 따라 virtualenv)에서 정지를 일으키는지 확인할 수 있다면 좋을 것입니다.

@lesteve @paulaceccon : 저는 Paula의 발췌 코드를 가져와서 실행 가능한 완전한 코드 조각을 만들었습니다. Jupyter 셀에 붙여넣고 실행하기만 하면 됩니다. Paula: 이 스니펫을 고정할 수 없습니다. n_jobs=-1이고 정상적으로 실행됩니다. 보고 정지된 버전을 게시할 수 있다면 좋을 것입니다. grid_search 모듈과 model_selection 모듈 사이를 전환할 수 있습니다. 둘 다 잘 실행되었습니다.

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 동의했습니다. Gensim을 설치하기 전과 같은 새로운 python2 환경을 만들었습니다. 코드가 제대로 실행되었으며 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 여기(Windows)에서 동일한 스니펫을 실행하고 있는데 멈춥니다.

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_)

어색하지만 _custom_ 메트릭으로 실행할 때 고정되지 않았음을 알고 있습니다.

비슷한 문제가 있습니다. 동일한 코드를 실행하고 있으며 단순히 새로운 월 데이터로 모델을 업데이트하고 싶었지만 실행이 중지되었습니다. 나는 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)

    ...

@lesteve 권장 사항을

다윈-16.6.0-x86_64-i386-64bit
Python 3.6.1 |아나콘다 사용자 지정(x86_64)| (기본값, 2017년 5월 11일, 13:04:09)
[GCC 4.2.1 호환 Apple LLVM 6.0(clang-600.0.57)]
넘파이 1.13.1
사이파이 0.19.1
사이킷런 0.19.0

$conda 목록 | 그렙 numpy
그넘피 0.2핍
numpy 1.13.1 py36_0
numpy 1.13.3 핍
numpydoc 0.6.0 py36_0

$pip 제거 numpy

$conda 목록 | 그렙 numpy
그넘피 0.2핍
numpy 1.13.1 py36_0
numpydoc 0.6.0 py36_0

$conda install numpy -f // 불필요할 가능성이 높음

$conda 목록 | 그렙 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코어에서 실행한 결과

54명의 후보자 각각에 대해 3개의 접기를 피팅하여 총 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비트)| (기본값, 2018년 1월 16일, 10:22:32) [MSC v.1900 64비트(AMD64)]
넘파이 1.14.1
사이파이 1.0.0
사이킷런 0.19.1

문제를 재현하기 위해 독립 실행형 스니펫을 제공할 수 있습니까? 자세한 내용은 https://stackoverflow.com/help/mcve 를 참조하십시오.

나는 이것이 Windows 문제에서 동일한 오래된 다중 처리라고 생각합니다. FAQ 참조

thomberg1의 https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -337985212에서 코드를 테스트했습니다.

운영 체제: Windows 10 x64 10.0.16299.309
파이썬 패키지: WinPython-64bit-3.6.1
numpy (1.14.2)
사이킷런(0.19.1)
사이피 (1.0.0)

Jupyter Notebook 및 명령줄에서 제대로 작동했습니다.

안녕하세요, 저는 같은 문제가 있어서 거의 동일한 스레드로 이어질 수 있는 새 항목을 열고 싶지 않았습니다.

-맥 OS
-아나콘다
-scikit-learn 0.19.1
- 사이피 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))

18명의 후보자 각각에 대해 3번 접기, 총 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 |아나콘다 커스텀(64비트)| (기본값, 2018년 1월 16일, 12:04:33)
[GCC 4.2.1 호환되는 Clang 4.0.1(태그/RELEASE_401/최종)]
numpy 1.14.2
팬더 0.22.0
스켈런 0.19.1
토치 0.4.0a0+9692519
아이파이썬 6.2.1
케라스 2.1.5

컴파일러 : GCC 4.2.1 호환 Clang 4.0.1 (tags/RELEASE_401/final)
시스템 : 다윈
릴리스 : 17.5.0
기계 : x86_64
프로세서 : i386
CPU 코어: 24
인터프리터: 64비트

@thomberg1 에게 감사하지만 추가합니다.

import multiprocessing
if __name__ == '__main__':

도움이되지 않았습니다. 문제는 여전히 동일합니다

GridsearchCV 에서 사용자 정의 채점 기능을 사용할 때 내 컴퓨터에서 동일한 문제가 발생합니다.
파이썬 3.6.4,
사이킷런 0.19.1,
윈도우 10.,
CPU 코어: 24

@byrony 재현할 코드를 제공할 수 있습니까? if __name__ == "__main__" 하셨습니까?

사용할 때 내 컴퓨터에 비슷한 문제가 여러 번 경험했던 n_jobs=-1 또는 n_jobs=8 위한 인수로 GridsearchCV 하지만 기본 득점 인수를 사용하여.

  • 파이썬 3.6.5,
  • 사이킷런 0.19.1,
  • 아치 리눅스,
  • CPU 코어: 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일 실행 후 작동이 중지되었습니다(스크립트는 계속 실행되지만 RAM 및 스왑 외에는 리소스를 사용하지 않음).

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 좋아, 500k 행으로 다시 실행하고 결과를 게시하겠습니다. 감사 해요!

@amueller , 50k 행으로 스크립트를 실행하면 예상대로 작동합니다. 스크립트는 올바르게 종료되어 다음과 같은 결과를 보여줍니다(죄송합니다. 500k가 아니라 50k를 의미했습니다).

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

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

문제는 이러한 결과가 전체 데이터 세트에 가장 적합한지 여부를 알 수 없다는 것입니다. 어떤 충고?

램이 부족하신듯 합니다. 대신 Keras를 사용해 보십시오. 대규모 신경망에 더 나은 솔루션일 수 있습니다.

@amueller 아,

이것은 커스텀 스코어러와 아무 관련이 없습니다. 이것은 Windows에서 Python 다중 처리의 잘 알려진 기능 입니다. if __name__ == '__main__' 블록에서 n_jobs=-1 를 사용하는 모든 것을 실행해야 합니다. 그렇지 않으면 정지/충돌이 발생합니다. 예를 들어 README와 같이 눈에 띄게 어딘가에 이것을 문서화해야 할까요?

Windows의 경우 기능을 변경하는 것이 scikit에 대한 아이디어입니까?
대기열을 사용하여 작업자 프로세스 모음에 작업을 제공하고 결과를 수집합니다.
여기에 설명된 대로 : 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 등급