如何在R中创建平衡训练和不平衡测试数据集?

时间:2016-12-22 05:24:37

标签: r validation random statistics r-caret

我有一个包含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通过创建一个新观察来做到这一点。

1 个答案:

答案 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