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

How to create a balanced training and an unbalanced test data set in R?

我有一个包含 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".

table(Test$Target_Var)
Y    N 
1000 4000 

现在,我可以编写一个函数来执行此操作,但是是否有任何内置的 R 函数可以执行此操作?我探索了 caret 和采样包的采样函数,但找不到任何可以创建 BALANCED 训练数据集的函数。 SMOTE 通过创建新观察来做到这一点。

我分两步完成。 假设我有以下数据集:

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 步:使用 'Y' 的 50%(即 1000 行)和 'N' 的 4000 行创建测试数据集。这与人口中的 'Y' 和 'N' 分布相同。

test_index <- createDataPartition(data$Target_Var, p = .5, list = F)
Test<- data[test_index,]

table(Test$Target_Var)
A    B 
1000 4000 

Step2:从剩余数据中创建平衡训练数据集(1000行'Y'和1000行'N')

Training<- data[-test_index,]
Training<- strata(Training, stratanames = "Target_Var", size = c(1000,1000))

table(Training$Target_Var)
A    B 
1000 1000