在 R 中定义 n 的平衡样本
Balanced sample with defined n in R
我有一个用于情绪分析的不平衡数据集,其中包含大约 65000 个观察值(约 60000 个正值和约 5000 个负值)。这个数据集应该是平衡的,这样我就有相同数量的正面和负面观察来训练我的机器学习算法。
包 caret
和函数 downSample
帮助我获得了约 5000 个负观察和约 5000 个正观察(下采样到少数 class)。但我喜欢恰好有 2500 个随机选择的正观察值和 2500 个随机选择的负观察值。有谁知道怎么做吗?
你只想要每个 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)
理想情况下,您应该在重采样过程中完成二次采样。我建议使用 trainControl
的 sampling
参数来指定不同的下采样。使用来自@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 创建
我有一个用于情绪分析的不平衡数据集,其中包含大约 65000 个观察值(约 60000 个正值和约 5000 个负值)。这个数据集应该是平衡的,这样我就有相同数量的正面和负面观察来训练我的机器学习算法。
包 caret
和函数 downSample
帮助我获得了约 5000 个负观察和约 5000 个正观察(下采样到少数 class)。但我喜欢恰好有 2500 个随机选择的正观察值和 2500 个随机选择的负观察值。有谁知道怎么做吗?
你只想要每个 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)
理想情况下,您应该在重采样过程中完成二次采样。我建议使用 trainControl
的 sampling
参数来指定不同的下采样。使用来自@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 创建