【问题标题】:How to create a balanced training and an unbalanced test data set in R?如何在 R 中创建平衡的训练和不平衡的测试数据集?
【发布时间】:2017-05-07 16:10:56
【问题描述】:

我有一个包含 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 函数可以做到这一点?我探索了插入符号和采样包的采样函数,但找不到任何可以创建 BALANCED 训练数据集的函数。 SMOTE 这样做是通过创建一个新的观察来实现的。

【问题讨论】:

  • 你可以试试sample(levels(Training$Target_Var), 2000, replace=TRUE, prob = c(0.2, 0.8))

标签: r validation random statistics r-caret


【解决方案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 

Step1:创建包含 50% 的“Y”(即 1000 行)和 4000 行的“N”的测试数据集。这与总体中的“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 

【讨论】:

    猜你喜欢
    • 2016-05-30
    • 2019-12-05
    • 2015-03-16
    • 2020-04-15
    • 2013-06-11
    • 2014-05-07
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多