如何使用 Scikit Learn 获得绝对可重复的结果?

Poe*_*dit 7 python scikit-learn random-seed

关于使用 运行机器学习算法时的播种系统Scikit-Learn,通常提到三种不同的事情:

  • random.seed
  • np.random.seed
  • random_stateat SkLearn(交叉验证迭代器、ML 算法等)

我已经在我的脑海这个常见问题SkLearn有关如何解决全球直播系统和物品,其指出,这不应该是一个简单的常见问题。

我的最终问题是在运行 ML 算法时如何获得绝对可重现的结果SkLearn

更详细地说,

  • 如果我只使用np.random.seed并且不指定任何random_stateSkLearn那么我的结果是否绝对可重现?

至少为了知识而提出一个问题:

  • 如何准确np.random.seedrandom_stateSkLearn是内部关系吗?如何np.random.seed影响播种系统 ( random_state)SkLearn并使其(至少在假设上)重现相同的结果?

bak*_*kka 7

定义随机种子将确保每次运行算法时,随机数都会生成相同的数字。恕我直言,只要我们使用相同的数据以及任何其他参数的相同值,结果将始终相同。

正如您在 sklearn 的常见问题解答中所读到的那样,无论您通过全局定义它numpy.random.seed()还是通过random_state在所有涉及的算法中设置参数来定义它,只要您为这两种情况设置相同的数字,它都是相同的。

我以 sklearn文档为例来说明它。

import numpy
from sklearn.model_selection import train_test_split
# numpy.random.seed(42)
X, y = np.arange(10).reshape((5, 2)), range(5)

#1 running this many times, Xtr will remain [[4, 5],[0, 1],[6, 7]].
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.33, random_state=42)

#2 try running this line many times, you will get various Xtr
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.33)
Run Code Online (Sandbox Code Playgroud)

现在取消第三行的注释。多次运行#2。Xtr一直会[[4, 5],[0, 1],[6, 7]]

通过numpy.random.seed(),它将种子设置为默认值(无),然后它将尝试从 /dev/urandom (或 Windows 类似物)读取数据(如果可用),否则从时钟读取种子。文档