我有一个包含10,000个观测值的数据集。我的目标变量有两个类 - “Y”和“N”。下面是“Y”和“N”的分布:
> table(data$Target_Var)
Y N
2000 8000
现在我想创建一个平衡的训练数据集,使得“Y”的50%(1000)处于训练中。由于训练数据集应该是平衡的,它将有另外1000行“N”。观察总数= 2000。
table(Training$Target_Var)
Y N
1000 1000
测试数据集将是不平衡的,但与人口中的“Y”和“N”的比率相同,即测试将有5000行观察,1000“Y”和4000行“N”。 / p>
table(Test$Target_Var)
Y N
1000 4000
现在,我可以编写一个函数来完成它,但是有没有内置的R函数可以做到这一点?我探讨了插入符号和采样包的采样函数,但找不到任何可以创建 BALANCED 训练数据集的函数。 SMOTE通过创建一个新观察来做到这一点。
答案 0 :(得分:1)
我能够分两步完成。 假设我有以下数据集:
data<- data.frame(Target_Var = rep("A", 2000), Pop = rep(1:100,20))
data<- rbind(data, data.frame(Target_Var = rep("B", 8000), Pop = rep(1:100,80)))
> table(data$Target_Var)
Y N
2000 8000
步骤1:使用50%的&#39; Y&#39;创建测试数据集。 (即1000行)和4000行的N&#39;这与“Y&#39;”的分布相同。和&#39; N&#39;和人口一样。
test_index <- createDataPartition(data$Target_Var, p = .5, list = F)
Test<- data[test_index,]
table(Test$Target_Var)
A B
1000 4000
步骤2:从剩余数据创建平衡的训练数据集(1000行&#39; Y&#39;以及1000行&#39; N&#39;)
Training<- data[-test_index,]
Training<- strata(Training, stratanames = "Target_Var", size = c(1000,1000))
table(Training$Target_Var)
A B
1000 1000