我目前正在使用
然而,我仍然想了解为什么将我的解释变量作为因子传递会显著减慢算法的速度(至少因为我很快就会得到新数据,响应将采取3个不同的值,将其视为连续变量将不再是一个选项)。这难道不应该是反过来吗?
以下是模拟我的数据的示例代码:
rpart
包来拟合一个回归树,数据具有相对较少的观测值和数千个分类预测变量,这些变量只有两个可能的值。从在较小的数据上测试该包的结果来看,在这种情况下,无论我将回归变量声明为分类变量(即因子)还是保留它们(它们被编码为+/-1),都没有关系。然而,我仍然想了解为什么将我的解释变量作为因子传递会显著减慢算法的速度(至少因为我很快就会得到新数据,响应将采取3个不同的值,将其视为连续变量将不再是一个选项)。这难道不应该是反过来吗?
以下是模拟我的数据的示例代码:
library(rpart)
x <- as.data.frame(matrix(sample(c(-1, +1), 50 * 3000, replace = T), nrow = 50))
y <- rnorm(50)
x.fac <- as.data.frame(lapply(x, factor))
现在进行比较:
system.time(rpart( y ~ ., data = x, method = 'anova'))
user system elapsed
1.62 0.21 1.85
system.time(rpart( y ~ ., data = x.fac, method = 'anova'))
user system elapsed
246.87 165.91 412.92
对于每个变量(因子)只处理一种可能的分裂情况比处理整个潜在分裂范围(对于连续变量)更简单和更快,因此我最困惑的是rpart
的行为。任何澄清/建议将不胜感激。
model.matrix
本身的问题,而是rpart:::rpart.matrix
需要在 for 循环中扩展模型简写y~.
。这可能也是人们不建议在随机森林中使用公式接口的原因。 - joranrpart
。我会调查一下下面 Hong 的解决方法。 - joran