1

我已经镜像了一些代码来执行分析,并且一切正常(我相信)。但是,我试图理解与将数据拆分为 40% 测试集和 60% 训练集相关的几行代码。

据我目前的理解,代码将每一行随机分配到第 1 组或第 2 组。随后,分配给 1 的所有行都被拉入训练集,而 2 则进入测试集。

后来,我意识到我不想在数据分析中使用替换抽样。尽管在这种情况下,我不确定实际替换的是什么。目前,我认为不是实际数据本身被替换,而是“1”和“2”占位符。我希望准确了解这些代码行的工作原理。根据我的结果,它似乎正在完成我想要的工作。我需要确认数据本身是否被替换。

为了测试有问题的行,我创建了一个具有 10 个唯一值(1 到 10)的数据框。

如果数据值本身被替换采样,我希望在“training1”或“testing2”中看到一些重复。我用 10 个不同的 set.seed 编号运行了这些代码行 10 次,并且数据值从未重复。对我来说,这表明数据本身没有被替换。

如果我设置 replace= FALSE 我得到这个错误:

Error in sample.int(x, size, replace, prob) : 
  cannot take a sample larger than the population when 'replace = FALSE'

set.seed(8)
test  <-sample(2, nrow(df), replace = TRUE, prob = c(.6,.4))

training1 <- df[test==1,]
testing2 <- df[test==2,]

我想将我的数据分成 60-40 个训练和测试。虽然我不确定这是否真的发生了。我认为 prob 函数没有做我认为应该做的事情。我注意到 prob 函数实际上并没有将数据完全分成 60% 和 40%。在 n=10 示例的情况下,它可能导致 7 训练 2 测试,甚至 6 训练 4 测试。对于我实际较大的数据集,~n=2000+,它的平均值非常接近 60/40(即 60.3/39.7)。

4

2 回答 2

0

您采样的方式必然会导致不希望的/随机拆分大小,除非观察的数量很大,正式称为大数定律。要进行更具确定性的拆分,请确定训练数据的观察大小/数量,并使用它从 中采样nrow(df)

set.seed(8)

# for a 60/40 train/test split
train_indx = sample(x = 1:nrow(df),
                    size = 0.6*nrow(df), 
                    replace = FALSE)

train_df <- df[train_indx,]
test_df <- df[-train_indx,]
于 2019-07-29T01:38:48.100 回答
0

我建议根据 Mankind_008 的回答拆分代码。由于我基于原始代码进行了相当多的分析,因此我花了几个小时研究它究竟做了什么。

原代码:

test  <-sample(2, nrow(df), replace = TRUE, prob = c(.6,.4))

来自( https://www.datacamp.com/community/tutorials/machine-learning-in-r)的回答:

“请注意,replace 参数设置为 TRUE:这意味着您将 1 或 2 分配给某一行,然后将 2 的向量重置为其原始状态。这意味着,对于数据集中的下一行,您可以再次分配 1 或 2。选择 1 或 2 的概率不应与剩余项目的权重成正比,因此您指定概率权重。还要注意,即使您没有在 DataCamp Light 块中看不到它,种子仍然设置为 1234。”

我的主要担忧之一是数据值本身正在被替换。相反,它似乎允许根据概率再次分配 1 和 2 占位符。

于 2019-08-04T00:11:35.273 回答