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

Posted

技术标签:

【中文标题】如何为 scikit-learn 播种随机数生成器?【英文标题】:How to seed the random number generator for scikit-learn? 【发布时间】:2017-04-06 15:10:17 【问题描述】:

我正在尝试为我的一些使用 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 的所有调用中都使用该种子?

【问题讨论】:

您的代码很可能还有其他问题!在 LR 和 Splitting 中使用种子就足以确保它的行为具有确定性! 我不确定它是否能解决您的确定性问题,但这不是使用带有scikit-learn 的固定种子的正确方法。实例化一个prng=numpy.random.RandomState(RANDOM_SEED) 实例,然后将其作为random_state=prng 传递给每个单独的函数。如果你只是通过RANDOM_SEED,每个单独的函数将重新启动并在不同的地方给出相同的数字,导致相关性不好。 @RobertKern 你能详细说明一下吗?我不太明白你要解释什么。但当然,使用 int-seed 是使这些函数具有确定性的有效方法。也许您正在谈论分布式种子的问题,但即使是这样,我也无法理解这是从哪里来的,那么还有更好的方法。 确定性并不是唯一重要的事情。统计独立性也很重要,您无法通过将相同的整数种子传递给同一管道中的多个 scikit-learn 函数来实现这一点。您希望管道中的所有函数都共享一个 RandomState 实例。 @RobertKern 这取决于环境/任务(当然还有 PRNG),但不适用于 OP 的问题。 【参考方案1】:
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_state 就是the docs describe:

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

【讨论】:

以上是关于如何为 scikit-learn 播种随机数生成器?的主要内容,如果未能解决你的问题,请参考以下文章

在 Javascript 中播种随机数生成器

在并行程序中播种随机数生成器

如何为字段的每个唯一值生成随机记录?

玩游戏也能学编程!少儿编程教育如何为中国AI时代“播种”?

如何为 T-SQL 选择中的每一行生成一个随机数?

如何为 scikit-learn 的高斯过程回归指定先验?