2016-11-22 5 views
2

私は、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の呼び出しのすべてでシードが使用されるように、シークレットを単一の場所で学習しますか?

+2

コードに間違いがある可能性が非常に高いです。 LRと分割でシードを使用すると、確定的に動作することが確認できます。 – sascha

+1

決定論の問題を解決できるかどうかは分かりませんが、これは 'scikit-learn'で固定された種を使う正しい方法ではありません。 'prng = numpy.random.RandomState(RANDOM_SEED)'インスタンスをインスタンス化し、それを 'random_state = prng'として個々の関数に渡します。 'RANDOM_SEED'を渡しただけでは、個々の関数がそれぞれ再起動し、異なる場所に同じ番号が与えられ、相関が悪くなります。 –

+0

@RobertKern詳しいことはできますか?あなたが何を説明しようとしているのかよく分かりません。しかし、もちろん、int-seedを使用することは、これらの関数を確定的にする有効なアプローチです。たぶん、あなたは分散型シーディングの問題について話しているかもしれませんが、そうであっても、どこから来ているのか理解できず、より良いアプローチもあります。 – sascha

答えて

0
from sklearn import datasets, linear_model 
iris = datasets.load_iris() 
(X, y) = iris.data, iris.target 
RANDOM_SEED = 5 
lr = linear_model.LogisticRegression(random_state=RANDOM_SEED) 
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=RANDOM_SEED) 
lr.fit(X_train, y_train) 
lr.score(X_test, y_test) 

0.93333333333333335を数回作成しました。あなたのやり方は大丈夫です。もう1つの方法はset np.random.seed()です。文書化されたランダム性についてはSacredを使用してください。 random_stateを使用すると、どのようなthe docs describeです:

あなたのコードは、乱数発生器に依存している場合、それはnumpy.random.randomまたはnumpy.random.normalのような機能を使用しないでください。このアプローチは、単体テストで再現性の問題を引き起こす可能性があります。その代わりに、引数からクラスまたは関数に渡されるnumpy.random.RandomStateオブジェクトを使用する必要があります。

関連する問題