r - 如何根据 ID 将数据框拆分为训练集、验证集和测试集?

标签 r training-data

我需要将我的数据集随机拆分为训练集、验证集和测试集,如本文 (R: How to split a data frame into training, validation, and test sets?) 中所示,但它需要随机链接到拆分主题 ID,而不是整个数据框.

当应用回答该问题的代码时,它会完全随机地拆分我的数据框,但我堆叠了 ID,需要它们保持在一起,否则一个受试者的数据将分布在不同的集合中。

抱歉,如果这听起来有点困惑。这是我的数据来解释这个问题:

df <- c(Contact.ID, Date.Time, Age, Gender, Attendance)

Contact.ID       Date.Time       Age   Gender   Attendance   
1   A       2012-07-06 18:54:48   37    Male         30    
2   A       2012-07-06 20:50:18   37    Male         30    
3   A       2012-08-14 20:18:44   37    Male         30   
4   B       2012-03-15 16:58:15   27  Female         40    
5   B       2012-04-18 10:57:02   27  Female         40    
6   B       2012-04-18 17:31:22   27  Female         40    
7   B       2012-04-18 18:37:00   27  Female         40    
8   C       2013-10-22 17:46:07   40    Male         5    
9   C       2013-10-27 11:21:00   40    Male         5    
10  D       2012-07-28 14:48:33   20  Female         12 

如果我随机拆分这些数据,例如,受试者 A 的条目可能有两个在我的测试集中,一个在我的验证集中。但我需要随机拆分不同 ID,而不是随机拆分整个数据帧,我无法弄清楚如何连接这些。

最佳答案

您从 the previous train/validate/test question 发布的代码为数据框的每一行分配训练、验证或测试标签,然后根据每一行的标签进行拆分:

spec = c(train = .6, test = .2, validate = .2)
g = sample(cut(
  seq(nrow(df)), 
  nrow(df)*cumsum(c(0,spec)),
  labels = names(spec)
))
res = split(df, g)

相反,您可以为 ID 因子变量的每个唯一级别分配一个标签,并根据分配给每行 ID 的标签进行拆分:

set.seed(144)
spec = c(train = .6, test = .2, validate = .2)
g = sample(cut(
  seq_along(unique(df$Contact.ID)), 
  length(unique(df$Contact.ID))*cumsum(c(0,spec)),
  labels = names(spec)
))
(res = split(df, g[as.factor(df$Contact.ID)]))
# $train
#   Contact.ID          Date.Time Age Gender Attendance
# 1          A 2012-07-0618:54:48  37   Male         30
# 2          A 2012-07-0620:50:18  37   Male         30
# 3          A 2012-08-1420:18:44  37   Male         30
# 8          C 2013-10-2217:46:07  40   Male          5
# 9          C 2013-10-2711:21:00  40   Male          5
# 
# $test
#   Contact.ID          Date.Time Age Gender Attendance
# 4          B 2012-03-1516:58:15  27 Female         40
# 5          B 2012-04-1810:57:02  27 Female         40
# 6          B 2012-04-1817:31:22  27 Female         40
# 7          B 2012-04-1818:37:00  27 Female         40
# 
# $validate
#    Contact.ID          Date.Time Age Gender Attendance
# 10          D 2012-07-2814:48:33  20 Female         12

请注意,这改变了拆分比例的解释:分配给训练集的 60% 现在是唯一主题 ID 的 60%,而不是行的 60%。

关于r - 如何根据 ID 将数据框拆分为训练集、验证集和测试集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45777247/

相关文章:

r - ggplot2 绘图区域边距?

r - 如何使用新(测试)数据重新创建相同的 DocumentTermMatrix

r - 选择具有最小绝对差异的重复行观察

r - fwrite 是否锁定文件以供同时读取

matlab - 如何在 MATLAB 中从 HMM 的多个序列中获取转换和发射矩阵?

python - 在 keras fit_generator() 中未调用 on_epoch_end()

python - 使用 CNN 训练海量数据

python - 从 Tensorflow 数据集中分割数据时出现问题

tensorflow - GPU 中的 Bfloat16 训练

r - R ggplot geom_tile没有填充颜色