I know sklearn has train_test_split()train_test_split()
to split a train and test set. But I read that, even with setting a random seed, if your actual dataset is updated regularly, the random seed will reset with each updated dataset and take a different train/test split. Doing this, your ML algos will eventually cover the whole dataset, defeating the purpose of the train/test split because it'll eventually train on too much of the whole dataset over time.
The book I'm reading (Hands-On Machine Learning with Scikit-Learn and Tensorflow) gives this code to split train/test by 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]
And it says when there's no ID column given, to create one either by indexing the rows or creating a unique index from one of the variables.
My questions are:
What is the 3rd line doing:
crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32
crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32
What is the anonymous function doing in the 2nd to last line?
lambda id_: test_set_check(id_, test_ratio)
lambda id_: test_set_check(id_, test_ratio)
In practice, do you commonly split datasets by id in this manner?
Thanks,
Greg