web-dev-qa-db-ja.com

`scikit-learn`での乱数生成を制御するために` random.seed`または `numpy.random.seed`を使用する必要がありますか?

私はscikit-learnとnumpyを使用していますが、作業を再現できるようにグローバルシードを設定します。

numpy.random.seedまたはrandom.seedを使用する必要がありますか?

編集:コメント内のリンクから、それらは異なること、およびnumpyバージョンはスレッドセーフではないことを理解しています。データ分析用のIPythonノートブックを作成するために使用するものを具体的に知りたいです。 scikit-learnのアルゴリズムの中には、乱数の生成を伴うものもありますが、実行のたびにノートブックに同じ結果が表示されるようにします。

32
shadowtalker

Np.random.seedまたはrandom.seedを使用する必要がありますか?

それは、コードでnumpyの乱数ジェネレーターを使用しているか、randomの乱数ジェネレーターを使用しているかによって異なります。

numpy.randomrandomの乱数ジェネレーターは完全に独立した内部状態を持っているため、numpy.random.seed()random.random()によって生成されるランダムシーケンスに影響しません。同様にrandom.seed()numpy.random.randn()などには影響しません。コードでrandomnumpy.randomの両方を使用している場合は、両方のシードを個別に設定する必要があります。

更新

あなたの質問は、特にscikit-learnの乱数ジェネレータに関するもののようです。私の知る限り、scikit-learnは全体でnumpy.randomを使用するため、np.random.seed()ではなくrandom.seed()を使用する必要があります。

重要な注意点の1つは、np.randomはスレッドセーフではないことです。グローバルシードを設定し、複数のサブプロセスを起動し、np.randomを使用して乱数を生成すると、各サブプロセスはその親からRNG状態を継承します各サブプロセスで同一のランダム変量を取得します。この問題を回避する通常の方法は、異なるシード(またはnumpy.random.Randomインスタンス)を各サブプロセスに渡し、各サブプロセスが個別のローカルRNG状態を持つようにすることです。

Scikit-learnの一部はjoblibを使用して並行して実行できるため、一部のクラスおよび関数には、シードまたはnp.random.RandomStateインスタンス(たとえば、random_state=パラメーターを渡すオプションがあります- sklearn.decomposition.MiniBatchSparsePCA )。スクリプトに単一のグローバルシードを使用し、その後、並列関数のグローバルシードに基づいて新しいランダムシードを生成する傾向があります。

31
ali_m