R-caret createDataPartition返回的样本数多于预期

时间:2017-10-05 08:45:45

标签: r dataset r-caret

我试图将虹膜数据集拆分为训练集和测试集。我像这样使用了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 个答案:

答案 0 :(得分:3)

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 

对于数字要素,该函数将占用上述间隔(分位数)定义的(4)间隔中每个p = 0.1的百分比;让我们看看每个区间有多少样本:

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

每个区间确切返回多少个样本?这是捕获 - 根据source code的第140行,它将是产品之间的 ceiling 。样本和你的p;让我们看一下p = 0.1

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

宾果! :)