2012-02-12 128 views
4

我有一個數據集,我使用model.matrix()函數將因子變量轉換爲虛擬變量。我的數據有10個這樣的列,每個列有3個級別(2,3,4),我一直在爲它們分別創建虛擬變量。R model.matrix設置

xFormData <- function(dataset){ 
    mm0 <- model.matrix(~ factor(dataset$type) , data=dataset) 
    mm1 <- model.matrix(~ factor(dataset$type_last1), data = dataset) 
    mm2 <- model.matrix(~ factor(dataset$type_last2), data = dataset) 
    mm3 <- model.matrix(~ factor(dataset$type_last3), data = dataset) 
    mm4 <- model.matrix(~ factor(dataset$type_last4), data = dataset) 
    mm5 <- model.matrix(~ factor(dataset$type_last5), data = dataset) 
    mm6 <- model.matrix(~ factor(dataset$type_last6), data = dataset) 
    mm7 <- model.matrix(~ factor(dataset$type_last7), data = dataset) 
    mm8 <- model.matrix(~ factor(dataset$type_last8), data = dataset) 
    mm9 <- model.matrix(~ factor(dataset$type_last9), data = dataset) 
    mm10 <- model.matrix(~ factor(dataset$type_last10), data = dataset) 

    dataset <- cbind(dataset, mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7, mm8, mm9, mm10) 

dataset 
} 

我想知道如果這是錯誤的程序,對數據運行的randomForest,並繪製出變量重要性後,它被單獨顯示,不同的虛擬變量列。所以說61-63欄是第10欄的3個虛擬變量,randomForest本身就是第62欄,這是一個重要的預測指標。

我有2個問題:

1)可以嗎?

2)如果不是,我該如何對虛擬變量進行分組,以便rf知道他們在一起?

+2

您不需要創建虛擬變量:確保它們是因素(而不是數字)就足夠了。 – 2012-02-12 23:06:15

+0

@VincentZoonekynd這實際上是http://stackoverflow.com/questions/9145874/r-caret-rfe-variable-selection-for-factors-and-nas/9147316#9147316的後續行動,其中OP發現他的機器學習工作流程*不*使用因子編碼功能。 – 2012-02-13 19:27:00

回答

3

這是好的,而且如果您將這些因素作爲因素離開,無論如何都會發生在幕後。對於大多數機器學習目的,不同級別的因子不同的特徵。想想一個隨機的例子,比如test outcome ~ school:也許去學校A對於你是否通過或未通過考試有很好的預測作用,但不是學校B或者學校C.然後,學校的一項功能會很有用,但是其他的則不會。

這被覆蓋在caret暈影文件之一:http://cran.r-project.org/web/packages/caret/vignettes/caretMisc.pdf

此外,利用caret包括應該是一個有用的例子的cars數據集。它包含2個因素 - 「製造商」和「汽車類型」 - 已被虛擬編碼爲一系列用於機器學習的數字特徵。

data(cars, package='caret') 
head(cars) 
+0

謝謝。作爲後續,我認爲如果你這樣做,你不能使用n-1級別,但必須顯式編碼這個問題中描述的每個級別:http://stackoverflow.com/questions/4560459/all-水平對的一因子功能於一個模型矩陣中-R – screechOwl 2012-02-15 19:44:37