gpt4 book ai didi

r - 如何处理 Ctree in party 包中的内存问题?

转载 作者:行者123 更新时间:2023-12-01 23:58:15 30 4
gpt4 key购买 nike

我正在使用 Party R 包的 ctree 方法生成决策树。

我的数据集有大约 22 列和 650000 行数据。我使用 memory.limit 命令为我的 r session 分配了 10GB 的内存。

我有一个 2.3 GHz i3 处理器和 6GB 内存。我在这里做错了什么。

我得到的错误是

Calloc could not allocate memory (6223507 of 8 bytes)

最佳答案

好吧,我终于抽出时间来做这件事了。这不是太优雅,但应该工作。首先,加载下面的库和函数(你需要安装data.table包)

library(data.table)
library(party)

WeightFunc <- function(data, DV){
# Creating some paste function in order to paste unique paths
paste2 <- function(x) paste(x, collapse = ",")
ignore <- DV

# Creating unique paths
test3 <- apply(data[setdiff(names(data),ignore)], 1, paste2)

# Binding the unique paths vector back to the original data
data <- cbind(data, test3)
#data

# Getting the values of each explaining variable per each unique path
dt <- data.table(data[setdiff(names(data), ignore)])
dt.out <- as.data.frame(dt[, head(.SD, 1), by = test3])

# Creating dummy variables per each value of our dependable variable for further calculations
DVLvs <- as.character(unique(data[, DV]))
data[, DVLvs[1]] <- ifelse(data[, DV] == DVLvs[1], 1, 0)
data[, DVLvs[2]] <- ifelse(data[, DV] == DVLvs[2], 1, 0)
data[, DVLvs[3]] <- ifelse(data[, DV] == DVLvs[3], 1, 0)

# Summing dummy variables per unique path
dt <- data.table(data[c("test3", DVLvs)])
dt.out2 <- as.data.frame(dt[, lapply(.SD, sum), by = test3])

# Binding unique pathes with sums
dt.out2$test3 <- dt.out$test3 <- NULL
test <- cbind(dt.out, dt.out2)

# Duplicating the data in order to create a weights for every level of expalined variable
test2 <- test[rep(1:nrow(test),each = 3), ]
test2 <- cbind(test2, AdjDV = DVLvs)
test2$Weights <- ifelse(is.element(seq(1:nrow(test2)), grep("[.]1", rownames(test2))), test2[, DVLvs[2]],
ifelse(is.element(seq(1:nrow(test2)), grep("[.]2",rownames(test2))), test2[, DVLvs[3]], test2[, DVLvs[1]]))

# Deleting unseassery column
test2[, DVLvs[1]] <- test2[, DVLvs[2]] <- test2[, DVLvs[3]] <- NULL

return(test2)
}

现在在你的数据集上运行这个函数,其中 data 是你的数据,DV 是你解释的变量名(在引号中)并将它保存在一个新的数据集中,对于示例:

Newdata <- WeightFunc(data = Mydata, DV = "Success")

现在,如果您有许多独特的路径,这个过程可能需要一段时间,但它不应该让您的内存重载。如果您没有太多唯一路径,此功能应该可以将您的数据集减少数十倍甚至数百倍。此外,此功能仅适用于 3 级因子解释变量(就像您一样)。

在那之后,您可以像以前一样运行 ctree,但是使用新数据和新解释变量(将调用 AdjDV ) 和 wiegths 参数调用 权重。在运行 ctree 时,您还必须从数据集中排除 Weights。像那样:

ct <- ctree(AdjDV ~., data = Newdata[setdiff(names(Newdata), "Weights")], weights = Newdata$Weights)

关于r - 如何处理 Ctree in party 包中的内存问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22636322/

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