Случайный лес с пакетом участника не может обрабатывать категориальные предикторы с более чем 4 уровнями
Я пытаюсь запустить случайную модель леса, используя party
пакет. Моя переменная отклика (10 уровней) является классификационным значением для разных типов озер (интересно, какие факторы влияют на кластеризацию озер на основе атрибутов качества воды). Мои переменные предиктора включают в себя как непрерывные, так и категориальные переменные. Одна категориальная переменная имеет 4 уровня, другая категориальная переменная имеет 8 уровней (штат США, в котором находится озеро). Всякий раз, когда я включаю 2-ю категориальную переменную в модель, я получаю следующую ошибку:
Error in model@fit(data, ...) : error code 1 from Lapack routine 'dgesdd'.
Я смог сузить это до того факта, что cforest
рутина в party
Пакет не запускается, когда предикторные переменные имеют более 4 категориальных уровней. Я не уверен, верно ли это для других наборов данных или просто для моей характеристики. Google предполагает, что код ошибки может быть связан с проблемами конвергенции. Кто-нибудь знает об ограничениях в cforest
рутина в отношении категориальных уровней предикторов (например, randomForest
от randomForest
пакет имеет ограничение в 32 уровня) Я не видел ничего явно обсуждающего это для party
пакет. Одним из решений было бы перекодировать этот фактор в отдельные фиктивные переменные, но я бы хотел этого избежать. Основываясь на характеристиках (коррелированные предикторы, факторы с различными уровнями, смесь непрерывных и категориальных данных) моих данных, cforest
кажется, рекомендуется болееrandomForest
,
Любое понимание будет с благодарностью.
Ссылка на фиктивный набор данных (реальные данные ограничены числом переменных): https://dl.dropboxusercontent.com/u/8554679/newdata.csv
library(RCurl)
library(party)
x = getURL("https://dl.dropboxusercontent.com/u/8554679/newdata.csv")
new.data = read.csv(text = x,header=TRUE)
new.data$response = as.factor(new.data$response)
new.data$factor1 = as.factor(new.data$factor1)
new.data$factor2 = as.factor(new.data$factor2)
set.seed(1123)
data.controls = data.controls = cforest_unbiased(ntree=500, mtry=3)
data.cforest = cforest(response ~ factor1 + pred1 + pred2 + pred3 + pred4 + factor2 + pred5 + pred6 + pred7,data=new.data,controls=data.controls)
#excuting this results in the following error: Error in model@fit(data, ...) : error code 1 from Lapack routine 'dgesdd'
#remove factor2 which has 8 levels from the formula
data.cforest = cforest(response ~ factor1 + pred1 + pred2 + pred3 + pred5 + pred6 + pred7,data=new.data,controls=data.controls)
levels(new.data$factor2)
#arbitrarily reassign factor2 levels such that there are only 4 levels
#I've tried levels between 8 and 4 and it turns out it only works if factors have <=4 levels
random.rows = sample(x=c(1:nrow(new.data)),size=nrow(new.data),replace=FALSE)
new.data$factor2 = NA
new.data$factor2[random.rows[1:120]] = 1
new.data$factor2[random.rows[121:241]] = 2
new.data$factor2[random.rows[242:362]] = 3
new.data$factor2[random.rows[363:483]] = 4
new.data$factor2 = as.factor(new.data$factor2)
levels(new.data$factor2)
data.cforest = cforest(response ~ factor1 + pred1 + pred2 + pred3 + pred4 + factor2 + pred5 + pred6 + pred7,data=new.data,controls=data.controls)
#model runs fine.
SessionInfo () запросил:
sessionInfo()
R version 3.0.3 (2014-03-06)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats4 grid stats graphics grDevices utils datasets methods base
other attached packages:
[1] party_1.0-13 modeltools_0.2-21 strucchange_1.5-0 sandwich_2.3-0 zoo_1.7-11 RCurl_1.95-4.1
[7] bitops_1.0-6
loaded via a namespace (and not attached):
[1] coin_1.0-23 lattice_0.20-29 mvtnorm_0.9-99992 splines_3.0.3 survival_2.37-7 tools_3.0.3
3 ответа
Поздний ответ, но все же ответ у меня была та же проблема. Решил это путем закрытия и повторного открытия R-Studio. Мне кажется, что это был конфликт между каретой и партийным пакетом, которые оба были загружены. Как только я загрузил партийный пакет, проблема исчезла.
Я столкнулся с подобной проблемой. У меня была та же ошибка, когда я выполнил следующую команду на некоторых данных:
tree = ctree(Y~., data=df[,-c(1,11:15)], controls = controls)
который дал:
Error in model@fit(data, ...) :
error code 19 from Lapack routine 'dgesdd'
Все переменные, кроме ответа, являются числовыми. Я мог бы "преодолеть" ошибку, изменив код на:
tree = ctree(Y~., data=df[,-c(1,11,12,13,14,15)], controls = controls)
Итак, я полагаю, это ошибка. Но, возможно, вы можете обойти аналогичным образом:
data.cforest = cforest(response ~., data=new.data,controls=data.controls)
Но ваш код не приводит к ошибке на моей машине, но работает нормально, поэтому я не могу проверить это.
Я обнаружил ту же проблему, которую не мог воспроизвести. В моем случае я решил проблему, вручную установив столбец с классификацией на символ, а затем на коэффициент. То есть: data$classifier= as.factor(as.character(data$classifier))