14

我第一次与随机森林打交道,遇到了一些我无法弄清楚的问题。当我对所有数据集(大约 3000 行)运行分析时,我没有收到任何错误消息。但是当我对我的数据集的一个子集(大约 300 行)执行相同的分析时,我得到一个错误:

dataset <- read.csv("datasetNA.csv", sep=";", header=T)
names (dataset)
dataset2 <- dataset[complete.cases(dataset$response),]
library(randomForest)
dataset2 <- na.roughfix(dataset2)
data.rforest <- randomForest(dataset2$response ~ dataset2$predictorA + dataset2$predictorB+ dataset2$predictorC + dataset2$predictorD + dataset2$predictorE + dataset2$predictorF + dataset2$predictorG + dataset2$predictorH + dataset2$predictorI, data=dataset2, ntree=100, keep.forest=FALSE, importance=TRUE)

# subset of my original dataset:
groupA<-dataset2[dataset2$order=="groupA",]
data.rforest <- randomForest(groupA$response ~ groupA$predictorA + groupA$predictorB+ groupA$predictorC + groupA$predictorD + groupA$predictorE + groupA$predictorF + groupA$predictorG + groupA$predictorH + groupA$predictorI, data=groupA, ntree=100, keep.forest=FALSE, importance=TRUE)

Error in randomForest.default(m, y, ...) : Can't have empty classes in y.

但是,我的响应变量没有任何空类。

相反,如果我这样写 randomForest(a+b+c,y)而不是(y ~ a+b+c)收到其他消息:

Error in if (n == 0) stop("data (x) has 0 rows") : 
  argument length zero
Warning messages:
1: In Ops.factor(groupA$responseA + groupA$responseB,  :
  + not meaningful for factors

第二个问题是,当我尝试通过我估算我的数据时,rfImpute()我得到一个错误:

Errore in na.roughfix.default(x) :  roughfix can only deal with numeric data

但是,我的列都是因子和数字。

有人能看出我哪里错了吗???

4

8 回答 8

22

根据评论中的讨论,这里是对潜在解决方案的猜测。

这里的混淆源于一个因素的水平是变量的一个属性。无论您从数据中获取什么子集,无论该子集有多小,这些级别都将保持不变。这是一项功能,而不是错误,并且是常见的混淆来源。

如果您想在子集时删除缺失的级别,请将您的子集操作包装在droplevels()

groupA <- droplevels(dataset2[dataset2$order=="groupA",])

我可能还应该添加许多 R 用户options(stringsAsFactors = FALSE)在开始新会话时设置(例如在他们的 .Rprofile 文件中)以避免这些麻烦。这样做的缺点是,如果您经常与其他人共享您的代码,如果他们没有更改 R 的默认选项,这可能会导致问题。

于 2012-11-21T16:02:53.860 回答
7

当通过子集删除因子水平时,您必须重置水平:

levels(train11$str);
[1] "B" "D" "E" "G" "H" "I" "O" "T" "X" "Y" "b";
train11$str <- factor(train11$str);
levels(train11$str);
[1] "B" "D" "E" "G" "H" "I" "O" "T" "b"
于 2013-12-08T22:02:39.337 回答
4

这是因为您在将数据发送到随机森林之前对您的训练集进行了子设置,而子设置有可能在子设置之后从响应变量中丢失一些级别,因此需要使用以下方法重新分配因子:

dataset2$response <- 因子(dataset2$response)

在子设置后删除数据中不存在的附加级别。

于 2016-03-10T13:54:00.587 回答
3

在将其传递给 randomForest 之前尝试使用函数公式:

formula("y ~ a+b+c")

这解决了我的问题。

或者,randomForest 可能会将一个参数误认为另一个参数。

尝试指定每个参数是什么:

randomForest(,,, data=my_data, mtry=my_mtry, etc)
于 2014-07-02T09:21:54.203 回答
1

randomForest(x = 数据,y = 标签,重要性 = TRUE,ntree = 1000)

label 是一个因素,因此在传递给 randomForest 函数之前,请使用 droplevels(label) 删除计数为零的级别。有用。

要检查每个级别的计数,请使用 table(label) 函数。

于 2019-03-04T18:13:21.387 回答
0

似乎调用语句中的问题。如果您使用公式接口,则调用

randomForest(response ~ predictorA + predictorB + ... + predictorI, data=groupA, ntree=100, keep.forest=FALSE, importance=TRUE)

x但是显式传递和更方便快捷y

randomForest(y = groupA$response, x = groupA[,c("predictorA", "predictorB", ...)], ntree=100, keep.forest=FALSE, importance=TRUE)

您可以使用它们的索引来代替变量的名称。试试这些建议。

于 2012-11-21T14:49:27.143 回答
0

只是另一个建议添加到组合中:您可能不希望 read.csv() 将字符串解释为因素。尝试将此添加到 read.csv 以强制转换为字符:

dataset <- read.csv("datasetNA.csv", 
                    sep=";", 
                    header=T,
                    colClasses="character")
于 2015-12-10T18:33:50.527 回答
-1

我今天和你有同样的问题,我已经解决了。当你做随机森林时,R 默认是分类,而我的响应是数字。当您使用子集作为训练数据集时,与测试相比,训练的水平受到限制。

于 2013-09-01T17:21:53.913 回答