我知道 sklearn 必须train_test_split()
拆分训练集和测试集。但我读到,即使设置了随机种子,如果您的实际数据集定期更新,随机种子将随着每个更新的数据集重置并采用不同的训练/测试拆分。这样做,您的 ML 算法最终将覆盖整个数据集,从而违背了训练/测试拆分的目的,因为随着时间的推移,它最终会在整个数据集的太多部分上进行训练。
我正在阅读的书(Hands-On Machine Learning with Scikit-Learn and Tensorflow)提供了此代码以按 id 拆分训练/测试:
# Function to check test set's identifier.
def test_set_check(identifier, test_ratio):
return crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32
# Function to split train/test
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]
它说当没有给出 ID 列时,通过索引行或从变量之一创建唯一索引来创建一个。
我的问题是:
第三行在做什么:
crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32
第 2 行到最后一行的匿名函数在做什么?
lambda id_: test_set_check(id_, test_ratio)
在实践中,您通常以这种方式按 id 拆分数据集吗?
谢谢,
格雷格