在 rpart 和 caret 中使用序数变量而不转换为虚拟分类变量
Using ordinal variables in rpart and caret without converting to dummy categorical variables
我正在尝试使用 rpart
在 R 中创建一个序数回归树,预测变量主要是序数数据,在 R 中存储为 factor
。
当我使用 rpart
创建树时,我得到如下信息:
其中值是因子值(例如 A170
的标签范围从 -5 到 10)。
但是,当我使用 caret
到 train
使用 rpart
的数据时,当我提取最终模型时,树不再具有序数预测变量。请参阅下面的示例输出树
正如您在上面所看到的,序数变量 A170
现在似乎已被转换为多个虚拟分类值,即第二棵树中的 A17010
是 A170
的虚拟变量值 10
.
那么,在使用 caret
包拟合树时,是否可以保留序数变量而不是将因子变量转换为多个二元指标变量?
让我们从一个可重现的例子开始:
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)
我能够使用 train
函数的公式接口重现插入符号包,将这些因素分成各自的级别:
library(caret)
train(y~x, data=dat, method="rpart")$finalModel
我找到的避免按级别拆分因子的解决方案是将原始数据帧输入到 train
函数,而不是使用公式界面:
train(x=data.frame(dat$x), y=dat$y, method="rpart")$finalModel
我正在尝试使用 rpart
在 R 中创建一个序数回归树,预测变量主要是序数数据,在 R 中存储为 factor
。
当我使用 rpart
创建树时,我得到如下信息:
其中值是因子值(例如 A170
的标签范围从 -5 到 10)。
但是,当我使用 caret
到 train
使用 rpart
的数据时,当我提取最终模型时,树不再具有序数预测变量。请参阅下面的示例输出树
正如您在上面所看到的,序数变量 A170
现在似乎已被转换为多个虚拟分类值,即第二棵树中的 A17010
是 A170
的虚拟变量值 10
.
那么,在使用 caret
包拟合树时,是否可以保留序数变量而不是将因子变量转换为多个二元指标变量?
让我们从一个可重现的例子开始:
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)
我能够使用 train
函数的公式接口重现插入符号包,将这些因素分成各自的级别:
library(caret)
train(y~x, data=dat, method="rpart")$finalModel
我找到的避免按级别拆分因子的解决方案是将原始数据帧输入到 train
函数,而不是使用公式界面:
train(x=data.frame(dat$x), y=dat$y, method="rpart")$finalModel