R中定义n的平衡样本

时间:2019-03-17 21:55:16

标签: r r-caret sentiment-analysis downsampling

我有一个不平衡的数据集用于情感分析,大约有65000个观察值(〜60000阳性和〜5000阴性)。该数据集应该保持平衡,以便我有相同数量的正面和负面观察来训练我的机器学习算法。

程序包caret和函数downSample帮助我获得了〜5000个阴性和〜5000个阳性观测值(降低采样至少数群体)。但是我喜欢准确地有2500个随机选择的正观测值和2500个随机选择的负观测值。有谁知道该怎么做?

2 个答案:

答案 0 :(得分:1)

理想情况下,应该在重新采样过程中进行子采样。我建议使用trainControl的{​​{3}}参数来指定不同的下采样。使用@ mr.joshuagordon中的代码:

library(caret)
#> Loading required package: lattice
#> Loading required package: ggplot2
require(tidyverse)
#> Loading required package: tidyverse
df <-
  data.frame(
    class = factor(c(rep('POS', 60000), rep('NEG', 5000))),
    random1 = runif(65000),
    random2 = runif(65000)
  )

sampler <- function(x, y) {
  if (!is.data.frame(x))
    x <- as.data.frame(x)
  dat <- 
    x %>% 
    mutate(.y = y) %>% 
    group_by(.y) %>% 
    sample_n(2500) %>% 
    ungroup() %>% 
    as.data.frame()
  list(x = dat[, names(dat) != ".y", drop = FALSE], y = dat$.y)
}

samp_info <- list(name = sampler, first = TRUE)

ctrl <- trainControl(method = "cv", sampling = sampler)

lr_mod <- train(class ~ ., data = df, method = "glm", trControl = ctrl)
length(lr_mod$finalModel$residuals)
#> [1] 5000

sampling(v0.2.1)于2019-03-20创建

答案 1 :(得分:0)

You just want 2500 of each??

require(tidyverse)
df <- data.frame(class = c(rep('POS',60000), rep('NEG',5000)), random = runif(65000))
result <- df %>% 
  group_by(class) %>% 
  sample_n(2500)
table(result$class)