我正在尝试为使用scikit-learn的代码编写单元测试。然而,我的单元测试似乎是不确定性的。
据我所知,在我的代码中scikit-learn使用随机性的唯一位置是它的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-learn,以便该种子在scikit-learn的所有调用中都被使用?
scikit-learn
中固定种子的正确方法。实例化一个prng=numpy.random.RandomState(RANDOM_SEED)
实例,然后将其作为random_state=prng
传递给每个单独的函数。如果只传递RANDOM_SEED
,每个单独的函数都会重新启动并在不同的位置给出相同的数字,导致不良相关性。 - Robert Kernrandom_state=
参数的管道部分来解决)。这就是为什么我把它放在评论中的原因。我要明确声明,我提到的方法是使用指定种子的OP环境/任务和PRNG的唯一正确方法。 - Robert Kern