2012-02-12 126 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