是否有一些準備好使用python或R的庫或包來減少大型分類因子的級數?減少大型分類變量的級別數
我想實現類似於R: "Binning" categorical variables的東西,但編碼成最常見的top-k因子和「other」。
是否有一些準備好使用python或R的庫或包來減少大型分類因子的級數?減少大型分類變量的級別數
我想實現類似於R: "Binning" categorical variables的東西,但編碼成最常見的top-k因子和「other」。
這裏有一個例子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"
謝謝很多 - 但爲什麼它不再工作,如果包裝在一個函數調用,如:reduceCategorical < - function(variableName,min.freq){ #確定一個級別所需的最低頻率... #級別不符合最低頻率(使用data.table) fail.min.f < - neverData [,.N,variableName] [N
我也弄不清楚。將它留在我的腦後,直到我有更多的時間。也許答案在這裏:http://stackoverflow.com/questions/11859063/data-table-and-get-command-r?noredirect=1&lq=1 – snoram
感謝您的幫助。我在這裏提出了一個單獨的問題:http://stackoverflow.com/questions/39071715/r-data-table-usage-in-function-call –
下面是一個使用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
將R包forcats
有fct_lump()
用於這一目的。
library(forcats)
fct_lump(f, n)
哪裏f
是因子,n
是要保存最常見的級別數。其餘的被記錄到Other
。
我不認爲你想這樣做。將許多級別分組到一個組可能會使該功能的預測性降低。你想要做的就是根據相似性度量將所有可能進入其他的級別放入一個聚類中。其中一些可能會與您的頂級K級別相聚,有些可能聚集在一起以提供最佳性能。
我有類似的問題,並最終自己回答here。對於我的相似性度量,我使用了隨機森林迴歸擬合所有特徵的接近矩陣,除此之外。我的解決方案的不同之處在於,由於我使用k-mediods進行聚類,因此我最常見的一些top-k可能會聚集在一起。你會想改變集羣算法,這樣你的中介就是你選擇的top-K。
有趣的方法。從我所學的同時,我認爲對比編碼http://stats.idre.ucla.edu/r/library/r-library-contrast-coding-systems-for-categorical-variables/更適合。 –
我認爲對比編碼只允許將分類輸入到模型中。它只是將具有k個等級的1個特徵轉換爲具有2個等級的k-1個特徵。我只使用虛擬編碼,我錯過了什麼? – Keith
這對二進制虛擬編碼是正確的。但正如鏈接網站顯示,還有更多的可能性。一些方法例如讓我們稱之爲一個百分比編碼將計算組/明智百分比或其他函數將每個級別轉換爲從數據測量的數值。這不一定會導致像虛擬編碼這樣的更多列。 –
你的意思是把所有「不頻繁」級別替換爲「其他」? – snoram
是的,這是另一種說法,因爲否則有幾個這樣的高級分類變量,我的數據矩陣在單熱編碼的情況下會爆炸。 –
選中此鏈接(http://stackoverflow.com/questions/38788682/collapsing-factor-level-for-all-the-factor-variable-in-dataframe-based-on-the-co) –