私はscikit-learnとnumpyを使用していますが、作業を再現できるようにグローバルシードを設定します。
numpy.random.seed
またはrandom.seed
を使用する必要がありますか?
編集:コメント内のリンクから、それらは異なること、およびnumpyバージョンはスレッドセーフではないことを理解しています。データ分析用のIPythonノートブックを作成するために使用するものを具体的に知りたいです。 scikit-learnのアルゴリズムの中には、乱数の生成を伴うものもありますが、実行のたびにノートブックに同じ結果が表示されるようにします。
Np.random.seedまたはrandom.seedを使用する必要がありますか?
それは、コードでnumpyの乱数ジェネレーターを使用しているか、random
の乱数ジェネレーターを使用しているかによって異なります。
numpy.random
とrandom
の乱数ジェネレーターは完全に独立した内部状態を持っているため、numpy.random.seed()
はrandom.random()
によって生成されるランダムシーケンスに影響しません。同様にrandom.seed()
numpy.random.randn()
などには影響しません。コードでrandom
とnumpy.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
)。スクリプトに単一のグローバルシードを使用し、その後、並列関数のグローバルシードに基づいて新しいランダムシードを生成する傾向があります。