为什么有人会使用散列函数来创建测试/训练拆分而不是随机种子?

机器算法验证 机器学习 假设检验 火车 哈希
2022-03-25 15:52:48

我正在浏览一些来自 Google 的 ML 培训材料(我无法发布链接,因为我是通过我的公司获取这些材料的)。

在关于如何提取数据并将其拆分为训练集和测试集的部分中,他们在其中一个数据字段上使用哈希函数来提供确定性和可重复的测试/训练拆分,而不是随机拆分。

但是不能用 random.seed 函数来完成同样的事情吗?

此外,使用散列函数意味着我们不能再使用生成散列的字段(这可能对模型有用),或者它可能会在模型中插入一些未知的偏差?

使用散列函数比使用随机种子有什么优势?

1个回答

但是不能用 random.seed 函数来完成同样的事情吗?... 与使用随机种子相比,使用哈希函数有什么优势?

当您无法将整个数据集放入内存时,采样就不那么直接了。在 DBMS 的上下文中,本文建议RAND()在编写 SQL 时使用种子可能无法重现。这是由于应用程序的多线程特性,它不能保证返回项目的顺序(除非您添加ORDER BY子句,这可能很昂贵)。这篇文章的作者通过散列每一行中的一个日期字段来解决这个问题。

另一个可能的用例是处理文件时。如果我有一个庞大的图像目录要用于训练/测试,那么使用文件名的散列可能会更容易,而不是尝试保持文件的可重现顺序。

此外,使用散列函数意味着我们不能再使用生成散列的字段(这可能对模型有用),或者它可能会在模型中插入一些未知的偏差?

计算字段的哈希与计算哈希然后覆盖原始值不同。哈希只会在其他一些内存块中计算,并用于将项目分配给训练/测试/验证集,就像生成随机数不会覆盖任何数据一样。

关于引入偏差,我在密码学网站上发现了这个问题,该网站试图解决 SHA-1 mod n 的统计特性。