R中的随机森林(y中的空类和参数legth 0)
Posted
技术标签:
【中文标题】R中的随机森林(y中的空类和参数legth 0)【英文标题】:Random forests in R (empty classes in y and argument legth 0) 【发布时间】:2012-11-09 19:25:17 【问题描述】:我是第一次与随机森林打交道,但遇到了一些我无法弄清楚的问题.. 当我对所有数据集(大约 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
但是我的列都是因子和数字。
谁能看出我哪里错了???
【问题讨论】:
请参阅this 问题以获取有关将示例数据添加到您的问题的帮助。 (另请注意您正在输入的区域上方的格式工具栏。) 【参考方案1】:randomForest(x = 数据,y = 标签,重要性 = TRUE,ntree = 1000)
label 是一个因素,因此在传递给 randomForest 函数之前,请使用 droplevels(label) 删除计数为零的级别。有用。
要检查每个级别的计数,请使用 table(label) 函数。
【讨论】:
【参考方案2】:这是因为您在将数据发送到随机森林之前对您的训练集进行了子设置,而子设置有可能在子设置后从您的响应变量中丢失一些级别,因此需要通过以下方式重新分配因子使用这个:
dataset2$response
在子设置后删除数据中不存在的其他级别。
【讨论】:
【参考方案3】:只是另一个建议添加到组合中:您可能不希望 read.csv() 将字符串解释为因素。尝试将此添加到 read.csv 以强制转换为字符:
dataset <- read.csv("datasetNA.csv",
sep=";",
header=T,
colClasses="character")
【讨论】:
【参考方案4】:在将其传递给 randomForest 之前尝试使用函数公式:
formula("y ~ a+b+c")
这解决了我的问题。
或者,randomForest 可能会将一个参数误认为另一个参数。
尝试指定每个参数是什么:
randomForest(,,, data=my_data, mtry=my_mtry, etc)
【讨论】:
【参考方案5】:当通过子集删除因子水平时, 你必须重置等级:
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"
【讨论】:
【参考方案6】:我今天和你有同样的问题,我已经解决了。 当你做随机森林时,R 默认是分类,而我的响应是数字。当您使用子集作为训练数据集时,与测试相比,训练的水平受到限制。
【讨论】:
【参考方案7】:根据 cmets 中的讨论,这里是对潜在解决方案的猜测。
这里的混淆源于一个因素的水平是变量的一个属性。无论您从数据中获取什么子集,无论该子集有多小,这些级别都将保持不变。这是一项功能,而不是错误,也是常见的混淆来源。
如果您想删除子集时缺少的级别,请将您的子集操作包装在droplevels()
:
groupA <- droplevels(dataset2[dataset2$order=="groupA",])
我可能还应该补充一点,许多 R 用户在开始新会话时(例如在他们的 .Rprofile 文件中)设置options(stringsAsFactors = FALSE)
以避免这些麻烦。这样做的缺点是,如果您经常与其他人共享您的代码,如果他们没有更改 R 的默认选项,这可能会导致问题。
【讨论】:
levels(dataset$Column) dataset$Column <- factor(dataset$Column) levels(dataset$Column)
droplevels 的替代方法可能只是使用 factor() 方法并将其分配给同一个变量。 levels() 方法是打印并验证它们是否已被移除。【参考方案8】:
看来是调用语句的问题。 如果你使用公式接口然后调用
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)
您可以使用它们的索引来代替变量的名称。试试这些建议。
【讨论】:
我只是尝试了两种方法,但仍然收到相同的消息:“randomForest.default(m, y, ...) 中的错误:y 中不能有空类” @user1842218 我怀疑你弄错了,而 R 是正确的,因为通过获取数据的子集,你实际上已经删除了一个因子级别的所有实例。 (错误消息很少会说谎。) 我检查了我的子集,它是完整的。我在公式中使用的每个因素都包含多个级别。我还保存了我的子集并将其作为新数据集再次打开,但是没有任何变化 @user1842218,请提供导致此错误的最小数据样本。 @user1842218 “我在公式中使用的每个因素都包含多个级别。”错误消息并不是说您的因素之一只有一个级别,而是说 一个 级别实际上并没有出现。在您提供可重现的示例之前,我坚持我对 R 错误消息的信念。以上是关于R中的随机森林(y中的空类和参数legth 0)的主要内容,如果未能解决你的问题,请参考以下文章