在rpart和插入符号中使用序数变量而不转换为虚拟分类变量

时间:2015-06-13 13:50:57

标签: r r-caret rpart

我正在尝试使用rpart在R中创建序数回归树,其中预测变量主要是序数数据,在R中存储为factor

当我使用rpart创建树时,我得到这样的结果:

enter image description here

其中值是因子值(例如A170的标签范围为-5到10)。

但是,当我使用caret使用train rpart数据时,当我提取最终模型时,树不再具有序数预测变量。请参阅下面的示例输出树

enter image description here

如上所示,似乎序数变量A170现已转换为多个虚拟分类值,即第二个树中的A17010是值A170的虚拟变量{ {1}}。

那么,在使用10包装树时,是否可以保留序数变量而不是将因子变量转换为多个二元指示变量?

1 个答案:

答案 0 :(得分:6)

让我们从一个可重复的例子开始:

set.seed(144)
dat <- data.frame(x=factor(sample(1:6, 10000, replace=TRUE)))
dat$y <- ifelse(dat$x %in% 1:2, runif(10000) < 0.1, ifelse(dat$x %in% 3:4, runif(10000) < 0.4, runif(10000) < 0.7))*1

正如您所注意到的,使用rpart功能的训练将因子水平组合在一起:

library(rpart)
rpart(y~x, data=dat)

enter image description here

我能够使用train函数的公式接口重现插入符号包,将因子分成各自的级别:

library(caret)
train(y~x, data=dat, method="rpart")$finalModel

enter image description here

我发现避免按级别拆分因子的解决方案是将原始数据帧输入到train函数而不是使用公式接口:

train(x=data.frame(dat$x), y=dat$y, method="rpart")$finalModel

enter image description here