R 的 caTools Sample.Split 结果不正确
R's caTools Sample.Split Results Incorrect
我想通过说明这似乎是一个常见问题来开始我的问题:
- SplitRatio results with sample.split (caTools)
然而,我无法使用第一个问题中推荐的解决方案解决我的问题,而第二个问题从未得到解答。
在下面的代码中,我希望对四个结果中的每一个进行 100 次观察,显然 100/150 = 2/3:
library(caTools)
set.seed(123)
isample <- sample.split(iris[,1], SplitRatio = 2/3, group = NULL)
iris2 <- iris[isample,]
isample2 <- sample.split(iris[,1], SplitRatio = 2/3, group = NULL)
iris3 <- subset(iris, isample2 == T)
isample3 <- sample.split(iris$Sepal.Length, SplitRatio = 2/3, group = NULL)
sepal.length2 <- iris[isample3,1]
isample4 <- sample.split(iris$Sepal.Length, SplitRatio = 2/3, group = NULL)
sepal.length3 <- subset(iris[,1], isample4 == T)
但是,我在 iris2
和 iris3
以及向量 sepal.length2
和 sepal.length3
中得到了 104 个观测值。我确保每次都绘制一个新样本,以确保这不会因为样本函数中的舍入而变得奇怪。使用来自 iris
return 100 个观测值的第 2 列和第 3 列,但使用第 5 列 returns 99 个观测值。为什么更改列 return 不同的值?这个函数的一个常见错误是不小心给了它整个数据框,所以它根据列进行选择,但在这里我确保每次都给它一个向量。在最后两个例子中,我给它一个向量,然后从一个向量中确定分裂,它仍然不起作用。
如果有帮助,我是 运行 R 3.6.0 和 caTools 1.18.0 on OS X。我通常会使用 sample
或 sample.int
功能,所以我对caTools不是很熟悉
在[此处]使用可用的源文件进行一些搜索和一些测试后,1我开始意识到这是由于作者编写此函数时舍入误差的累积所致。循环开始 for( iU in 1:nU)
舍入每个标签的随机抽取次数,因此对于像 2/3 这样的比率和数据中出现 4 次的标签,我们最终得到 n = round(length(idx)*rat)
舍入到 3,或 8 * 2/3 舍入到 5。在循环过程中,这会导致结果计数过多。
Re-reading sample.split 文档,它说“将向量 Y 中的数据按预定义的比例分成两组,同时保留 Y 中不同标签的相对比例。”所以,我的结论是,这个函数试图保留向量中每个唯一标签的比率,这意味着它试图在萼片长度中保留 5.3 出现次数的 2/3,4.9 出现次数的 2/3等在每个测试和训练集中。此函数的用户宁愿有一个不精确的 testing/training 拆分和最终更精确的测试错误,因为他们可以期望保留每次出现的比率。由于此函数用于分类,因此我得出结论,我应该避免在数据中有许多唯一值的情况下使用它。
我想通过说明这似乎是一个常见问题来开始我的问题:
- SplitRatio results with sample.split (caTools)
然而,我无法使用第一个问题中推荐的解决方案解决我的问题,而第二个问题从未得到解答。
在下面的代码中,我希望对四个结果中的每一个进行 100 次观察,显然 100/150 = 2/3:
library(caTools)
set.seed(123)
isample <- sample.split(iris[,1], SplitRatio = 2/3, group = NULL)
iris2 <- iris[isample,]
isample2 <- sample.split(iris[,1], SplitRatio = 2/3, group = NULL)
iris3 <- subset(iris, isample2 == T)
isample3 <- sample.split(iris$Sepal.Length, SplitRatio = 2/3, group = NULL)
sepal.length2 <- iris[isample3,1]
isample4 <- sample.split(iris$Sepal.Length, SplitRatio = 2/3, group = NULL)
sepal.length3 <- subset(iris[,1], isample4 == T)
但是,我在 iris2
和 iris3
以及向量 sepal.length2
和 sepal.length3
中得到了 104 个观测值。我确保每次都绘制一个新样本,以确保这不会因为样本函数中的舍入而变得奇怪。使用来自 iris
return 100 个观测值的第 2 列和第 3 列,但使用第 5 列 returns 99 个观测值。为什么更改列 return 不同的值?这个函数的一个常见错误是不小心给了它整个数据框,所以它根据列进行选择,但在这里我确保每次都给它一个向量。在最后两个例子中,我给它一个向量,然后从一个向量中确定分裂,它仍然不起作用。
如果有帮助,我是 运行 R 3.6.0 和 caTools 1.18.0 on OS X。我通常会使用 sample
或 sample.int
功能,所以我对caTools不是很熟悉
在[此处]使用可用的源文件进行一些搜索和一些测试后,1我开始意识到这是由于作者编写此函数时舍入误差的累积所致。循环开始 for( iU in 1:nU)
舍入每个标签的随机抽取次数,因此对于像 2/3 这样的比率和数据中出现 4 次的标签,我们最终得到 n = round(length(idx)*rat)
舍入到 3,或 8 * 2/3 舍入到 5。在循环过程中,这会导致结果计数过多。
Re-reading sample.split 文档,它说“将向量 Y 中的数据按预定义的比例分成两组,同时保留 Y 中不同标签的相对比例。”所以,我的结论是,这个函数试图保留向量中每个唯一标签的比率,这意味着它试图在萼片长度中保留 5.3 出现次数的 2/3,4.9 出现次数的 2/3等在每个测试和训练集中。此函数的用户宁愿有一个不精确的 testing/training 拆分和最终更精确的测试错误,因为他们可以期望保留每次出现的比率。由于此函数用于分类,因此我得出结论,我应该避免在数据中有许多唯一值的情况下使用它。