1
我使用Party R軟件包的ctree方法生成決策樹。如何處理派對包中Ctree的內存問題?
我的數據集包含大約22列和650000行數據。我使用memory.limit命令爲我的r會話分配了10GB的內存。
我有一個2.3 GHz的i3處理器和6GB的RAM。我在這裏做錯了什麼。
我得到的錯誤是
Calloc could not allocate memory (6223507 of 8 bytes)
我使用Party R軟件包的ctree方法生成決策樹。如何處理派對包中Ctree的內存問題?
我的數據集包含大約22列和650000行數據。我使用memory.limit命令爲我的r會話分配了10GB的內存。
我有一個2.3 GHz的i3處理器和6GB的RAM。我在這裏做錯了什麼。
我得到的錯誤是
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")
現在,這個過程可能需要一段時間,如果你有許多獨特的pathes,但它不應該超載你的記憶。如果你沒有太多獨特的路徑,這個功能應該減少數十倍甚至數百倍的數據量。此外,此功能僅適用於3級因子解釋變量(就像您擁有的)。
之後,您可以運行ctree
,你以前做的,但隨着新數據和新的解釋變量(將其稱之爲AdjDV
)和wiegths參數呼籲Weights
。在運行ctree
時,您還必須從數據集中排除Weights
。 像這樣:
ct <- ctree(AdjDV ~., data = Newdata[setdiff(names(Newdata), "Weights")], weights = Newdata$Weights)
如果你只有6GB內存,分配10GB將無濟於事。此外,'ctree()'中的內存分配問題通常是由具有太多不可調級別的因子變量引起的。你有兩個解決方案,要麼剷鬥他們,因此減少獨特的水平數量,或加權每個獨特的路徑,並在'ctree()'使用'權重' –
我修改了我的數據集,包括最多5個因子水平的列.. I仍然有大約20列和600萬行..我的電腦可以做這份工作嗎? – apps92
試一試。什麼是你解釋的變量btw?它是二元的還是連續的?因爲如果它是二進制的,你可以爲每個獨特的路徑加權樹,並顯着減小它的大小 –