2016-08-21 65 views
0

是否有一些准备好使用python或R的库或包来减少大型分类因子的级数?减少大型分类变量的级别数

我想实现类似于R: "Binning" categorical variables的东西,但编码成最常见的top-k因子和“other”。

+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?noredirect=1&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包forcatsfct_lump()用于这一目的。

library(forcats) 
fct_lump(f, n) 

哪里f是因子,n是要保存最常见的级别数。其余的被记录到Other

0

我不认为你想这样做。将许多级别分组到一个组可能会使该功能的预测性降低。你想要做的就是根据相似性度量将所有可能进入其他的级别放入一个聚类中。其中一些可能会与您的顶级K级别相聚,有些可能聚集在一起以提供最佳性能。

我有类似的问题,并最终自己回答here。对于我的相似性度量,我使用了随机森林回归拟合所有特征的接近矩阵,除此之外。我的解决方案的不同之处在于,由于我使用k-mediods进行聚类,因此我最常见的一些top-k可能会聚集在一起。你会想改变集群算法,这样你的中介就是你选择的top-K。

+0

有趣的方法。从我所学的同时,我认为对比编码http://stats.idre.ucla.edu/r/library/r-library-contrast-coding-systems-for-categorical-variables/更适合。 –

+0

我认为对比编码只允许将分类输入到模型中。它只是将具有k个等级的1个特征转换为具有2个等级的k-1个特征。我只使用虚拟编码,我错过了什么? – Keith

+1

这对二进制虚拟编码是正确的。但正如链接网站显示,还有更多的可能性。一些方法例如让我们称之为一个百分比编码将计算组/明智百分比或其他函数将每个级别转换为从数据测量的数值。这不一定会导致像虚拟编码这样的更多列。 –