【问题标题】:R - caret createDataPartition returns more samples than expectedR - caret createDataPartition 返回比预期更多的样本
【发布时间】:2018-03-16 19:44:01
【问题描述】:

我正在尝试将 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

我理解第一个查询。我有一个 0.1*150 个元素的向量(150 是数据集中的样本数)。但是,我应该在第二个查询中使用相同的向量,但我得到的是 17 个元素而不是 15 个元素的向量。

关于我为什么得到这些结果的任何想法?

【问题讨论】:

  • 我不知道为什么会这样。我会通过inds <- sample(1:nrow(iris), size=0.1*nrow(iris), replace=FALSE) 以不同的方式解决它,然后使用testdata <- iris[inds, ]traindata <- iris[-inds, ]。据我所知,sample() 函数与createDataPartition() 的作用相同,只是createDataPartition() 考虑到它创建了一个有代表性的训练数据集(一些低值、一些高值等)
  • 你问为什么会得到这些结果,你得到了详细的解释——你为什么不接受答案??

标签: r dataset r-caret


【解决方案1】:

Sepal.Length 是一个数字特征;来自在线文档:

对于数字 y,样本会根据百分位数分成几组部分,并在这些子组内进行抽样。对于createDataPartition,百分位数通过groups 参数设置。

groups:对于数字y,分位数中的中断数

使用默认值:

groups = min(5, length(y))

您的情况如下:

由于你没有指定groups,所以它需要一个值min(5, 150) = 5休息;现在,在这种情况下,这些中断与自然分位数一致,即最小值、第一分位数、中位数、第三分位数和最大值 - 您可以从 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

宾果! :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-20
    • 2018-07-31
    • 2021-08-01
    • 2015-05-14
    • 1970-01-01
    • 2023-01-26
    • 2020-08-23
    • 2019-03-20
    相关资源
    最近更新 更多