R - caret createDataPartition возвращает больше образцов, чем ожидалось

Я пытаюсь разделить набор данных радужной оболочки на тренировочный набор и тестовый набор. я использовал createDataPartition() как это:

library(caret)
createDataPartition(iris$Species, p=0.1)
# [1]  12  22  26  41  42  57  63  79  89  93 114 117 134 137 142

createDataPartition(iris$Sepal.Length, p=0.1)
# [1]   1  27  44  46  54  68  72  77  83  84  93  99 104 109 117 132 134

Я понимаю первый запрос. У меня есть вектор 0,1*150 элементов (150 - это количество выборок в наборе данных). Тем не менее, у меня должен быть тот же вектор во втором запросе, но я получаю вектор из 17 элементов вместо 15.

Есть идеи, почему я получаю эти результаты?

1 ответ

Sepal.Length это числовая функция; из онлайн-документации:

Для числовых yвыборка делится на группы по процентам, и выборка проводится в этих подгруппах. За createDataPartitionколичество процентилей устанавливается через groups аргумент.

groups: для числовых y, количество перерывов в квантилях

со значением по умолчанию:

groups = min(5, length(y))

Вот что происходит в вашем случае:

Так как вы не указали groups, это принимает значение min(5, 150) = 5 перерывы; теперь, в этом случае, эти разрывы совпадают с естественными квантилями, то есть с минимумом, 1-м квантилем, медианой, 3-м квантилем и максимумом - что вы можете видеть из summary:

> summary(iris$Sepal.Length)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  4.300   5.100   5.800   5.843   6.400   7.900 

Для числовых функций функция будет брать процент p = 0.1 из каждого из (4) интервалов, определенных вышеуказанными перерывами (квантилями); давайте посмотрим, сколько образцов у нас за такой интервал:

l1 = length(which(iris$Sepal.Length >= 4.3 & iris$Sepal.Length <= 5.1)) # 41
l2 = length(which(iris$Sepal.Length > 5.1 & iris$Sepal.Length <= 5.8))  # 39
l3 = length(which(iris$Sepal.Length > 5.8 & iris$Sepal.Length <= 6.4))  # 35
l4 = length(which(iris$Sepal.Length > 6.4 & iris$Sepal.Length <= 7.9))  # 35

Сколько именно образцов будет возвращено из каждого интервала? Вот подвох - в соответствии со строкой № 140 исходного кода это будет потолок продукта между номерами. образцов и ваших p; давайте посмотрим, что это должно быть в вашем случае для p = 0.1:

ceiling(l1*p) + ceiling(l2*p) + ceiling(l3*p) + ceiling(l4*p)
# 17

Бинго!:)

Другие вопросы по тегам