【问题标题】:Balanced sample with defined n in R在 R 中定义 n 的平衡样本
【发布时间】:2019-03-17 21:55:16
【问题描述】:

我有一个用于情绪分析的不平衡数据集,大约有 65000 个观察值(约 60000 个正面和约 5000 个负面)。这个数据集应该是平衡的,这样我就有相同数量的正面和负面观察来训练我的机器学习算法。

caret 和函数downSample 帮助我获得~5000 个负面和~5000 个正面观察(下采样到少数类)。但我喜欢恰好有 2500 个随机选择的正面观察和 2500 个随机选择的负面观察。有谁知道怎么做吗?

【问题讨论】:

  • 同时检查包ROSE和功能SMOTE来自包‘DMwR’或包unbalanced

标签: r r-caret sentiment-analysis downsampling


【解决方案1】:

你只想要每个 2500 个??

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)

【讨论】:

    【解决方案2】:

    理想情况下,您应该在重采样过程中完成二次采样。我建议使用trainControlsampling 参数来指定不同的下采样。使用来自@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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2017-07-27
      • 2016-08-07
      相关资源
      最近更新 更多