gpt4 book ai didi

r - 我如何让 rpart 与增加的因素一起工作?

转载 作者:行者123 更新时间:2023-12-04 14:18:49 30 4
gpt4 key购买 nike

我观察到,仅对于 rpart 包(用于决策树模型),当我增加数据中的因子级别数时,该包会急剧变慢。我和其他包对比过,只针对rpart,好像是这样。下面是在我的数据上尝试各种算法的图表。 X 轴显示使用的因子水平数,Y 轴显示以秒为单位的时间。如您所见,对于 rpart 而言,因子数量增加的峰值是巨大的。 enter image description here

通过在线阅读一些资源以及堆栈溢出的页面,我了解到这与 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 类型的“扁平化变量”的代码段。这真的有必要吗?难道仅仅通过为每个因素维护一个列表来标记使用这个因素的行,是否可以在内部实现中以不同的方式对待分类变量?

请指教。
谢谢。

最佳答案

您可以使用 trace 更改 rpart.matrix 中的功能代码

trace("rpart.matrix", where=asNamespace("rpart"), edit=TRUE)

关于r - 我如何让 rpart 与增加的因素一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29443068/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com