R - 哪个种子分裂了?

Sha*_*ek 1 r

通常我们会在每次运行代码时修复种子编号以生成相同的分割.所以代码

set.seed(12345)
data <- (1:100)
train <- sample(data, 50)
test <- (1:100)[-train]
Run Code Online (Sandbox Code Playgroud)

总是提供相同的列车和测试集(因为我们修复了种子).

现在,假设我有数据,训练和测试.有没有办法知道用于生成火车的哪个种子数和从数据中测试??? 最好成绩.

Dav*_*son 8

用绝对的数学确定性来知道是不可能的:但是如果你怀疑种子所处的范围,你可以通过"强力"检查该范围内的每一粒种子,看看它是否会导致相同的结果.

例如,您可以使用以下代码检查1到100万的种子:

tests <- sapply(1:1e6, function(s) {
  set.seed(s)
  this_train <- sample(data, 50)

  all(this_train == train)
})

which(tests)
# 12345
Run Code Online (Sandbox Code Playgroud)

几点说明:

  • 如果您的数据集或样本要小得多,您将开始获得碰撞 - 多个种子提供相同的输出.例如,如果您从10而不是50从100采样5,则1:1e6范围内有34个种子会产生相同的结果.
  • 如果你完全没有关于种子是如何设置的怀疑,你必须从检查-.Machine$integer.max.Machine$integer.max,这在我的电脑上需要4.2十亿检查(这将需要一段时间,你可能要弄巧关于未保存的结果).
  • 如果在之后生成随机数set.seed(),则需要在函数中的行set.seedsample行之间复制相同的行为.
  • sample设置种子后的行为可能在R的旧版本中有所不同,因此您可能无法重现在早期版本上创建的行为