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

このスニペットは、metricsがsklearn.metricsモジュールを参照するscoring = metrics.make_scorer(metrics.scorer.f1_score、average = "macro")が原因でクラッシュします。 scoring = ...行をキャンセルすると、並列実行が機能します。 f1スコアを評価方法として使用する場合は、n_jobs = 1に設定して並列実行をキャンセルする必要があります。

並列実行の可能性を失うことなく、別のスコアメソッドを定義する方法はありますか?

ありがとう

最も参考になるコメント

うーん、それはおそらくウィンドウズでのマルチプロセッシングの問題に関連しています。 たぶん@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であり、最終更新され、EnthoughtCanopyを使用して実行されます。

私はプラットフォーム「Windows-7-6.1.7601-SP1」を使用しています。

問題の一般的な例を提供することにより、さらに深く掘り下げます。 これは、GridSearchCVがforループに配置されていることに関係していると思います。 (時間を無駄にしないために、コードの最後で呼び出されているrun_tune_process()メソッドから開始し、forループでGridSearchCV()を含むメソッドを呼び出す必要があります)

コード:

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


def tune_hyperparameters(trainingData, period):
    allDataTrain = trainingData

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

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

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

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


    #   Eventually we will return the optimal model
    return clf

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

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

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

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

run_tune_process(tune_hyperparameters,trainingset,testset)

繰り返しになりますが、このコードは、n_jobsを1に変更した場合、またはscoring =引数を定義していない場合にのみコンピューターで機能します。

一般に、Windowsでのマルチプロセッシングには多くの問題が発生します。 しかし、私
これをカスタムメトリックと相関させる必要がある理由がわかりません。 あります
0.14のaverage = macroオプションについては、そうあるべきであることを示唆するものは何もありません。
デフォルトの平均(加重)よりもハングする可能性が高くなります。 開発時
頭、これは私のMacBookでは11秒で完了し、バージョン0.14では7秒で完了します
(それは調べるべきものです!)

現在の開発バージョンでこれを試して、次のことを確認できますか?
それはまだ問題ですか?

2014年2月25日午前20時40分には、adverley [email protected]書きました:

迅速な返信ありがとうございます。

クラッシュすると、私は実際には凍結を意味します。 それはもう続きませんそして
また、Pythonプロセスで監視するアクティビティはもうありません。
Windowsのタスクマネージャー。 プロセスはまだそこにあり、消費します
一定量のRAMですが、処理時間は必要ありません。

これはscikit-learnバージョン0.14であり、最終更新され、Enthoughtを使用して実行されます
キャノピー。

私はプラットフォーム「Windows-7-6.1.7601-SP1」を使用しています。

問題の一般的な例を提供することにより、さらに深く掘り下げます。 私
GridSearchCVがforループに配置されていることに関係していると思います。 (に
あなたの時間をあまり無駄にしないでください、あなたはおそらくから始めるべきです
コードの下部で呼び出されているrun_tune_process()メソッド
そして、forループにGridSearchCV()を含むメソッドを呼び出します)
コード:

sklearn.metricsをメトリクスとしてインポートする
sklearn.grid_searchからインポートGridSearchCV
numpyをnpとしてインポート
OSのインポート
sklearnインポートデータセットから
sklearnからsvmを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):
np.arange(0,100,10)の期間の場合:
clf = hyperparam_tuning_method(trainingData、period)

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

遊ぶためにいくつかのデータをインポートする

アイリス= 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)

このメールに直接返信するか、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

一般に、Windowsでのマルチプロセッシングには多くの問題が発生します。 しかし、私
これをカスタムメトリックと相関させる必要がある理由がわかりません。 あります
0.14のaverage = macroオプションについては、そうあるべきであることを示唆するものは何もありません。
デフォルトの平均(加重)よりもハングする可能性が高くなります。 開発時
頭、これは私のMacBookでは11秒で完了し、バージョン0.14では7秒で完了します
(それは調べるべきものです!)

現在の開発バージョンでこれを試して、次のことを確認できますか?
それはまだ問題ですか?

2014年2月25日午前20時40分には、adverley [email protected]書きました:

迅速な返信ありがとうございます。

クラッシュすると、私は実際には凍結を意味します。 それはもう続きませんそして
また、Pythonプロセスで監視するアクティビティはもうありません。
Windowsのタスクマネージャー。 プロセスはまだそこにあり、消費します
一定量のRAMですが、処理時間は必要ありません。

これはscikit-learnバージョン0.14であり、最終更新され、Enthoughtを使用して実行されます
キャノピー。

私はプラットフォーム「Windows-7-6.1.7601-SP1」を使用しています。

問題の一般的な例を提供することにより、さらに深く掘り下げます。
これは、GridSearchCVがforループに配置されていることに関係していると思います。 (に
あなたの時間をあまり無駄にしないでください、あなたはおそらくから始めるべきです
コードの下部で呼び出されているrun_tune_process()メソッド
そして、forループにGridSearchCV()を含むメソッドを呼び出します)
コード:

sklearn.metricsをメトリクスとしてインポートする
sklearn.grid_searchからインポートGridSearchCV
numpyをnpとしてインポート
OSのインポート
sklearnインポートデータセットから
sklearnからsvmを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):
np.arange(0,100,10)の期間の場合:
clf = hyperparam_tuning_method(trainingData、period)

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

遊ぶためにいくつかのデータをインポートする

アイリス= 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)

このメールに直接返信するか、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はそのエラーメッセージを表示しますか? もしそうなら、問題は修正されたと見なすことができます、私見。

@GaelVaroquaux現在のscikit-learnはそのエラーメッセージを表示しますか? もしそうなら、
問題は修正されたと見なすことができます、私見。

やるべきです。 確認する唯一の方法は確認することです。 私は右に動いています
現在、WindowsVMを起動してそれを行うことはできません。

このためだけに、WindowsにCコンパイラをインストールするつもりはありません。 申し訳ありませんが、私は本当にWindowsをしていません:)

このためだけに、WindowsにCコンパイラをインストールするつもりはありません。 申し訳ありませんが、私は
本当にWindowsをしないでください:)

私はWindowsVMを持っています。 確認できます。 それはただ見つけることの問題です
それをする時間はほとんどありません。

@larsmans 、あなたは完全に正しいです。 カスタムスコアラーオブジェクトは私の間違いでした。問題は確かにWindowsでのマルチプロセッシングにあります。 Linuxでこれと同じコードを試しましたが、うまく動作します。

クラッシュしないのでエラーメッセージは表示されません。意味のあることをやめるだけです。

@adverley WindowsボックスでGitHubの最新バージョンを試して

フィードバックがないために終了しました。これはおそらく、新しいjoblibで修正された既知の問題です。

関連しているかどうかはわかりませんが、関連しているようです。

Windowsでは、カスタムスコアラーはまだフリーズします。 私はグーグルでこのスレッドに遭遇しました-スコアラーを削除しました、そしてグリッド検索は機能します。

フリーズしてもエラーメッセージは表示されません。 3つのPythonプロセスも生成されます(n_jobs = 3を設定したため)。 ただし、CPU使用率はすべてのPythonプロセスで0のままです。 IPythonNotebookを使用しています。

得点者のコードを共有できますか? それは少しありそうもないようです。

あなたのスコアラーはどこでもjoblib / n_jobsを使用していますか? そうすべきではなく、それが問題を引き起こす可能性があります(joblibがそれを検出する必要があると思いますが)。

確かに-ここに完全なコードがあります-http://pastebin.com/yUE26SNs

スコアラー関数は「score_model」であり、joblibを使用しません。

これはコマンドプロンプトから実行されますが、IPythonNotebookからは実行されません。 エラーメッセージは-
AttributeError: Can't get attribute 'score_model' on <module '__main__' (built-in)>;

次に、IPythonと生成されたすべてのPythonインスタンスがアイドル状態になり(サイレントに)、再起動するまでPythonコードに応答しなくなります。

属性エラーを修正すれば、機能します。
IPythonノートブックでpylabのインポートを行いますか? それ以外の場合は、すべて同じである必要があります。

AttributeErrorの原因はわかりません... joblibsに関連している可能性が高いですが、_itはn_jobsが1_より大きい場合にのみ発生するため、 n_jobs=1で正常に実行されます。

このエラーは、IPython Notebookにif __name__ == '__main__'があるかどうかに関係なく、属性score_model__main__から欠落していることを示しています。

(エラー行が上に間違って貼り付けられていることに気づきました-上の投稿で編集しました。)

pylabは使用していません。

これが完全な拡張エラーメッセージです-http://pastebin.com/23y5uHT2

うーん、それはおそらくウィンドウズでのマルチプロセッシングの問題に関連しています。 たぶん@GaelVaroquauxまたは@ogriselが役立つでしょう。
ノートブックが__name__ == "__main__"何を作っているのかわかりません。
ノートブックではなく、別のファイルでメトリックを定義してインポートしてみてください。 私はそれがそれを修正すると思います。
これは実際にはGridSearchCVとは関係ありませんが、Windowsマルチプロセッシング、IPythonノートブック、およびjoblib間の興味深い相互作用です。

みんな...スレッドをありがとう。 とにかく、私は前にこのスレッドをチェックするべきでした、これで私の時間の5時間を無駄にしました。 並列処理で実行しようとしています。 どうもありがとう :)
フィードバックを追加するには:まだ凍結しています。 独自のmake_Scoreコスト関数が存在する場合、同じ問題に直面しました。システムがフリーズし始めます。 カスタムコスト関数を使用しなかった場合、並列処理でこれらのフリーズに直面しませんでした

これらの5時間をプロジェクトに役立つものに変える最良の方法は、問題を再現するスタンドアロンの例を提供することです。

ネストされた相互検証とn_jobs = -1内でカスタムスコアラーを使用しようとしてJupyterノートブックで動作しているWindows10で同じ問題が発生していました。 AttributeError: Can't get attribute 'custom_scorer' on <module '__main__' (built-in)>;メッセージが表示されていました。
@amuellerが提案したように、ノートブックでカスタムスコアラーを定義する代わりにインポートすることは機能します。

OSX10.10.5でもまったく同じ問題が発生します

こっちも一緒。
OSX 10.12.5

再現可能なコードスニペットを提供してください。 私たちはこれの底に到達したいと思います。 問題を示すデータを含むコードなしでは理解するのは難しいです。

これらの行をPythonシェルで実行するだけです

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

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

パイプラインからPCAステップを削除すると、問題が解決することに注意してください。

より詳しい情報:

ダーウィン-16.6.0-x86_64-i386-64ビット
( 'Python'、 '2.7.13(デフォルト、2017年4月4日、08:47:57)\ n [GCC4.2.1互換性のあるAppleLLVM 8.1.0(clang-802.0.38)]')
( 'NumPy'、 '1.12.1')
( 'SciPy'、 '0.19.1')
( 'Scikit-Learn'、 '0.18.2')

カスタムスコアラーを使用していないので、それが
別の問題?

2017年8月8日午後6時15分、「boazsh」 [email protected]は次のように書いています。

これらの行をPythonシェルで実行するだけです

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

X = np.random.sample((1000、100))
Y = np.random.sample((1000))> 0.5
svc_pipeline = Pipeline([( 'pca'、PCA(n_components = 95))、( 'svc'、SVC())])
予測= cross_val_predict(svc_pipeline、X、Y、cv = 30、n_jobs = -1)printclassification_report(Y、predictions)

パイプラインからPCAステップを削除すると、問題が解決することに注意してください。

より詳しい情報:

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


あなたがコメントしたのであなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-320885103
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/AAEz6-6Klhc67b5kZ17fFTxc8RfZQ_BWks5sWBkLgaJpZM4BkiD9

この問題に最初に直面したとき、私はカスタムスコアラーを使用していましたが、サンプルコードをできるだけ単純化しようとすると、必ずしもカスタムスコアラーを含める必要がないことがわかりました。 少なくとも私のマシンでは。 私の場合、スコアラーをインポートしても役に立ちませんでした。 とにかく、症状は似ています。 スクリプトは永久にハングし、CPU使用率は低くなります。

@boazshはスニペットに感謝しますが、決定論的ではありません。編集してnp.random.RandomStateを使用して、実行ごとに乱数が常に同じになるようにすることはできますか。

また、たとえばhttps://github.com/scikit-learn/scikit-learn/issues/5115#issuecomment-187683383で提案されているPython3を使用している場合は、回避策があります。

現時点ではOSXでこれをテストする方法はありませんが、数日中に試すことができるかもしれません。

持っておくと便利な情報(以前のコメントhttps://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-320885103に不足しているものを追加するだけです):

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

また、scikit-learn、pip、conda、OSXパッケージマネージャーの1つ(brewなど)をどのようにインストールしましたか?

スニペットを更新しました(np.random.seedを使用)

ダーウィン-16.6.0-x86_64-i386-64ビット
( 'Python'、 '2.7.13(デフォルト、2017年4月4日、08:47:57)\ n [GCC4.2.1互換性のあるAppleLLVM 8.1.0(clang-802.0.38)]')
( 'NumPy'、 '1.12.1')
( 'SciPy'、 '0.19.1')
( 'Scikit-Learn'、 '0.18.2')

スニペットを更新しました(np.random.seedを使用)

どうもありがとうございました!

また、scikit-learn、pip、conda、OSXパッケージマネージャーの1つ(brewなど)をどのようにインストールしましたか?

あなたはこれに答えましたか、私はあなたの答えを見つけることができません...

申し訳ありませんが、それを逃しました-ピップ。

FWIW、次のスニペットを実行しても問題ありません。

インポートプラットフォーム; print(platform.platform())
ダーウィン-16.7.0-x86_64-i386-64ビット
sysをインポートします。 print( "Python"、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"、numpy .__ version__)
NumPy 1.13.1
scipyをインポートします。 print( "SciPy"、scipy .__ version__)
SciPy 0.19.1
sklearnをインポートします。 print( "Scikit-Learn"、sklearn .__ version__)
Scikit-Learn0.18.2

cross_val_predictにもverbose = 10を入れていただければ、おそらく
それがあなたのためにどこで壊れるのか分かりますか?

22時59時2017年8月8日、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 XVMで問題を再現できません。 @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バックエンドによって普遍的に解決されます//github.com/scikit-learn/scikit-learn/issues/7650

マルチプロセッシングの修正がscikit-learnバージョンに依存していることは、ベンダーの問題の兆候です。

マルチプロセッシングの修正がscikit-learnバージョンに依存していることは、ベンダーの問題の兆候です。

私は最近、興味深いと思った以下を読みました。
https://lwn.net/Articles/730630/rss

RandomizedSearchCVでも同様の問題があります。 それは無期限にハングします。 私は3年前のmacbookpro、16GBのRAMとコアi7を使用しており、scikit-learnのバージョンは0.19です。

不可解な部分はそれが先週の金曜日に働いていたということです!!! 月曜日の朝、私は戻って走ろうとしました、そしてそれはただフリーズします。 以前の実行から、終了するのに約60分かかることはわかっていますが、それよりもずっと長く待っても何も起こりません。ハングし、エラーメッセージも表示されず、コンピューターが熱くなり、明日がないように電力を消費します。 以下のコード。 ここでいくつかのコメントを読んだ後、n_iterを2およびn_jobs = 1に変更してみましたが、うまくいきました。 したがって、n_jobs = -1と関係がある可能性があります。 それでも、このコードは先週の金曜日に正常に機能しました。 月曜日が嫌いです。 私のデータセットサイズは、次元が100未満の2万例未満です。

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 = False?

これは、この@KaisJMの問題は、私たちの参照、マルチプロセッシングを加速する上でよく知られている制限によるものである可能性が非常に高いの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はanacondaの一部だと思いますが、pip(pip install --upgrade sklearn)でアップグレードしましたが、この問題が発生する前にアップグレードしました。0.19にアップグレードした後、コードを正常に実行しました。

上記のプリントの出力は次のとおりです。

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

@jnothman :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でアップグレードされますが、これは不要です。

そうそう、ところで、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

うわー、3つのnumpyがインストールされました。以前は2つ見ましたが、3つはありませんでした...とにかく、これは私が言及した問題を示しているようです。

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オプションを使用します。

私が言及しなければならないことの1つは、作業していたpython env内にSpyderをインストールしたことです。ただし、SpyderとJupyterの両方にSpyderをインストールした後、コードを実行できました。

Spyderと上記のnumpysをアンインストールし、bampyをconda(scikitを0.19に更新)で再インストールしましたが、それでも同じエラーが発生します。 Spyderのインストールが原因で何かが発生した可能性がありますが、なぜ1日動作した後、突然停止するのでしょうか。

わかりました、何も機能していません!! (condaを使用して)新しい環境を作成し、そこにすべてを再インストールする必要がありますか? それはそれを解決しますか、それとも悪化させますか?

試してみる価値があります!

新しいenvを作成し、condaを使用してすべてをインストールしましたが、それでも無期限にフリーズします。 各パッケージなどのコピーは1つだけです。

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()の後に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はアプリではなく、豊かなエコシステムのライブラリです。 みんなが私たちのやっていることをやったら、すべてが崩壊してしまうでしょう。 これは、変更する必要があるという非常に明確なシグナルです。 そして、そのコメントから反対のことが当てはまる多くの環境があります。

私はグーグルクラウドコンピューティングエンジンでubuntu仮想インスタンスを使用しました(でこぼこ、スパイシー、scikitなどは最新ではありませんでした)。 コードは正常に実行されました。 次に、Gensimをインストールしました。 これにより、numpyとscipyが最新バージョンに更新され、必要な他のいくつかのもの(boto、bz2file、smart_open)がインストールされました。 その後、コードがフリーズします。 これが、このフリーズの原因についての有用な手がかりになることを願っています。

Gensimをインストールした後
numpy(1.10.4)がnumpy(1.13.3)に更新されました
scipy(0.16.1)がscipy(0.19.1)に更新されました

より詳しい情報:
調査を行ったところ、libblas、liblapack、liblapack_atlasが/ usr / lib /にないことがわかりました。また、ディレクトリ/ usr / lib / atlas-base /も見つかりませんでした。 それらがそこにあり、gensimをインストールすると、numpyなどが更新されたため、それらが削除されたかどうかはわかりませんが、これは、gensimをインストールする前にコードが機能したためと考えられます。 高度な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で行ったことをフォローするのは少し難しいです。 メンテナの観点から、必要なのは、再現できるかどうかを確認するための完全にスタンドアロンのPythonスニペットです。 再現できれば、何が起こっているのかを調べて理解することができます。 gensimをインストールし、この動作を一貫して再現できる場合にのみ発生する場合は、問題のあるPython環境と問題のないPython環境を作成する方法の完全な手順が必要になります。

これには無視できない時間と労力が必要です。私は完全に同意しますが、それがなければ、あなたが直面している問題を調査するためにできることはあまりありません。

高度なインストール手順に従って

ちなみに、 @ KaisJMは、最近のホイールがLinuxで利用可能であり、独自のOpenBLASが含まれているため、このページは古くなっています。 リリースされたscikit-learnをpipでインストールすると、OpenBLASを使用することになります。

@lesteveは、Openblasがもうフリーズを引き起こさないと言っていますか?

@lesteve paulaが、同じ問題を抱えているスニペットを投稿しました。 完全なコードではないことがわかりますが、手がかりが得られることを願っています。 ここでスニペットを「完全」にして投稿できます。 ただし、「古くなった」-あなたがそれを呼ぶように-指示ページはそれほど古くないかもしれないことは明らかです。 最も可能性が高いのは、OpenBLASがそのページで話している料金を引き起こしていることです。

これらの指示は時代遅れです私を信じてください。 詳細を読むと、「ただし、OpenBLASバージョン0.2.8-4より前のjoblib /マルチプロセッシングはフリーズする可能性があります」と書かれています。 最近のnumpyホイールを確認したところ、OpenBLAS0.2.8.18が含まれています。 彼らが言及しているフリーズは、 https: //github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-334155175にあるフリーズです。

完全なコードではないことがわかりますが、手がかりが得られることを願っています

そんなことはありません。 凍結がまだ発生する可能性があることを示していると思われるユーザーの報告がありますが、いずれもAFAIKを再現することはできませんでした。 これは、この問題が特定の要因の組み合わせで発生することを示しているようです。 問題を抱えている人が時間をかけて制御された方法で複製する方法を理解し、私たちが何とか複製できない限り、それについて何もすることはできません。

ここでスニペットを「完全」にして投稿できます

それは素晴らしいことです。 そのようなスニペットが別のconda環境(または使用するものによってはvirtualenv)でフリーズを引き起こすかどうかを確認できれば、それは素晴らしいことです。

@lesteve @paulaceccon :Paulaの抜粋コードを取得して、実行可能な完全なコードスニペットを作成しました。 Jupyterセルに貼り付けて実行するだけです。 ポーラ:このスニペットをフリーズさせることができませんでした。 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の推奨事項に従い、環境をチェックし、pipでインストールされたnumpyを削除しました:

ダーウィン-16.6.0-x86_64-i386-64ビット
Python 3.6.1 | Anacondaカスタム(x86_64)| (デフォルト、2017年5月11日、13:04:09)
[GCC4.2.1互換性のあるAppleLLVM 6.0(clang-600.0.57)]
NumPy 1.13.1
SciPy 0.19.1
Scikit-Learn0.19.0

$ condaリスト| grep numpy
gnumpy 0.2 pip
numpy 1.13.1 py36_0
numpy 1.13.3 pip
numpydoc 0.6.0 py36_0

$ pipアンインストールnumpy

$ condaリスト| grep numpy
gnumpy 0.2 pip
numpy 1.13.1 py36_0
numpydoc 0.6.0 py36_0

$ conda install numpy -f //おそらく不要

$ condaリスト| grep numpy
gnumpy 0.2 pip
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}、 'criterion': '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)]
NumPy 1.14.1
SciPy 1.0.0
Scikit-Learn0.19.1

問題を再現するためのスタンドアロンスニペットを提供できますか? 詳細については、 https://stackoverflow.com/help/mcveをお読み

これは、Windowsの問題と同じ古いマルチプロセッシングだと思います。 FAQを参照してください

thomberg1のhttps://github.com/scikit-learn/scikit-learn/issues/2889#issuecomment-337985212でコードをテストしました。

OS:Windows 10 x64 10.0.16299.309
Pythonパッケージ:WinPython-64bit-3.6.1
numpy(1.14.2)
scikit-learn(0.19.1)
scipy(1.0.0)

JupyterNotebookとコマンドラインで正常に機能しました。

こんにちは、私は同じ問題を抱えているので、ほぼ同じスレッドにつながる可能性のある新しいものを開きたくありませんでした。

-マックOS
-アナコンダ
-scikit-learn 0.19.1
-scipy 1.0.1
-numpy 1.14.2

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

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

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


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

コードはチュートリアルからのものです: https
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、 'エポック':5、 'init': 'glorot_uniform'、 'オプティマイザー': 'adam'}
0.621094(0.036225)with:{'batch_size':5、 'epochs':5、 'init': 'glorot_uniform'、 'optimizer': 'rmsprop'}
0.675781(0.006379)with:{'batch_size':5、 'epochs':5、 'init': 'glorot_uniform'、 'optimizer': 'adam'}
..。
0.651042(0.025780)with:{'batch_size':20、 'epochs':5、 'init': 'uniform'、 'optimizer': 'adam'}


必要に応じてバージョン情報
sys 3.6.4 |アナコンダカスタム(64ビット)| (デフォルト、2018年1月16日、12:04:33)
[GCC4.2.1互換Clang4.0.1(タグ/ RELEASE_401 / final)]
numpy 1.14.2
パンダ0.22.0
sklearn 0.19.1
トーチ0.4.0a0 + 9692519
IPython 6.2.1
keras 2.1.5

コンパイラ:GCC4.2.1互換Clang4.0.1(tags / RELEASE_401 / final)
システム:ダーウィン
リリース:17.5.0
マシン:x86_64
プロセッサ:i386
CPUコア:24
通訳:64ビット

@ thomberg1に感謝しますが、追加します

import multiprocessing
if __name__ == '__main__':

助けにはならなかった。 問題はまだ同じです

GridsearchCVでカスタマイズされたスコアリング関数を使用する場合、私のマシンで同じ問題が発生します。
Python 3.6.4、
scikit-learn 0.19.1、
ウィンドウズ10。、
CPUコア:24

@byrony再現するコードを提供できますか? if __name__ == "__main__"か?

n_jobs=-1またはn_jobs=8GridsearchCV引数として使用しているが、デフォルトのスコアラー引数を使用している場合、マシンで同様の問題が複数回発生しました。

  • Python 3.6.5、
  • scikit-learn 0.19.1、
  • Arch Linux、
  • 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 OK、500k行で再度実行し、結果を投稿します。 ありがとう!

@ amueller

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

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

問題は、これらの結果が私のデータセット全体に最適であるかどうかわからないことです。 何かアドバイス?

RAMが不足しているようです。 代わりにKerasを使用してみてください。大規模なニューラルネットには、おそらくより良いソリューションです。

@amuellerああ、

これはカスタムスコアラーとは何の関係もありません。 これは、WindowsでのPythonマルチプロセッシングのよく知られた機能です。 if __name__ == '__main__'ブロックでn_jobs=-1を使用するすべてのものを実行する必要があります。そうしないと、フリーズ/クラッシュが発生します。 たぶん、これをどこか目立つ場所、たとえばREADMEで文書化する必要がありますか?

Windowsの場合に機能を変更するのはおそらくscikitのアイデアですか?
また、キューを使用してタスクをワーカープロセスのコレクションにフィードし、結果を収集します
ここで説明されているように: https
3.6の場合はこちら: https

@PGTBoosこれはscikit-learn0.20.0で修正されています

このページは役に立ちましたか?
0 / 5 - 0 評価