【发布时间】: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