私は、scikit-learnを使用する私のコードのいくつかの単体テストを書こうとしています。しかし、私の単体テストは非決定論的なようです。scikit-learnの乱数ジェネレータをシードする方法は?
私の知る限り、scikit学習はどのランダム性を使用しています私のコードで唯一の場所は、そのLogisticRegression
モデルであり、そのtrain_test_split
ので、私は、次があります。
RANDOM_SEED = 5
self.lr = LogisticRegression(random_state=RANDOM_SEED)
X_train, X_test, y_train, test_labels = train_test_split(docs, labels, test_size=TEST_SET_PROPORTION, random_state=RANDOM_SEED)
しかし、これは動作するようには思えません - - 固定番号docs
と固定番号labels
を渡しても、固定された検証セットの予測確率は実行ごとに異なります。
また、私のコードの一番上にnumpy.random.seed(RANDOM_SEED)
コールを追加しようとしましたが、それはどちらかと思われませんでした。
紛失しているものはありますか? scikitにシードを渡す方法はありますか?scikit-learnの呼び出しのすべてでシードが使用されるように、シークレットを単一の場所で学習しますか?
コードに間違いがある可能性が非常に高いです。 LRと分割でシードを使用すると、確定的に動作することが確認できます。 – sascha
決定論の問題を解決できるかどうかは分かりませんが、これは 'scikit-learn'で固定された種を使う正しい方法ではありません。 'prng = numpy.random.RandomState(RANDOM_SEED)'インスタンスをインスタンス化し、それを 'random_state = prng'として個々の関数に渡します。 'RANDOM_SEED'を渡しただけでは、個々の関数がそれぞれ再起動し、異なる場所に同じ番号が与えられ、相関が悪くなります。 –
@RobertKern詳しいことはできますか?あなたが何を説明しようとしているのかよく分かりません。しかし、もちろん、int-seedを使用することは、これらの関数を確定的にする有効なアプローチです。たぶん、あなたは分散型シーディングの問題について話しているかもしれませんが、そうであっても、どこから来ているのか理解できず、より良いアプローチもあります。 – sascha