【发布时间】:2022-10-23 04:03:34
【问题描述】:
我正在关注“Hands on Machine learning with Sci-kit learn and tensorflow 2nd edition”(ipynb link)的代码。在选择训练数据集和测试数据集的部分,作者提出了编写拆分函数的重要性,以便测试集在多次运行中保持一致,即使数据集被刷新。编写代码是为了使更新的数据集仍然具有正确的百分比 (test ratio) 来拆分测试集和训练集,但新的测试集不会包含以前在训练集中的任何实例。它通过为索引值 (identifier/id_x) 创建一个数字来实现这一点,如果该数字介于可以选择的可能数字范围的 0 和 (test ratio) 之间,则返回 true。
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]
这部分是有道理的,但我不明白的是如何使用来自skilearn 的函数train_test_split 来实现同样的事情如果整个数据集都更新了,那么测试集永远不会包含已经被选为训练集中的值。如果我们包含 random_state 参数并确保更新的数据集仅将行添加到现有数据集而不删除行,这是否已经包含在内?这是一个现实的要求吗?
这也是交叉验证需要担心的问题吗?
谢谢你的帮助。
【问题讨论】:
标签: scikit-learn