Что означает взятие хэша для последовательного набора тестов? - PullRequest
1 голос
/ 31 октября 2019

Я абсолютный новичок в машинном обучении и в настоящее время пытаюсь понять значение, стоящее за действием в книге. Автор разделил тестовый набор и набор обучающих программ, но затем он хотел решать проблему нового тестового набора каждый раз, когда мы запускаем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')

Я пытался искать информацию в сети, но безрезультатно. Надеюсь, вы поможете мне понять, не хотите оставлять пробелы в знаниях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...