Я абсолютный новичок в машинном обучении и в настоящее время пытаюсь понять значение, стоящее за действием в книге. Автор разделил тестовый набор и набор обучающих программ, но затем он хотел решать проблему нового тестового набора каждый раз, когда мы запускаемprogramm.
Распространенным решением является использование идентификатора каждого экземпляра, чтобы решить, должен ли он идти в тестовом наборе (при условии, что экземпляры имеют уникальный и неизменный идентификатор). Например, вы можете вычислить хеш идентификатора каждого экземпляра, сохранить только последний байт хеша и поместить экземпляр в набор тестов, если это значение меньше или равно 51 (~ 20% из 256). Это гарантирует, что набор тестов останется непротиворечивым при нескольких запусках, даже если вы обновите набор данных. Новый набор тестов будет содержать 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')
Я пытался искать информацию в сети, но безрезультатно. Надеюсь, вы поможете мне понять, не хотите оставлять пробелы в знаниях.