Случайный лес с пакетом участника не может обрабатывать категориальные предикторы с более чем 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))

Другие вопросы по тегам