Scikit-learn: GridSearchCV parallele Ausführung mit eigenem Scorer friert ein

Erstellt am 24. Feb. 2014  ·  99Kommentare  ·  Quelle: scikit-learn/scikit-learn

Ich habe Stunden nach diesem Problem gesucht und kann es konsequent replizieren:

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

Dieses Snippet stürzt aufgrund von score=metrics.make_scorer(metrics.scorer.f1_score, Average="macro") ab, wobei sich metrics auf das sklearn.metrics-Modul bezieht. Wenn ich die Zeile score=... lösche, funktioniert die parallele Ausführung. Wenn ich den f1-Score als Bewertungsmethode verwenden möchte, muss ich die parallele Ausführung durch Setzen von n_jobs = 1 aufheben.

Gibt es eine Möglichkeit, eine andere Bewertungsmethode zu definieren, ohne die Möglichkeit der parallelen Ausführung zu verlieren?

Vielen Dank

Hilfreichster Kommentar

Hum, das hängt wahrscheinlich mit Problemen der Multiprocessing unter Windows zusammen. Vielleicht können @GaelVaroquaux oder @ogrisel helfen.
Ich weiß nicht, was das Notizbuch aus dem __name__ == "__main__" .
Versuchen Sie, die Metrik nicht im Notebook zu definieren, sondern in einer separaten Datei und importieren Sie sie. Ich würde denken, das würde es beheben.
Dies hat nicht wirklich etwas mit GridSearchCV zu tun, aber einige interessante Interaktionen zwischen Windows Multiprocessing, IPython Notebook und Joblib.

Alle 99 Kommentare

Das ist überraschend, also müssen wir das Problem herausfinden und sicherstellen, dass es funktioniert!

Kannst du bitte etwas genauer angeben:

  • Was meinst du mit "Abstürze"?
  • Welche Version von scikit-learn ist das? Wenn es 0,14 ist, passiert es dann noch in der aktuellen Entwicklungsversion?
  • Multiprocessing hat plattformspezifische Probleme. Auf welcher Plattform bist du? (zB import platform; platform.platform() )
  • Hast du es mit verschiedenen Datensätzen probiert?

FWIW, meine Maschine hat kein Problem damit, die Iris mit diesem Snippet in der Entwicklungsversion von sklearn anzupassen.

Danke für deine schnelle Antwort.

Mit Absturz meine ich eigentlich einfrieren. Es wird nicht mehr fortgesetzt und es gibt auch keine Aktivität mehr, die im Python-Prozess des Task-Managers von Windows überwacht werden muss. Die Prozesse sind immer noch da und verbrauchen eine konstante Menge an RAM, benötigen jedoch keine Verarbeitungszeit.

Dies ist scikit-learn Version 0.14, zuletzt aktualisiert und mit Enthought Canopy ausgeführt.

Ich bin auf der Plattform "Windows-7-6.1.7601-SP1".

Ich werde weiter in die Tiefe gehen, indem ich ein allgemeines Beispiel für das Problem anführe. Ich denke, es hat damit zu tun, dass GridSearchCV in einer for-Schleife platziert wird. (Um nicht zu viel Zeit zu verschwenden, sollten Sie wahrscheinlich mit der Methode run_tune_process() beginnen, die am Ende des Codes aufgerufen wird und die Methode mit GridSearchCV() in einer for-Schleife aufruft)

Code:

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)

Auch hier funktioniert dieser Code auf meinem Computer nur, wenn ich n_jobs auf 1 ändere oder wenn ich kein score= Argument definiere.

Im Allgemeinen stößt Multiprocessing in Windows auf viele Probleme. Aber ich
Ich weiß nicht, warum dies mit einem benutzerdefinierten Messwert korreliert werden sollte. Es gibt
nichts über die Option Average=Macro in 0.14, was darauf hindeutet, dass es so sein sollte
wahrscheinlicher hängen als der Standarddurchschnitt (gewichtet). Bei der Entwicklung
head, dies ist auf meinem macbook in 11s und bei Version 0.14 in 7s abgeschlossen
(das ist etwas zu prüfen!)

Können Sie dies in der aktuellen Entwicklungsversion ausprobieren, um zu sehen, ob?
ist es immer noch ein problem?

Am 25. Februar 2014 um 20:40 Uhr schrieb adverley [email protected] :

Danke für deine schnelle Antwort.

Mit Absturz meine ich eigentlich einfrieren. Es geht nicht mehr weiter und
Es gibt auch keine zu überwachenden Aktivitäten mehr im Python-Prozess von
Taskmanager von windows. Die Prozesse sind noch da und verbrauchen a
konstante Menge an RAM, benötigen aber keine Verarbeitungszeit.

Dies ist scikit-learn Version 0.14, zuletzt aktualisiert und mit Enthought ausgeführt
Überdachung.

Ich bin auf der Plattform "Windows-7-6.1.7601-SP1".

Ich werde weiter in die Tiefe gehen, indem ich ein allgemeines Beispiel für das Problem anführe. ich
denke, es hat damit zu tun, dass GridSearchCV in einer for-Schleife platziert wird. (Zu
Verschwenden Sie nicht zu viel Zeit, Sie sollten wahrscheinlich bei der beginnen
run_tune_process() Methode, die am Ende des Codes aufgerufen wird
und ruft die Methode mit GridSearchCV() in einer for-Schleife auf)
Code:

sklearn.metrics als Metriken importieren
aus sklearn.grid_search importieren GridSearchCV
numpy als np importieren
Importieren von OS
aus sklearn-Importdatensätzen
von sklearn import svm als sk

def tune_hyperparameters(trainingData, Zeitraum):
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):
für Periode in np.arange(0,100,10):
clf = hyperparam_tuning_method(trainingData,period)

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

Importiere einige Daten zum Spielen

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)

Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf Gi tHub anhttps://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -35990430
.

(Als Nebenbemerkung , stelle ich fest, dass es viel mehr Joblibs zu geben scheint
Parallelisierungs-Overhead in Master -- zumindest unter OS X -- das war nicht da
in 0,14...)

Am 25. Februar 2014 um 21:52 Uhr schrieb Joel Nothman [email protected] :

Im Allgemeinen stößt Multiprocessing in Windows auf viele Probleme. Aber ich
Ich weiß nicht, warum dies mit einem benutzerdefinierten Messwert korreliert werden sollte. Es gibt
nichts über die Option Average=Macro in 0.14, was darauf hindeutet, dass es so sein sollte
wahrscheinlicher hängen als der Standarddurchschnitt (gewichtet). Bei der Entwicklung
head, dies ist auf meinem macbook in 11s und bei Version 0.14 in 7s abgeschlossen
(das ist etwas zu prüfen!)

Können Sie dies in der aktuellen Entwicklungsversion ausprobieren, um zu sehen, ob?
ist es immer noch ein problem?

Am 25. Februar 2014 um 20:40 Uhr schrieb adverley [email protected] :

Danke für deine schnelle Antwort.

Mit Absturz meine ich eigentlich einfrieren. Es geht nicht mehr weiter und
Es gibt auch keine zu überwachenden Aktivitäten mehr im Python-Prozess von
Taskmanager von windows. Die Prozesse sind noch da und verbrauchen a
konstante Menge an RAM, benötigen aber keine Verarbeitungszeit.

Dies ist scikit-learn Version 0.14, zuletzt aktualisiert und mit Enthought ausgeführt
Überdachung.

Ich bin auf der Plattform "Windows-7-6.1.7601-SP1".

Ich werde weiter in die Tiefe gehen, indem ich ein allgemeines Beispiel für das Problem anführe.
Ich denke, es hat damit zu tun, dass GridSearchCV in einer for-Schleife platziert wird. (Zu
Verschwenden Sie nicht zu viel Zeit, Sie sollten wahrscheinlich bei der beginnen
run_tune_process() Methode, die am Ende des Codes aufgerufen wird
und ruft die Methode mit GridSearchCV() in einer for-Schleife auf)
Code:

sklearn.metrics als Metriken importieren
aus sklearn.grid_search importieren GridSearchCV
numpy als np importieren
Importieren von OS
aus sklearn-Importdatensätzen
von sklearn import svm als sk

def tune_hyperparameters(trainingData, Zeitraum):
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):
für Periode in np.arange(0,100,10):
clf = hyperparam_tuning_method(trainingData,period)

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

Importiere einige Daten zum Spielen

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)

Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf Gi tHub anhttps://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -35990430
.

Das hat nichts mit benutzerdefinierten Scorern zu tun. Dies ist eine bekannte Funktion von Python-Multiprocessing unter Windows: Sie müssen alles, was n_jobs=-1 in einem if __name__ == '__main__' Block ausführen, oder Sie werden einfrieren/abstürzen. Vielleicht sollten wir das irgendwo prominent dokumentieren, zB in der README?

Sie müssen alles, was n_jobs= -1 verwendet, in einem if- Namen ausführen ==
' main ' Block oder Sie werden einfrieren/abstürzen.

Nun, die gute Nachricht ist, dass joblib heutzutage einen sinnvollen Fehler ausgibt
Nachricht über einen solchen Absturz, anstatt eine Gabelbombe.

@GaelVaroquaux gibt das aktuelle scikit-learn diese Fehlermeldung aus? Wenn ja, kann das Problem IMHO als behoben angesehen werden.

@GaelVaroquaux gibt das aktuelle scikit-learn diese Fehlermeldung aus? Wenn ja, die
Problem kann als behoben betrachtet werden, IMHO.

Es sollte tun. Der einzige Weg, um sicher zu sein, ist zu überprüfen. Ich bin in Bewegung richtig
jetzt, und ich kann keine Windows-VM starten, um das zu tun.

Ich werde nicht nur dafür einen C-Compiler unter Windows installieren. Tut mir leid, aber ich mache wirklich kein Windows :)

Ich werde nicht nur dafür einen C-Compiler unter Windows installieren. Tut mir leid, aber ich
wirklich kein Windows :)

Ich habe eine Windows-VM. Ich kann überprüfen. Es ist nur eine Frage der Suche nach einem
wenig Zeit haben, es zu tun.

@larsmans , du hast vollkommen recht. Das benutzerdefinierte Scorer-Objekt war ein Fehler von mir, das Problem liegt ja im Multiprocessing unter Windows. Ich habe denselben Code unter Linux ausprobiert und er läuft gut.

Ich erhalte keine Fehlermeldungen, weil es nicht abstürzt, es macht einfach keinen Sinn mehr.

@adverley Könnten Sie die neueste Version von GitHub auf Ihrer Windows-Box ausprobieren?

Wird wegen fehlendem Feedback geschlossen und ist wahrscheinlich ein bekanntes Problem, das in neueren Joblibs behoben wurde.

Ich bin mir nicht sicher, ob es damit zusammenhängt, scheint zu sein.

In Windows friert der benutzerdefinierte Scorer immer noch ein. Ich bin bei Google auf diesen Thread gestoßen - habe den Scorer entfernt und die Rastersuche funktioniert.

Wenn es einfriert, zeigt es keine Fehlermeldung an. Es werden auch 3 Python-Prozesse erzeugt (weil ich n_jobs = 3 gesetzt habe). Die CPU-Auslastung bleibt jedoch für alle Python-Prozesse 0. Ich verwende IPython-Notebook.

Können Sie den Code des Torschützen teilen? Es scheint ein bisschen unwahrscheinlich.

Verwendet Ihr Scorer irgendwo joblib / n_jobs? Es sollte nicht, und das könnte möglicherweise Probleme verursachen (obwohl ich denke, dass joblib das erkennen sollte).

Klar - hier ist der vollständige Code - http://pastebin.com/yUE26SNs

Die Scorer-Funktion ist "score_model", sie verwendet keine Joblib.

Dies wird über die Eingabeaufforderung ausgeführt, jedoch nicht über IPython Notebook. Die Fehlermeldung lautet -
AttributeError: Can't get attribute 'score_model' on <module '__main__' (built-in)>;

Dann werden das IPython und alle erzeugten Python-Instanzen im Leerlauf - lautlos - und reagieren auf keinen Python-Code mehr, bis ich ihn neu starte.

Beheben Sie den Attributfehler, dann funktioniert es.
Führen Sie Pylab-Importe in IPython-Notebooks durch? Ansonsten sollte alles gleich sein.

Nun, ich weiß nicht, was den AttributeError verursacht... Obwohl es höchstwahrscheinlich mit Joblibs zusammenhängt, da _es nur passiert, wenn n_jobs mehr als 1_ ist, läuft es mit n_jobs=1 .

Der Fehler spricht davon, dass das Attribut score_model __main__ score_model fehlt, unabhängig davon, ob ich ein if __name__ == '__main__' im IPython-Notebook habe oder nicht.

(Ich habe festgestellt, dass die Fehlerzeile oben falsch eingefügt wurde - habe ich im obigen Beitrag bearbeitet.)

Ich benutze kein Pylab.

Hier ist die vollständige erweiterte Fehlermeldung - http://pastebin.com/23y5uHT2

Hum, das hängt wahrscheinlich mit Problemen der Multiprocessing unter Windows zusammen. Vielleicht können @GaelVaroquaux oder @ogrisel helfen.
Ich weiß nicht, was das Notizbuch aus dem __name__ == "__main__" .
Versuchen Sie, die Metrik nicht im Notebook zu definieren, sondern in einer separaten Datei und importieren Sie sie. Ich würde denken, das würde es beheben.
Dies hat nicht wirklich etwas mit GridSearchCV zu tun, aber einige interessante Interaktionen zwischen Windows Multiprocessing, IPython Notebook und Joblib.

Leute... danke für den Thread. Wie auch immer, ich hätte diesen Thread vorher überprüfen sollen, 5 Stunden meiner Zeit damit verschwendet. Versuchen, in Parallelverarbeitung zu laufen. Danke vielmals :)
UM EIN FEEDBACK HINZUFÜGEN: es ist immer noch eiskalt. Ich hatte das gleiche Problem, als ich meine eigene make_Score-Kostenfunktion hatte. Mein System friert ein. Als ich die benutzerdefinierte Kostenfunktion nicht verwendet habe, traten diese Einfrierungen bei der parallelen Verarbeitung nicht auf

Der beste Weg, diese 5 Stunden in etwas Nützliches für das Projekt zu verwandeln, wäre, uns ein eigenständiges Beispiel zur Verfügung zu stellen, das das Problem reproduziert.

Ich hatte das gleiche Problem unter Windows 10, das in einem Jupyter-Notebook arbeitete, als ich versuchte, einen benutzerdefinierten Scorer innerhalb einer verschachtelten Kreuzvalidierung und n_jobs=-1 zu verwenden. Ich habe die Nachricht AttributeError: Can't get attribute 'custom_scorer' on <module '__main__' (built-in)>; .
Wie @amueller vorgeschlagen hat,

Ich habe genau das gleiche Problem unter OSX 10.10.5

Hier gilt das gleiche.
OSX 10.12.5

Bitte geben Sie ein reproduzierbares Code-Snippet an. Dem gehen wir gerne auf den Grund. Es ist schwer zu verstehen, ohne Code, einschließlich Daten, die uns das Problem zeigen.

Führen Sie diese Zeilen einfach in einer Python-Shell aus

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)

Beachten Sie, dass das Entfernen des PCA-Schritts aus der Pipeline das Problem behebt.

Mehr Info:

Darwin-16.6.0-x86_64-i386-64bit
('Python', '2.7.13 (Standard, 4. April 2017, 08:47:57) \n[GCC 4.2.1 kompatibel Apple LLVM 8.1.0 (clang-802.0.38)]')
('NumPy', '1.12.1')
('SciPy', '0.19.1')
('Scikit-Lernen', '0.18.2')

Da Sie keinen benutzerdefinierten Scorer verwenden, sollten wir davon ausgehen, dass dies a
separates Thema?

Am 8. August 2017, 18:15 Uhr, schrieb "boazsh" [email protected] :

Führen Sie diese Zeilen einfach in einer Python-Shell aus

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

X = np.zufälliges.sample((1000, 100))
Y = np.zufälliges.sample((1000)) > 0.5
svc_pipeline = Pipeline([('pca', PCA(n_components=95)), ('svc', SVC())])
Vorhersagen = cross_val_predict(svc_pipeline, X, Y, cv=30, n_jobs=-1)Klassifizierungsbericht drucken(Y, Vorhersagen)

Beachten Sie, dass das Entfernen des PCA-Schritts aus der Pipeline das Problem behebt.

Mehr Info:

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


Sie erhalten dies, weil Sie einen Kommentar abgegeben haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-320885103 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AAEz6-6Klhc67b5kZ17fFTxc8RfZQ_BWks5sWBkLgaJpZM4BkiD9
.

Als ich zum ersten Mal mit diesem Problem konfrontiert wurde, habe ich einen benutzerdefinierten Scorer verwendet, aber beim Versuch, den Beispielcode so weit wie möglich zu vereinfachen, stellte ich fest, dass er nicht unbedingt einen benutzerdefinierten Scorer enthalten muss. Zumindest auf meiner Maschine. Das Importieren des Scorers hat in meinem Fall auch nicht geholfen. Die Symptome sehen jedenfalls ähnlich aus. Das Skript hängt für immer und die CPU-Auslastung ist gering.

@boazsh vielen Dank für das Snippet, es ist jedoch nicht deterministisch, können Sie es bearbeiten und ein np.random.RandomState , um sicherzustellen, dass die Zufallszahlen bei jedem Lauf immer gleich sind.

Es gibt auch eine Problemumgehung, wenn Sie Python 3 verwenden, beispielsweise in https://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment -187683383 vorgeschlagen.

Ich habe derzeit keine Möglichkeit, dies unter OSX zu testen, aber ich kann es vielleicht in den nächsten Tagen versuchen.

Einige nützliche Informationen (fügen Sie einfach das hinzu, was Ihrem früheren Kommentar fehlt 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__)

Wie hast du scikit-learn installiert, mit pip, mit conda, mit einem der OSX-Paketmanager (brew, etc ...) ?

Snippet aktualisiert (verwendet np.random.seed)

Darwin-16.6.0-x86_64-i386-64bit
('Python', '2.7.13 (Standard, 4. April 2017, 08:47:57) \n[GCC 4.2.1 kompatibel Apple LLVM 8.1.0 (clang-802.0.38)]')
('NumPy', '1.12.1')
('SciPy', '0.19.1')
('Scikit-Lernen', '0.18.2')

Snippet aktualisiert (verwendet np.random.seed)

Super, vielen Dank!

Wie hast du scikit-learn installiert, mit pip, mit conda, mit einem der OSX-Paketmanager (brew, etc ...) ?

Haben Sie diese Frage beantwortet, ich kann Ihre Antwort nicht finden ...

Entschuldigung, verpasst - pip.

FWIW, ich habe kein Problem damit, dieses Snippet auszuführen mit:

Importplattform; print(platform.platform())
Darwin-16.7.0-x86_64-i386-64bit
Importsystem; print("Python", sys.version)
Python 2.7.12 |Continuum Analytics, Inc.| (Standard, 2. Juli 2016, 17:43:17)
[GCC 4.2.1 (Basierend auf Apple Inc. Build 5658) (LLVM-Build 2336.11.00)]
numpy importieren; print("NumPy", numpy.__version__)
NumPy 1.13.1
Import Scipy; print("SciPy", scipy.__version__)
SciPy 0.19.1
Sklearn importieren; print("Scikit-Learn", sklearn.__version__)
Scikit-Lernen 0.18.2

Könnten Sie auch verbose=10 in cross_val_predict setzen, damit wir es vielleicht können?
siehst du wo es bei dir kaputt geht?

Am 8. August 2017 um 22:59 schrieb boazsh [email protected] :

Entschuldigung, verpasst - pip.


Sie erhalten dies, weil Sie einen Kommentar abgegeben haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-320948362 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AAEz67S64KIXUGvARGjvxBOw_4aCAdqhks5sWFu0gaJpZM4BkiD9
.

@jnothman Ich http://scikit-learn.org/stable/faq.html#why -do-i-sometime-get-a-crash-freeze-with-n-jobs-1-under-osx-or-linux für weitere Details .

pip hingegen verwendet Räder, die mit Accelerate ausgeliefert werden (zum Zeitpunkt des Schreibens).

Ein Workaround (anders als JOBLIB_START_METHOD), um diesen speziellen Fehler zu vermeiden, besteht darin, MKL (zB über Conda) oder OpenBLAS (zB über den Conda-Forge-Kanal) zu verwenden.

Es wird nichts gedruckt...

screen shot 2017-08-08 at 16 43 35

@jnothman Ich

@jnothman Falls Sie das Problem reproduzieren möchten, können Sie mit IIRC eine Umgebung mit Accelerate auf OSX erstellen mit etwas wie:

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

FWIW Ich kann das Problem auf meiner OS X VM nicht reproduzieren. Ich habe versucht, die Versionen von @boazsh so genau wie möglich

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

Hmm eigentlich kann ich reproduzieren, aber dein Snippet war kein vollständiger Reproduzierer. Hier ist ein aktualisierter Ausschnitt:

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

Auf jeden Fall ist dies ein bekanntes Problem bei Accelerate und Python Multiprocessing. Workarounds existieren und wurden in früheren Beiträgen aufgeführt. Am einfachsten ist es wahrscheinlich, Conda zu verwenden und sicherzustellen, dass Sie MKL und nicht Accelerate verwenden.

Längerfristig (wahrscheinlich scikit-learn 0.20) wird dieses Problem durch das neue loky Backend für joblib universell gelöst: https://github.com/scikit-learn/scikit-learn/issues/7650

Ein Fix für Multiprocessing, der von der scikit-learn-Version abhängig ist, ist symptomatisch für die Probleme des Vendoring....

Ein Fix für Multiprocessing, der von der scikit-learn-Version abhängig ist, ist symptomatisch für die Probleme des Vendoring....

Ich habe vor kurzem folgendes gelesen, was ich interessant fand:
https://lwn.net/Articles/730630/rss

Ich habe ein ähnliches Problem mit RandomizedSearchCV; es hängt auf unbestimmte Zeit. Ich verwende ein 3 Jahre altes MacBook Pro, 16 GB RAM und Core i7 und meine Scikit-Learn-Version ist 0.19.

Rätselhaft ist, dass es letzten Freitag funktioniert hat!!! Montagmorgen gehe ich zurück und versuche zu laufen und es friert einfach ein. Ich weiß von früheren Durchläufen, dass es ungefähr 60 Minuten dauert, bis es fertig ist, aber ich habe viel länger gewartet und nichts passiert, es hängt sich einfach auf, keine Fehlermeldungen, nichts und mein Computer heizt sich auf und saugt Strom, als gäbe es kein Morgen. Code unten. Ich habe versucht, n_iter auf 2 und n_jobs=1 zu ändern, nachdem ich hier einige Kommentare gelesen hatte, und das hat funktioniert. Es kann also etwas mit n_jobs=-1 zu tun haben. Trotzdem hat dieser Code letzten Freitag gut funktioniert! es hasst nur montags. Meine Datensatzgröße beträgt weniger als 20.000 Beispiele mit einer Dimensionalität < 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

was ist crf? nur um die Möglichkeit auszuschließen, könnten Sie es versuchen mit
return_train_score=Falsch?

Es ist sehr wahrscheinlich, dass das Problem von @KaisJM auf die bekannte Einschränkung von Accelerate with Multiprocessing zurückzuführen ist, siehe unsere FAQ .

Wie hast du scikit-learn installiert?

Können Sie auch für zukünftige Referenzen die Ausgabe einfügen von:

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

das hat letzten Freitag funktioniert!! Ich habe seitdem nichts getan. Ich denke, Scikit Learn ist Teil von Anaconda, aber ich habe ein Upgrade mit pip durchgeführt (pip install --upgrade sklearn), aber das war, bevor ich dieses Problem bekam. Ich habe den Code nach dem Upgrade auf 0.19 problemlos ausgeführt.

Hier ist die Ausgabe der obigen Drucke:

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 : Ich verwende RandomizedSearchCV von sklearn.grid_search, das nicht den Parameter return_train_score hat. Ich weiß, dass sklearn.grid_search veraltet ist. Ich werde das von sklearn.model_selection versuchen, aber etwas sagt mir, dass ich genau das gleiche Problem haben werde). Aktualisierter Originalkommentar mit weiteren Informationen und Code.

Kannst du die Ausgabe von conda list | grep numpy posten. Ich würde vermuten, dass Sie durch die Aktualisierung von scikit-learn mit pip auch numpy mit pip aktualisiert haben und die numpy-Räder erhalten haben, die Accelerate verwenden und die oben erwähnte Einschränkung aufweisen.

Kleiner Ratschlag:

  • posten Sie ein komplett eigenständiges Snippet (für Ihre nächste Ausgabe). Das bedeutet, dass jeder es kopieren und in eine IPython-Sitzung einfügen und leicht versuchen kann, es zu reproduzieren. So haben Sie die besten Chancen auf ein gutes Feedback.
  • Wenn Sie Conda verwenden, bleiben Sie bei Conda, um Pakete zu verwalten, die über Conda verfügbar sind. Verwenden Sie Pip nur, wenn Sie müssen.
  • Wenn Sie darauf bestehen, dass Sie pip install --update möchten, würde ich Ihnen dringend empfehlen, pip install --update --no-deps . Andernfalls, wenn ein Paket abhängig ist, sagen wir von numpy, und Sie zufällig nicht das neueste numpy haben, wird numpy mit pip aktualisiert, was Sie nicht möchten.

Oh ja und BTW, sklearn.grid_search ist veraltet, Sie möchten wahrscheinlich sklearn.model_selection an einem Punkt nicht allzu weit entfernt verwenden.

Guter Rat, danke. Ist die Problemumgehung also das Downgrade von numpy? welche Einschränkung meinst du? den FAQ-Link oben? Ich habe es gelesen, aber ich verstehe dieses Zeug nicht (ich bin nur ein Algo-Typ :) ).

Ausgabe von conda list | grep numpy

numpy 1.12.0
numpy 1.12.0 py27_0
numpy 1.13.1
numpydoc 0.7.0

Wow drei numpy installiert Ich habe schon zwei gesehen, aber noch nie drei ... jedenfalls scheint dies ein Hinweis auf das Problem zu sein, das ich erwähnt habe, dh dass Sie Pip und Conda gemischt haben, was für ein bestimmtes Paket eine schlechte Idee ist.

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

Hoffentlich haben Sie danach ein einzelnes Numpy, das MKL verwendet.

Wenn ich Sie wäre, würde ich noch einmal überprüfen, ob Sie das gleiche Problem für andere wissenschaftliche Kernpakete haben, z. B. scipy usw.

Der Grund, warum ich bei einigen Paketen auf Pip zurückgreife, ist, dass Conda einige Pakete nicht hat, was eigentlich sehr frustrierend ist, weil ich weiß, dass es eine schlechte Idee ist, Pip mit Conda zu mischen. Das nächste Mal werde ich die Option --no-deps verwenden.

Eine Sache, die ich hätte erwähnen sollen, ist, dass ich Spyder in der Python-Umgebung installiert habe, in der ich arbeitete. Ich konnte den Code jedoch nach der Installation von Spyder sowohl in Spyder als auch in Jupyter ausführen.

Ich habe Spyder und die oben genannten Numpys deinstalliert, mit conda holprig neu installiert (was Scikit auf 0.19 aktualisiert hat) und immer noch den gleichen Fehler erhalten. Vielleicht ist wegen der Spyder-Installation etwas passiert, aber warum sollte es dann einen Tag lang funktionieren und dann plötzlich aufhören??

ok, nichts geht!! Soll ich einfach eine neue Umgebung erstellen (mit Conda) und dort alles neu installieren? wird es das lösen oder verschlimmern?

Klingt einen Versuch wert!

eine neue Umgebung erstellt und alles mit Conda installiert, friert immer noch auf unbestimmte Zeit ein. nur eine Kopie von jedem Paket usw.

n_jobs=1 funktioniert, dauert aber natürlich ewig (hat auch in der vorherigen Umgebung funktioniert). n_jobs=-1 ist das, was auf unbestimmte Zeit einfriert.

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

Dann weiß ich es nicht. Die einzige Möglichkeit, die wir untersuchen können, besteht darin, dass Sie ein vollständig eigenständiges Snippet posten, das wir einfach kopieren und in eine IPython-Sitzung einfügen können, um zu sehen, ob wir das Problem reproduzieren können.

versuchen, ein Minimalbeispiel zu erstellen, das das Problem reproduziert. Ich muss das tun, um effizienter zu debuggen.

Ich habe den FAQ-Eintrag gelesen, auf den Sie sich zum Thema "Beschleunigen" beziehen. Es hilft mir nicht viel. Was ich daraus entnommen habe, ist, dass fork () NICHT gefolgt von einem exec () -Aufruf schlecht ist. Ich habe schon etwas gegoogelt und bis jetzt gibt es keinen Hinweis auf eine Problemumgehung. Können Sie auf weitere Informationen hinweisen, genauere Informationen über das Problem? Danke,

Probieren Sie dieses Snippet aus (aus 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))
  • Wenn dies einfriert (dh es nicht innerhalb einer Sekunde endet), bedeutet dies, dass Sie Accelerate verwenden und das Freeze eine bekannte Einschränkung bei Python-Multiprocessing ist. Die Problemumgehung besteht darin, Accelerate nicht zu verwenden. Unter OSX können Sie dies mit conda tun, das standardmäßig MKL verwendet. Sie können OpenBLAS auch mit conda-forge verwenden.
  • Wenn es nicht einfriert, verwenden Sie Accelerate nicht und wir benötigen ein eigenständiges Snippet, um dies zu untersuchen.

wird versuchen, mit minimalem Code zu reproduzieren.

Without multiprocessing:
Enter
Exit

With multiprocessing:
Enter
Exit
Enter
Exit

@GaelVaroquaux scikit-learn ist keine App, sondern eine Bibliothek in einem reichhaltigen Ökosystem. Wenn alle tun würden, was wir tun, würde alles zusammenbrechen. Das ist ein ziemlich klares Signal, dass wir uns ändern müssen. Und es gibt viele Umgebungen, in denen das Gegenteil von diesem Kommentar der Fall ist.

Ich habe eine virtuelle Ubuntu-Instanz in der Google Cloud Compute Engine verwendet (holprig, scharf, Scikit usw. waren nicht die neuesten). Der Code lief gut. Dann habe ich Gensim installiert. Dieses aktualisierte numpy und scipy auf die neuesten Versionen und installierte einige andere Dinge, die es benötigt (boto, bz2file und smart_open). Danach friert der Code ein. Ich hoffe, dies gibt einen nützlichen Hinweis darauf, was dieses Einfrieren verursacht.

nach der Installation von Gensim
numpy (1.10.4) aktualisiert auf numpy (1.13.3)
scipy (0.16.1) aktualisiert auf scipy (0.19.1)

Mehr Info:
Bei einigen Recherchen fand ich, dass libblas, liblapack und liblapack_atlas in meiner /usr/lib/ fehlten, auch habe ich das Verzeichnis /usr/lib/atlas-base/ nicht gesehen. Ich weiß nicht, ob sie dort waren und die Installation von Gensim sie entfernt hat, da numpy usw. aktualisiert wurde, aber dies ist wahrscheinlich, da der Code vor der Installation von Gensim funktioniert hat. Ich habe sie mit sudo apt-get --yes install libatlas-base-dev und "_update-alternatives_" gemäß den erweiterten Scikit- Installationsanweisungen installiert , aber es hat nicht geholfen, der Code friert immer noch mit n_jobs=-1 ein.

Ich denke, das Problem ist, dass numpy OpenBlas verwendet. Werde es auf ATLAS umstellen und sehen was passiert.

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

Immer noch das gleiche Problem. Folgendes läuft gut, es sei denn, ich füge n_jobs=-1 ein.

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 verwenden Ihre Numpy- und Scipy-Installationen ATLAS oder OpenBLAS?

Es ist ein bisschen schwer zu folgen, was Sie @KaisJM getan haben. Aus Sicht eines Betreuers brauchen wir ein vollständig eigenständiges Python-Snippet, um zu sehen, ob wir es reproduzieren können. Nur wenn wir reproduzieren können, können wir untersuchen und versuchen zu verstehen, was passiert. Wenn dies nur passiert, wenn Sie gensim installieren und es Ihnen gelingt, dieses Verhalten konsistent zu reproduzieren, benötigen wir eine vollständige Anleitung zum Erstellen einer Python-Umgebung, die das Problem hat, im Vergleich zu einer Python-Umgebung, die das Problem nicht hat.

Dies erfordert einen nicht zu vernachlässigenden Zeit- und Arbeitsaufwand, dem stimme ich voll und ganz zu, aber ohne ihn können wir leider nicht viel tun, um Ihr Problem zu untersuchen.

gemäß den erweiterten Installationsanweisungen

@KaisJM übrigens, diese Seite ist veraltet, da heutzutage Wheels unter Linux verfügbar sind und ihr eigenes OpenBLAS enthalten. Wenn Sie ein freigegebenes scikit-learn mit pip installieren, verwenden Sie OpenBLAS.

@lesteve sagst du, dass Openblas kein Einfrieren mehr verursacht?

@lesteve paula hat einen Ausschnitt gepostet, der auch das gleiche Problem hat. Ich kann sehen, dass es kein vollständiger Code ist, aber ich hoffe, es gibt einen Hinweis. Ich kann hier Snippet "vervollständigen" und für Sie posten. Es ist jedoch klar, dass die "veraltete" - wie Sie sie nennen - Anleitungsseite möglicherweise nicht so veraltet ist. Die höchste Wahrscheinlichkeit besteht darin, dass OpenBLAS die Gebühren verursacht, über die auf dieser Seite gesprochen wird.

Diese Anweisungen sind veraltet, glauben Sie mir. Wenn Sie die Details lesen, heißt es "aber kann Joblib/Multiprocessing vor OpenBLAS-Version 0.2.8-4 einfrieren". Ich habe ein aktuelles Numpy-Rad überprüft und es enthält OpenBLAS 0.2.8.18. Der Freeze, auf den sie sich beziehen, ist der in https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -334155175, den Sie anscheinend nicht haben.

Ich kann sehen, dass es kein vollständiger Code ist, aber ich hoffe, es gibt einen Hinweis

Nicht wirklich, nein. Wir haben Berichte von Benutzern, die darauf hindeuten, dass es immer noch zu Einfrieren kommen kann, von denen wir es jedoch nicht geschafft haben, AFAIK zu reproduzieren. Das scheint darauf hinzudeuten, dass dieses Problem in einer ganz bestimmten Kombination von Faktoren auftritt. Wenn nicht jemand, der das Problem hat, einige Zeit damit verbringt, eine kontrollierte Reproduktion zu finden, und wir es schaffen, uns zu reproduzieren, können wir einfach nichts dagegen tun.

Ich kann hier Snippet "vervollständigen" und für dich posten

Das wäre toll. Das wäre großartig, wenn Sie in einer separaten Conda-Umgebung (oder Virtualenv, je nachdem, was Sie verwenden) überprüfen könnten, ob ein solches Snippet immer noch das Einfrieren verursacht.

@lesteve @paulaceccon :Ich habe Paulas Code-Auszug genommen und einen kompletten

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 Ich denke, es ist nützlicher, wenn Sie mit Ihrem Einfrierskript beginnen und es schaffen, ein vollständig eigenständiges, das für Sie einfriert, zu vereinfachen und zu veröffentlichen.

@lesteve Einverstanden. Ich habe eine neue Python2-Umgebung erstellt, wie ich sie vor der Installation von Gensim hatte. Code lief gut, KEIN Einfrieren mit n_jobs=-1. Darüber hinaus verwendet Numpy OpenBLAS und hat die gleiche Konfiguration wie die Umgebung, die das Einfrieren zeigt (diejenige, in der Gensim installiert wurde). Es scheint also, dass openblas nicht die Ursache für dieses Einfrieren ist.

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 Ich

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

Ich weiß, dass es umständlich ist, aber es ist nicht eingefroren, wenn es mit einer _custom_ Metrik ausgeführt wurde.

Ich habe ein ähnliches Problem. Ich habe den gleichen Code ausgeführt und wollte das Modell einfach mit den neuen Monatsdaten aktualisieren und es wurde nicht mehr ausgeführt. ich glaube sklearn wurde inzwischen auf 0.19 aktualisiert

Das Ausführen von GridSearchCV oder RandomizedSearchCV in einer Schleife und n_jobs > 1 würde in Jupiter & IntelliJ still hängen:

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)

    ...

Folgte der @lesteve- Empfehlung und überprüfte die Umgebung und entfernte numpy, das mit pip installiert wurde:

Darwin-16.6.0-x86_64-i386-64bit
Python 3.6.1 |Anaconda-Benutzerdefiniert (x86_64)| (Standard, 11. Mai 2017, 13:04:09)
[GCC 4.2.1 kompatibel mit Apple LLVM 6.0 (clang-600.0.57)]
NumPy 1.13.1
SciPy 0.19.1
Scikit-Lernen 0.19.0

$conda-Liste | grep numpy
knusprig 0.2 pip
numpy 1.13.1 py36_0
numpy 1.13.3 pip
numpydoc 0.6.0 py36_0

$pip deinstalliere numpy

$conda-Liste | grep numpy
dreckig 0.2 pip
numpy 1.13.1 py36_0
numpydoc 0.6.0 py36_0

$conda install numpy -f // höchstwahrscheinlich unnötig

$conda-Liste | grep numpy
knusprig 0.2 pip
numpy 1.13.1 py36_0
numpydoc 0.6.0 py36_0

Habe mein Problem behoben.

@paulaceccon dein Problem bezieht sich auf

https://stackoverflow.com/questions/36533134/cant-get-attribute-abc-on-module-main-from-abc-h-py
Wenn Sie den Pool deklarieren, bevor Sie die Funktion deklarieren, die Sie parallel verwenden möchten, wird dieser Fehler ausgegeben. Kehren Sie die Reihenfolge um und dieser Fehler wird nicht mehr ausgelöst.

Folgendes wird Ihren Code ausführen:

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

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

Ergebnisse laufen auf 8 Kernen

Anpassen von 3 Falten für jeden von 54 Kandidaten, insgesamt 162 Passungen
{'class_weight': {0: 0.51891309, 1: 13.71835531}, 'criterion': 'gini', 'min_samples_leaf': 10, 'min_samples_split': 20, 'n_estimators': 400}

Das Problem ist immer noch da, Leute. Ich verwende einen benutzerdefinierten Scorer und es geht ewig weiter, wenn ich n_jobs auf irgendetwas setze. Wenn ich n_jobs überhaupt nicht angebe, funktioniert es gut, aber ansonsten friert es ein.

Können Sie ein eigenständiges Snippet bereitstellen, um das Problem zu reproduzieren? Weitere Informationen finden Sie unter https://stackoverflow.com/help/mcve .

Dieses Problem tritt immer noch mit dem gleichen Beispielcode auf.

Windows-10-10.0.15063-SP0
Python 3.6.4 |Anaconda-Benutzerdefiniert (64-Bit)| (Standard, 16. Januar 2018, 10:22:32) [MSC v.1900 64 Bit (AMD64)]
NumPy 1.14.1
SciPy 1.0.0
Scikit-Lernen 0.19.1

Können Sie ein eigenständiges Snippet bereitstellen, um das Problem zu reproduzieren? Weitere Informationen finden Sie unter https://stackoverflow.com/help/mcve .

Ich vermute, dass dies das gleiche alte Multiprocessing in Windows-Problem ist. siehe unsere FAQ

Ich habe den Code in https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment -337985212 von thomberg1 getestet.

Betriebssystem: Windows 10 x64 10.0.16299.309
Python-Paket: WinPython-64bit-3.6.1
numpy (1.14.2)
scikit-lernen (0.19.1)
scipy (1.0.0)

Es funktionierte gut in Jupyter Notebook und in der Befehlszeile.

HI, ich habe das gleiche Problem, daher wollte ich kein neues eröffnen, was zu einem fast identischen Thread führen könnte.

-Mac OS
-Anakonda
-scikit-lernen 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))

Code stammt aus einem Tutorial: https://machinelearningmastery.com/use-keras-deep-learning-models-scikit-learn-python/
Ich habe versucht, den Parameter n_jobs auf 1, -1 zu ändern, aber keines davon hat funktioniert. Irgendein Hinweis?

Es wird ausgeführt, wenn ich den Multiprocessing-Import und die if-Anweisung wie unten gezeigt hinzufüge - ich arbeite nicht mit Keras, daher habe ich keinen weiteren Einblick

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

Anpassen von 3 Falten für jeden der 18 Kandidaten, insgesamt 54 Passungen

Am besten: 0.675781 mit {'batch_size': 5, 'epochs': 5, 'init': 'glorot_uniform', 'optimizer': 'adam'}
0.621094 (0.036225) mit: {'batch_size': 5, 'epochs': 5, 'init': 'glorot_uniform', 'optimizer': 'rmsprop'}
0.675781 (0.006379) mit: {'batch_size': 5, 'epochs': 5, 'init': 'glorot_uniform', 'optimizer': 'adam'}
...
0.651042 (0.025780) mit: {'batch_size': 20, 'epochs': 5, 'init': 'uniform', 'optimizer': 'adam'}


Versionsinfo bei Bedarf
sys 3.6.4 |Anaconda benutzerdefinierte (64-Bit)| (Standard, 16. Januar 2018, 12:04:33)
[GCC 4.2.1 kompatibler Clang 4.0.1 (tags/RELEASE_401/final)]
numpy 1.14.2
Pandas 0.22.0
sklearn 0.19.1
Taschenlampe 0.4.0a0+9692519
IPython 6.2.1
Keras 2.1.5

Compiler: GCC 4.2.1 kompatibel Clang 4.0.1 (tags/RELEASE_401/final)
System: Darwin
Veröffentlichung: 17.5.0
Maschine: x86_64
Prozessor: i386
CPU-Kerne: 24
Dolmetscher: 64bit

Danke @thomberg1 , aber hinzufügen

import multiprocessing
if __name__ == '__main__':

hat nicht geholfen. Das Problem ist immer noch das gleiche

Gleiches Problem auf meinem Computer, wenn ich die benutzerdefinierte Bewertungsfunktion in GridsearchCV .
Python 3.6.4,
scikit-lernen 0.19.1,
Fenster 10.,
CPU-Kerne: 24

@byrony können Sie Code zum Reproduzieren bereitstellen? hast du if __name__ == "__main__" ?

Ich habe ein ähnliches Problem mehrmals auf meinem Computer erlebt, als ich n_jobs=-1 oder n_jobs=8 als Argument für GridsearchCV aber das Standard-Scorer-Argument verwendet habe.

  • Python 3.6.5,
  • scikit-lernen 0.19.1,
  • Arch-Linux,
  • CPU-Kerne: 8.

Hier ist der Code, den ich verwendet habe:

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

Ich weiß, dass es sich um einen großen Datensatz handelt, daher habe ich erwartet, dass es einige Zeit dauern würde, bis Ergebnisse erzielt werden, aber nach 2 Tagen funktionierte es einfach nicht mehr (das Skript wird weiterhin ausgeführt, verwendet jedoch keine Ressource außer RAM und Swap).

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

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

Danke im Voraus!

@amueller Ich habe das if __name__ == "__main__" . Unten ist mein Code, er funktioniert nur, wenn 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)

Sie verwenden XGBoost. Ich weiß nicht, was sie intern tun, es ist sehr gut möglich, dass das das Problem ist. Können Sie versuchen zu sehen, ob das Hinzufügen von if __name__ hilft?
Ansonsten glaube ich, dass es dafür noch keine Lösung gibt.

@Pazitos10 können Sie mit synthetischen Daten und/oder kleineren Daten reproduzieren? Ich kann ohne Ihre Daten nicht reproduzieren und es wäre gut, in kürzerer Zeit zu reproduzieren.

@amueller Ok, ich werde es noch einmal mit 500.000 Zeilen ausführen und die Ergebnisse posten. Vielen Dank!

@amueller , das Ausführen des Skripts mit 50.000 Zeilen funktioniert wie erwartet. Das Skript endet korrekt und zeigt die Ergebnisse wie folgt an (sorry, ich meinte 50k nicht 500k):

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

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

Das Problem ist, dass ich nicht weiß, ob diese Ergebnisse für meinen gesamten Datensatz die besten sind. Irgendein Rat?

Scheint, als ob dir der RAM ausgeht. Vielleicht versuchen Sie es stattdessen mit Keras, es ist wahrscheinlich eine bessere Lösung für große neuronale Netze.

@amueller Oh, ok. Ich werde stattdessen versuchen, Keras zu verwenden. Danke nochmal!

Das hat nichts mit benutzerdefinierten Scorern zu tun. Dies ist eine bekannte Funktion von Python-Multiprocessing unter Windows: Sie müssen alles, was n_jobs=-1 in einem if __name__ == '__main__' Block ausführen, oder Sie werden einfrieren/abstürzen. Vielleicht sollten wir das irgendwo prominent dokumentieren, zB in der README?

Ist es vielleicht eine Idee für scikit, bei Windows die Funktion zu ändern
Und verwenden Sie Warteschlangen, um Aufgaben einer Sammlung von Worker-Prozessen zuzuführen und die Ergebnisse zu sammeln
Wie hier beschrieben: https://docs.python.org/2/library/multiprocessing.html#windows
und für 3.6 hier: https://docs.python.org/3.6/library/multiprocessing.html#windows

@PGTBoos dies ist in scikit-learn 0.20.0 behoben

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen