我试图将虹膜数据集拆分为训练集和测试集。我像这样使用了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个。
为什么我得到这些结果的任何想法?
答案 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
宾果! :)