3

データに対していくつかの異なるモデルを試して相互検証したいので、結果はある程度信頼できます。

私の交差検証では、次のように呼び出します。

cross_val_score(model, X, y, scoring = 'mean_squared_error', cv=kf, n_jobs = -1)

これは、10 倍の交差検証を並行して行います。私が実行しているマシンには 40 個のコアと十分なメモリがあるため、「モデル」に 4 つの異なる値を並行して試して、それぞれ 10 倍の交差検証を行いたいと思います。

ただし、次の方法で joblib を使用して実行しようとすると、エラーが発生します。

results = Parallel(n_jobs = num_jobs)(delayed(crossVal)(model) for model in models)

/usr/local/lib/python2.7/dist-packages/sklearn/cross_validation.py:1433: UserWarning: Multiprocessing-backed parallel loops cannot be nested, setting n_jobs=1 for train, test in cv)

ここで、crossVal は私が定義したメソッドで、主に cross_val_score の呼び出しで構成されています。

いくつかの異なる python ファイルを手動で開始せずにこれを行うエレガントな方法はありますか?

4

1 に答える 1

1

Joblib はマルチプロセッシングとスレッド バックエンドを使用できます。デフォルトではマルチプロセッシングを使用します (これは CPython の実装によるもので、特定のケースでのみスレッドが高速になります。ここでは詳細には触れません。 CPython および Python GIL)。

これはエラーではなく、プロセスからプロセスを作成しようとしたことを示す単なる警告です。つまり、次の行で:

results = Parallel(n_jobs = num_jobs)(delayed(crossVal)(model) for model in models)

デフォルトで cross_val_score が multoprocessing を使用しているため、すでにいくつかのプロセス (n_jobs) を生成してから、cross_val_score内部で同じことを試みます(いくつかのプロセスを生成します)。crossValJoblib では、マルチプロセッシング バックエンドでそのようなことを行うことはできません。したがって、知る限り、この警告が表示され、ネストされた並列ループが単一プロセスで実行されます。つまり、cross_val_score内部は単一スレッドで実行されますが、crossVal関数はマルチプロセッシング モードで実行されます。

これら 2 つのマルチプロセッシング サイクルのいずれかを取り除くと、この警告を回避できます。つまり、ネストされたマルチプロセッシングを次の呼び出しで取り除くことができます。

cross_val_score(..., n_jobs=1)

crossVal関数で、またはcross_val_scoreマルチプロセッシングなしで単純なループで default を数回呼び出してから、結果を集計することができます。

results = [cross_val_score(estimator = est, ...) for est in estimators]

最初のケースでは同時に実行できますmin(n_models, n_jobs)(元のケースでは、joblib が警告を発した場合、暗黙的にこれを既に実行しています)、2 番目のケースでは - min(n_folds, n_cores). 実行したい場合は、 GridSearchCVmin(n_jobs, n_models*n_folds)を使用する必要があります。これは、内部的に次の方法でジョブを生成するためです。

    out = Parallel(
        n_jobs=self.n_jobs, verbose=self.verbose,
        pre_dispatch=pre_dispatch
    )(
        delayed(_fit_and_score)(clone(base_estimator), X, y, self.scorer_,
                                train, test, self.verbose, parameters,
                                self.fit_params, return_parameters=True,
                                error_score=self.error_score)
            for parameters in parameter_iterable
            for train, test in cv)
于 2015-12-01T03:09:36.517 に答える