如何使用哈希码方法将数据集分为训练和测试数据集

时间:2019-11-12 02:21:15

标签: machine-learning train-test-split

我正在遵循Hands on Machine learning with Sci-kit learn and tensorflow 2nd edition的代码。在创建训练和测试数据集部分中,他们按照此过程创建训练和测试数据集,如下所示:

from zlib import crc32

def test_set_check(identifier, test_ratio):
    return crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32

def split_train_test_by_id(data, test_ratio, id_column):
    ids = data[id_column]
    in_test_set = ids.apply(lambda id_: test_set_check(id_, test_ratio))
    return data.loc[~in_test_set], data.loc[in_test_set]

housing_with_id = housing.reset_index()   # adds an `index` column
train_set, test_set = split_train_test_by_id(housing_with_id, 0.2, "index")

根据作者:

  

您可以计算每个实例标识符的哈希值,如果该哈希值小于或等于最大哈希值的20%,则将该实例放入测试集中。这样可以确保即使刷新数据集,测试集在多个运行中也将保持一致。新的测试集将包含20%的新实例,但将不包含训练集中的任何先前实例。

因此,我想了解以下代码行的作用:crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这可能有点晚了,但是如果您仍在寻找答案,这里是crc32函数的documentation的形式:

在3.0版中进行了更改:始终返回无符号值。产生 在所有Python版本和平台上都使用相同的数值,请使用 crc32(data)和0xffffffff。

因此,从本质上讲,它只是确保谁运行此功能,无论他们运行的是Python 2还是3,都无关紧要。