我正在尝试将 iris 数据集拆分为训练集和测试集。我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
Run Code Online (Sandbox Code Playgroud)
我理解第一个查询。我有一个 0.1*150 个元素的向量(150 是数据集中的样本数)。但是,我应该在第二个查询中使用相同的向量,但我得到的是 17 个元素而不是 15 个元素的向量。
关于为什么我得到这些结果的任何想法?
Sepal.Length是一个数值特征;来自在线文档:
对于 numeric
y,样本根据百分位数分为几组部分,并在这些子组内完成采样。对于createDataPartition,百分位数是通过groups参数设置的。
groups:对于 numericy,分位数中的中断数
使用默认值:
groups = min(5, length(y))
您的情况如下:
由于您没有指定groups,因此它采用的值是min(5, 150) = 5Breaks;现在,在这种情况下,这些中断与自然分位数一致,即最小值、第一分位数、中位数、第三分位数和最大值 - 您可以从以下位置看到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
Run Code Online (Sandbox Code Playgroud)
对于数字特征,该函数将从上述中断(分位数)定义的 (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
Run Code Online (Sandbox Code Playgroud)
每个时间间隔到底会返回多少个样本?这里有一个要点 - 根据源代码的第 140 行,它将是1 号和 2 号之间的乘积的上限。样品和您的p;让我们看看您的情况应该是什么p = 0.1:
ceiling(l1*p) + ceiling(l2*p) + ceiling(l3*p) + ceiling(l4*p)
# 17
Run Code Online (Sandbox Code Playgroud)
答对了!:)