我的数据(todo5)有一个只有16%的二进制类。我正在尝试创建一个平衡集来训练模型,同时保持测试集不平衡。由于我的记录很少(15K),所以我不能松开任何1。 我写了一个有效的代码,但我发现它还不清楚: 首先,我为测试创建索引:
test.idx<-sample((1:nrow(todo5)),nrow(todo5)*.4 )
然后我创建了平衡训练集。我和所有1人不在test.idx:
down.sample<-c((1:nrow(todo5))[todo5$flag_compro==1][-test.idx])
我添加相同数量的0:
down.sample<-c(down.sample, sample((1:nrow(todo5))[todo5$flag_compro==0][-test.idx], length(down.sample)))
有更好(更清晰)的方法吗?
答案 0 :(得分:1)
这种方法是否更清晰?
todo5 <- data.frame(x=sample(0:1, size=15e3, replace=TRUE, prob=c(0.84, 0.16)), y=runif(15e3))
trues <- seq(nrow(todo5))[todo5$x == 1]
falses <- seq(nrow(todo5))[todo5$x != 1]
falses <- sample(falses, size=length(trues))
both <- sort(c(trues, falses))
todo5subset <- todo5[both, ]
summary(todo5)
summary(todo5subset)
但是,我不会称之为平衡。我会使用Mahalanobis距离或匹配来实现其他协变量的平衡。
答案 1 :(得分:0)
逻辑向量的构造相当清楚:
down.sampleTF <- todo5$flag_compro %in% c(0,1) | rownames(todo) %in% test.idx
samp.todo <- todo[ down.sampleTF , ]