#r #r-caret #sentiment-analysis #downsampling
#r #r-каретка #анализ настроений #понижающая дискретизация
Вопрос:
У меня есть несбалансированный набор данных для анализа настроений, содержащий около 65000 наблюдений (~ 60000 положительных и ~ 5000 отрицательных). Этот набор данных должен быть сбалансирован так, чтобы у меня было одинаковое количество положительных и отрицательных наблюдений для тренировки моих алгоритмов машинного обучения.
Пакет caret
и функция downSample
помогают мне получить ~ 5000 отрицательных и ~ 5000 положительных наблюдений (с уменьшением выборки до класса меньшинства). Но мне нравится иметь ровно 2500 случайно выбранных положительных и 2500 случайно выбранных отрицательных наблюдений. Есть ли кто-нибудь, кто знает, как это сделать?
Комментарии:
1. Также проверьте пакет
ROSE
и функциюSMOTE
из пакета‘DMwR’
или packageunbalanced
Ответ №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:
В идеале, вы должны выполнить подвыборку внутри процедуры повторной выборки. Я предлагаю использовать sampling
аргумент trainControl
для указания разных обратных выборок. Используя код от @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
Создан 2019-03-20 пакетом reprex (версия 0.2.1)