如何为scikit-learn种下随机数生成器?

时间:2016-11-22 19:47:36

标签: python numpy random scikit-learn random-seed

我正在尝试为使用scikit-learn的一些代码编写单元测试。但是,我的单元测试似乎是不确定的。

AFAIK,我的代码中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的调用中使用种子?

1 个答案:

答案 0 :(得分:2)

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。你做的方式似乎没问题。另一种方法是set np.random.seed()或使用Sacred来记录随机性。使用random_statethe docs describe

  

如果您的代码依赖于随机数生成器,则不应使用numpy.random.randomnumpy.random.normal等函数。这种方法可能导致单元测试中的重复性问题。相反,应该使用numpy.random.RandomState对象,该对象是根据传递给类或函数的random_state参数构建的。