【问题标题】:What is the meaning of taking hash for consistent train-test set?为一致的训练测试集采用哈希是什么意思?
【发布时间】:2020-02-26 14:44:10
【问题描述】:

我是机器学习的新手,目前正在尝试理解书中动作背后的含义。作者将测试集和训练集分开,但他想解决每次运行新测试集的问题程序。

一个常见的解决方案是使用每个实例的标识符来决定它是否应该进入测试集(假设实例具有唯一且不可变的标识符)。例如,您可以计算每个实例标识符的哈希值,只保留哈希值的最后一个字节,如果该值小于或等于 51(约 256 的 20%),则将该实例放入测试集中。这可确保测试集在多次运行中保持一致,即使您刷新数据集也是如此。新的测试集将包含 20% 的新实例,但不会包含之前在训练集中的任何实例。这是一个可能的实现:

整个扩展让我感到困惑。 我不明白为什么我们首先要使用哈希。其次,关于 20% 新实例的行是什么意思?我们有一个新数据,它怎么会包含以前的实例训练集?或者即使刷新数据并且我们只更新测试集,训练是否完好无损? 取小于 51 的值是否可以让我们随机设置测试集,但通过代码的重复运行也一样?

为了更清楚,这里是代码:

def split_train_test(data, ratio):
    random_indeces = np.random.permutation(len(data))
    test_index = int(len(data) * ratio)
    train_data = random_indeces[test_index:]
    test_data = random_indeces[:test_index]
    return data.iloc[train_data], data.iloc[test_data]
train_set, test_set = split_train_test(housing, 0.2)


def test_set_check(identifier, test_ratio, hash): 
    return hash(np.int64(identifier)).digest()[-1] < 256 * test ratio


def split_train_test_by_id(data, test_ration, id_column, hash=hashlib.md5):
    ids = data[id_column]
    in_test_set = ids.apply(lambda id_: test_set_check(id_, test_ratio, hash))
    return data.loc[~in_test_set], data.loc[in_test_set]
housing_with_id = housing.reset_index()
train_set, test_set = split_train_test_by_id(housing_with_id, 0.2, 'index')

我试过在网上找资料,但无济于事。希望你能帮助我理解,不想在知识上留下空白。

【问题讨论】:

    标签: python machine-learning hash


    【解决方案1】:

    采用哈希数将所有 ID 转换为相同的固定长度。一旦我们实现了这一点,我们只保留每个哈希数的最后一个字节(8 位,2**8=256 个值),因此您已经随机映射了这 256 个值中的所有实例。如果我们取 0 到 51 之间的哈希值,我们会随机取 20% 的数据。新实例也随机映射到这 8 位,所以如果我们添加 'x' 个新实例,其中 20% 将落在 0 到 51 之间,您可以假设您的测试集是一致的。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2017-04-29
        • 2019-01-15
        • 1970-01-01
        • 2020-01-03
        • 2018-06-27
        • 1970-01-01
        • 2017-06-16
        • 2018-02-25
        • 2014-02-24
        相关资源
        最近更新 更多