如何让 rpart 处理更多的因素?
Posted
技术标签:
【中文标题】如何让 rpart 处理更多的因素?【英文标题】:how do I get rpart to work with increased number of factors? 【发布时间】:2015-06-09 04:27:35 【问题描述】:我观察到,仅对于 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
这是加快循环速度的建议
# 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
但是,如何让整个 rpart 包加速?
是否可以下载 rpart 代码并进行这些更改?
另外,我知道速度变慢的原因是将分类变量转换为 0/1 类型的“扁平化变量”的代码。这真的有必要吗?在内部实现中是否可以通过为每个因素维护一个列表来区别对待分类变量,以标记使用该因素的行?
请指教。 谢谢。
【问题讨论】:
你弄明白了吗?如果有一个包含完整代码的 github 存储库,你会很好吗? :) 【参考方案1】:可以使用trace来改变rpart.matrix中的功能码
trace("rpart.matrix", where=asNamespace("rpart"), edit=TRUE)
【讨论】:
以上是关于如何让 rpart 处理更多的因素?的主要内容,如果未能解决你的问题,请参考以下文章