Воспроизводимое разбиение данных на обучение и тестирование в R - PullRequest
0 голосов
/ 12 октября 2018

Обычным способом выборки / разделения данных в R является использование sample, например, для номеров строк.Например:

require(data.table)
set.seed(1)

population <- as.character(1e5:(1e6-1))  # some made up ID names

N <- 1e4  # sample size

sample1 <- data.table(id = sort(sample(population, N)))  # randomly sample N ids
test <- sample(N-1, N/2, replace = F)
test1 <- sample1[test, .(id)]

Проблема в том, что это не очень устойчиво к изменениям данных.Например, если мы отбросим только одно наблюдение:

sample2 <- sample1[-sample(N, 1)]  

образцы 1 и 2 по-прежнему практически идентичны:

nrow(merge(sample1, sample2))

[1] 9999

И все жеРазделение строк дает очень разные тестовые наборы, хотя мы установили начальное число:

test2 <- sample2[test, .(id)]
nrow(test1)

[1] 5000

nrow(merge(test1, test2))

[1] 2653

OneМожно было бы выбрать конкретные идентификаторы, но это не было бы надежно, если наблюдения опущены или добавлены.

Какой способ сделать разделение более устойчивым к изменениям данных?А именно, есть ли назначение для проверки неизмененных на неизмененные наблюдения, не назначать отброшенные наблюдения и переназначать новые наблюдения?

1 Ответ

0 голосов
/ 12 октября 2018

Используйте хеш-функцию и выборку по модулю последней цифры:

md5_bit_mod <- function(x, m = 2L) {
  # Inputs: 
  #  x: a character vector of ids
  #  m: the modulo divisor (modify for split proportions other than 50:50)
  # Output: remainders from dividing the first digit of the md5 hash of x by m
  as.integer(as.hexmode(substr(openssl::md5(x), 1, 1)) %% m)
}

В этом случае лучше работает разбиение хеша, поскольку назначение теста / последовательности определяется хешем каждого объекта.а не по его относительному расположению в данных

test1a <- sample1[md5_bit_mod(id) == 0L, .(id)]
test2a <- sample2[md5_bit_mod(id) == 0L, .(id)]

nrow(merge(test1a, test2a))

[1] 5057

nrow(test1a)

[1] 5057

размер выборки не совсем 5000, потому что назначениеявляется вероятностным, но это не должно быть проблемой в больших выборках благодаря закону больших чисел.

См. также: http://blog.richardweiss.org/2016/12/25/hash-splits.html и https://crypto.stackexchange.com/questions/20742/statistical-properties-of-hash-functions-when-calculating-modulo

...