IAM*_*bby 5 r decision-tree lapply sapply rpart
我观察到,仅对于 rpart 包(对于决策树模型),当我增加数据中的因子级别数量时,该包的速度会急剧减慢。我与其他软件包进行了比较,只有rpart,似乎是这样。下面是对我的数据尝试各种算法的图表。X 轴显示使用的因子级别数,Y 轴显示时间(以秒为单位)。正如您所看到的,对于 rpart,因子数量增加的峰值是巨大的。
通过在线阅读一些资料以及堆栈溢出中的页面,我了解到这与 rpart:::rpart.matrix 中的 for 循环有关,并使用 [ls]apply 更改它会加快该部分代码的速度。
这是原始代码
function (frame)
{
if (!inherits(frame, "data.frame") || is.null(attr(frame,
"terms")))
return(as.matrix(frame))
for (i in 1:ncol(frame)) {
if (is.character(frame[[i]]))
frame[[i]] <- as.numeric(factor(frame[[i]]))
else if (!is.numeric(frame[[i]]))
frame[[i]] <- as.numeric(frame[[i]])
}
X <- model.matrix(attr(frame, "terms"), frame)[, -1L, drop = FALSE]
colnames(X) <- sub("^`(.*)`", "\\1", colnames(X))
class(X) <- c("rpart.matrix", class(X))
X
}
Run Code Online (Sandbox Code Playgroud)
这是为了加速循环而建议的更改
# exactly the same as rpart.matrix, but with for replaced by lapply
f <- function(frame)
{
if (!inherits(frame, "data.frame") || is.null(attr(frame,
"terms")))
return(as.matrix(frame))
frame[] <- lapply(frame, function(x) {
if (is.character(x))
as.numeric(factor(x))
else if(!is.numeric(x))
as.numeric(x)
else x
})
X <- model.matrix(attr(frame, "terms"), frame)[, -1L, drop = FALSE]
colnames(X) <- sub("^`(.*)`", "\\1", colnames(X))
class(X) <- c("rpart.matrix", class(X))
X
}
Run Code Online (Sandbox Code Playgroud)
然而,如何让整个 rpart 包加速呢?
是否可以下载 rpart 代码并进行这些更改?
另外,我知道速度变慢的原因是将分类变量转换为 0/1 类型的“扁平变量”的代码。这真的有必要吗?是否可以通过仅维护每个因素的列表来在内部实现中以不同的方式处理分类变量,以标记使用该因素的行?
请指教。谢谢。
小智 0
您可以使用trace来更改rpart.matrix中的功能代码
trace("rpart.matrix", where=asNamespace("rpart"), edit=TRUE)
Run Code Online (Sandbox Code Playgroud)