如何在 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
我有一个包含 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