如何使用样本函数将数据分成训练集和测试集

201

我刚开始使用R,不确定如何将我的数据集与以下示例代码结合起来:

sample(x, size, replace = FALSE, prob = NULL)

我有一个数据集,需要将其分为训练集(75%)和测试集(25%)。我不确定应该放入x和size的信息是什么?x是数据集文件吗?size是指样本数量吗?


1
x 可以是你的 data 的索引(行/列编号)。size 可以是 0.75*nrow(data)。尝试使用 sample(1:10, 4, replace = FALSE, prob = NULL) 查看它的作用。 - harkmug
28个回答

1
我撞见了这个,它也可以帮助。
set.seed(12)
data = Sonar[sample(nrow(Sonar)),]#reshufles the data
bound = floor(0.7 * nrow(data))
df_train = data[1:bound,]
df_test = data[(bound+1):nrow(data),]

1
创建一个索引行"rowid",并使用反向连接来过滤使用by = "rowid"的数据。在拆分后可以使用%>% select(-rowid)删除rowid列。

data <- tibble::rowid_to_column(data)

set.seed(11081995)

testdata <- data %>% slice_sample(prop = 0.2)

traindata <- anti_join(data, testdata, by = "rowid")


0
我写了一个函数(第一个,所以可能不太好用),如果我正在处理多个数据表并且不想重复代码,可以让整个过程加速。
xtrain <- function(data, proportion, t1, t2){
  data <- data %>% rowid_to_column("rowid")
  train <- slice_sample(data, prop = proportion)
  assign(t1, train, envir = .GlobalEnv)
  test <- data %>% anti_join(as.data.frame(train), by = "rowid")
  assign(t2, test, envir = .GlobalEnv)
}

xtrain(iris, .80, 'train_set', 'test_set')

你需要先加载dplyr和tibble。该函数需要输入一个数据集、样本比例和两个对象名称,然后创建表格并将其分配为全局环境中的一个对象。

0

尝试使用 idx <- sample(2, nrow(data), replace = TRUE, prob = c(0.75, 0.25)),并使用提供的 id 访问拆分数据 training <- data[idx == 1,] testing <- data[idx == 2,]


0
set.seed(123)
llwork<-sample(1:length(mydata),round(0.75*length(mydata),digits=0)) 
wmydata<-mydata[llwork, ]
tmydata<-mydata[-llwork, ]

0
我认为这会解决问题:
df = data.frame(read.csv("data.csv"))
# Split the dataset into 80-20
numberOfRows = nrow(df)
bound = as.integer(numberOfRows *0.8)
train=df[1:bound ,2]
test1= df[(bound+1):numberOfRows ,2]

0

我更喜欢使用dplyr来改变数值

set.seed(1)
mutate(x, train = runif(1) < 0.75)

我可以继续使用dplyr::filter和辅助函数,例如

data.split <- function(is_train = TRUE) {
    set.seed(1)
    mutate(x, train = runif(1) < 0.75) %>%
    filter(train == is_train)
}

-2

使用R行和列的索引有一种非常简单的方法来选择多行数据。这让你可以干净地分割数据集,比如说你要取前80%的数据。

在R中,所有的行和列都是有索引的,所以DataSetName[1,1]是“DataSetName”第一列和第一行的值。我可以使用[x,]选择行和[,x]选择列。

例如:如果我有一个方便命名为“data”的数据集,有100行,我可以使用以下代码查看前80行:

View(data[1:80,])

同样的,我可以使用以下代码选择这些行并将它们子集化:

train = data[1:80,]

test = data[81:100,]

现在我的数据被分成了两部分,没有重新采样的可能性。快速而简单。


1
虽然数据可以这样分割,但并不建议这样做。有些数据集是按照你不知道的变量排序的。因此最好对将被视为训练的行进行抽样,而不是取前n行。 - user5029763
1
如果在将数据分成测试集和训练集之前对其进行洗牌,那么您的建议是可行的。 - Hadij

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接