2016-08-21 6 views
0

Есть ли готовые к использованию библиотеки или пакеты для python или R, чтобы уменьшить количество уровней для больших категориальных факторов?Уменьшить количество уровней для больших категориальных переменных

Я хочу достичь чего-то похожего на R: "Binning" categorical variables, но кодировать наиболее часто используемые коэффициенты k-k и «другие».

+0

Вы имеете в виду заменить все «не частотные» уровни как «другие»? – snoram

+0

Да, это еще один способ выразить это, потому что в противном случае с некоторыми из этих высокоуровневых категориальных переменных моя матрица данных взрывается в случае однократного кодирования. –

+0

Проверьте это [ссылка] (http://stackoverflow.com/questions/38788682/collapsing-factor-level-for-all-the-factor-variable-in-dataframe-based-on-the-co) –

ответ

1

Ниже приведен пример в R с использованием data.table, но это должно быть легко и без data.table.

# Load data.table 
require(data.table) 

# Some data 
set.seed(1) 
dt <- data.table(type = factor(sample(c("A", "B", "C"), 10e3, replace = T)), 
       weight = rnorm(n = 10e3, mean = 70, sd = 20)) 

# Decide the minimum frequency a level needs... 
min.freq <- 3350 

# Levels that don't meet minumum frequency (using data.table) 
fail.min.f <- dt[, .N, type][N < min.freq, type] 

# Call all these level "Other" 
levels(dt$type)[fail.min.f] <- "Other" 
+0

Спасибо лот - но почему он больше не работает, если он завернут в вызов функции, например: reduceCategorical <- function (variableName, min.freq) { # Определите минимальную частоту, необходимую уровню ... # Уровни, которые не соответствуют минимуму частота (с использованием data.table) fail.min.f <- neverData [, .N, variableName] [N

+0

Я тоже не мог понять. Будет держать его затылок, пока у меня не будет больше времени. Может быть, ответ здесь: http://stackoverflow.com/questions/11859063/data-table-and-get-command-r?noredirect11&lq=1 – snoram

+0

Спасибо за помощь. Я задал отдельный вопрос по этой проблеме: http://stackoverflow.com/questions/39071715/r-data-table-usage-in-function-call –

0

Вот подход с использованием base R:

set.seed(123) 
d <- data.frame(x = sample(LETTERS[1:5], 1e5, prob = c(.4, .3, .2, .05, .05), replace = TRUE)) 

recat <- function(x, new_cat, threshold) { 
    x <- as.character(x) 
    xt <- prop.table(table(x)) 
    factor(ifelse(x %in% names(xt)[xt >= threshold], x, new_cat)) 
} 

d$new_cat <- recat(d$x, "O", 0.1) 
table(d$new_cat) 
#  A  B  C  O 
# 40132 29955 19974 9939 
2

В R пакет forcats имеет fct_lump() для этой цели.

library(forcats) 
fct_lump(f, n) 

Где f является фактором и n является число наиболее распространенных уровней, которые будут сохранены. Остальные перекодируются в Other.

0

Я не думаю, что вы хотите сделать это таким образом. Группирование многих уровней в одну группу может сделать эту функцию менее прогностической. То, что вы хотите сделать, это поставить все уровни, которые будут идти в Другие в кластер, основанный на метрике подобия. Некоторые из них могут группироваться с уровнями верхнего уровня, а некоторые могут группироваться вместе, чтобы обеспечить лучшую производительность.

У меня была аналогичная проблема, и она сама ответила here. Для моей метричности сходства я использовал матрицу близости от случайной лесной регрессии, подходящей для всех функций, кроме той, которая есть. Разница в моем решении заключается в том, что некоторые из моих самых распространенных типов K могут быть объединены вместе, поскольку я использую k-mediods для кластера. Вы хотели бы изменить алгоритм кластера, чтобы ваши медиады были выбранными вами топ-K.

+0

Интересный подход. Из того, что я узнал между тем, я считаю, что контрастное кодирование http://stats.idre.ucla.edu/r/library/r-library-contrast-coding-systems-for-categorical-variables/ лучше подходит. –

+0

Я думал, что контрастное кодирование позволяет вводить категориальные элементы в модель. Он просто преобразует 1 функцию с k уровнями в k-1 с двумя уровнями. Я использовал только фиктивное кодирование, я что-то упускаю? – Keith

+1

Это верно для двоичного фиктивного кодирования.Но, как показывает связанный сайт, есть еще много возможностей. Некоторые способы, например. давайте назовем это процентное кодирование, рассчитаем процентные доли группы/уровня или какую-либо другую функцию, чтобы превратить каждый уровень в числовое значение, измеренное по данным. Это не обязательно приводит к большему количеству столбцов, таких как фиктивное кодирование. –

Смежные вопросы