首页 > 解决方案 > 为一致的训练测试集采用哈希是什么意思?

问题描述

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

一个常见的解决方案是使用每个实例的标识符来决定它是否应该进入测试集(假设实例具有唯一且不可变的标识符)。例如,您可以计算每个实例标识符的哈希值,只保留哈希值的最后一个字节,如果该值小于或等于 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')

我尝试在互联网上寻找信息,但无济于事。希望你能帮助我理解,不想在知识上留下空白。

标签: pythonmachine-learninghash

解决方案


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


推荐阅读