计算完哈希值后,只保留哈希值的最后一个字节有什么意义



Problem: To generate Test and train to improve on Generalization error.可能的解决方案: 1. 将实例拆分为训练 80% 和测试 20%,在训练集上训练模型,在测试集上测试。但是一次又一次地重复上述内容会以某种方式让模型填充数据,因为在多次时间分割中会将测试集的第一次选择实例选择到训练集中(随机抽样)。

当我们获取更新的数据集时,上述方法可能会失败。 另一种方法是选择每个实例最稳定的功能(组合可以是),以创建一个唯一且不可变的标识符,即使在数据集更新后,该标识符仍将保持健壮。选择一个后,我们可以计算每个实例标识符的哈希值,仅保留哈希值的最后两个字节,如果值为 <= 256 * test_ratio.},则将实例放入测试集中。这将确保测试集在多次运行中保持一致,即使刷新数据集也是如此。

Question: What is the significance of just taking last two bytes of the computed hash? 

-----感谢Aurélien Géron-------

我们需要一个解决方案来采样一个独特的测试集,即使在获取更新的数据集之后也是如此。SOLUTION: to use each instance's identifier to decide whether or not it should go to test_set.{Assuming that the instances have a unique and immutable identifier. we could compute a hash of each instance's identifier, keep only the last bytes of the hash, and put the instance in the test set if value is <= 256*test_ratio i.e 51}

这可确保测试集在多次运行中保持一致,即使您刷新数据集也是如此。新test_set将包含 20% 的新实例,但不包含以前在train_set中的任何实例。 首先,快速回顾一下哈希函数:

  • A hash function f(x) is deterministic, such that if a==b, then f(a)==f(b).
  • 而且,如果a!=b,那么很有可能f(a)!=f(b). 有了这个定义,像f(x)=x%12345678这样的函数(其中%是模运算符)满足上述标准,因此它在技术上是一个哈希函数。但是,大多数哈希函数超出了此定义,它们的行为或多或少类似于伪随机数生成器,因此,如果您计算f(1), f(2), f(3),...,输出将非常像随机序列(通常非常大)数字。

我们可以使用这样的"随机外观"哈希函数将数据集拆分为训练集和测试集。

让我们以 MD5 哈希函数为例。它是一个随机的哈希函数,但它输出相当大的数字(128 位),例如136159519883784104948368321992814755841.

对于数据集中的给定实例,其 MD5 哈希小于 2^127 的可能性为 50%(假设哈希是无符号整数),小于 2^126 的可能性为 25%,小于 2^125 的可能性为 12.5%。因此,如果我想将数据集拆分为训练集和测试集,其中 87.5% 的实例在训练集中,12.5% 的实例在测试集中,那么我需要做的就是计算实例的一些不变特征的 MD5 哈希,并将 MD5 哈希小于 2^125 的实例放入测试集中。

如果我希望精确地将 10% 的实例放入测试集,那么我需要检查MD5 < 2^128 * 10 / 100. 这将正常工作,如果您愿意,您绝对可以通过这种方式实现它。但是,这意味着操作大整数,这并不总是很方便,特别是考虑到Python的hashlib.md5()函数输出字节数组,而不是长整数。因此,只需在哈希中获取一个或两个字节(您希望的任何位置)并将它们转换为常规整数会更简单。如果你只取一个字节,它看起来像一个从 0 到 255 的随机数。 如果你想在测试集中有 10% 的实例,你只需要检查字节是小于还是等于 25。它不会正好是 10%,但实际上26/256=10.15625%,但这已经足够接近了。如果需要更高的精度,则可以使用 2 个或更多字节。

最新更新