带有派对包的随机森林无法处理超过4个级别的分类预测变量

时间:2014-05-14 00:56:52

标签: r random-forest party

我正在尝试使用party包运行随机林模型。我的响应变量(10个级别)是不同湖泊类型的分类值(感兴趣的是哪些因素会影响基于水质属性的湖泊聚类)。我的预测变量包括连续变量和分类变量。一个分类变量有4个级别,另一个分类变量有8个级别(美国湖泊位于其中)。每当我在模型中包含第二个分类变量时,我都会收到以下错误:

Error in model@fit(data, ...) : error code 1 from Lapack routine 'dgesdd'. 

我已经能够将其缩小到预测变量超过4个分类级别时,cforest包中的party例程似乎无法运行的事实。我不确定这对其他数据集是否属实,或者仅仅是我的特征。 Google建议错误代码可能与收敛问题相关联。是否有人了解cforest例程中与分类预测器级别相关的限制(例如randomForest包中的randomForest限制为32级?我还没有看到任何明确讨论party包的内容。一种解决方案是将此因子重新编码为单独的虚拟变量,但我想避免这种情况。根据我的数据cforest appears to be recommended over 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 个答案:

答案 0 :(得分:1)

迟到的答案,但仍然是一个答案 我有同样的问题。通过关闭并重新打开R-Studio解决了这个问题。在我看来,它是插入符号和派对包之间的冲突,它们都被加载了。只要我加载了派对套餐,问题就消失了。

答案 1 :(得分:0)

我遇到了类似的问题。 当我对某些数据运行以下命令时,我遇到了同样的错误:

tree = ctree(Y~., data=df[,-c(1,11:15)], controls = controls)

给出了:

Error in model@fit(data, ...) : 
  error code 19 from Lapack routine 'dgesdd'

除响应外的所有变量都是数字。 我可以&#34;克服&#34;将代码更改为:

的错误
tree = ctree(Y~., data=df[,-c(1,11,12,13,14,15)], controls = controls)

所以,我认为,这是一个错误。但是,你可以以类似的方式解决问题:

data.cforest = cforest(response ~., data=new.data,controls=data.controls)

但是你的代码不会导致我的机器出错,但运行正常,所以我无法测试它。

答案 2 :(得分:0)

我发现了同样的问题,我无法复制。在我的情况下,我通过手动设置分类为字符的列,然后是因子来解决问题。即:data $ classifier = as.factor(as.character(data $ classifier))