R中的随机森林(y中的空类和参数legth 0)

use*_*218 13 r random-forest

我第一次使用随机森林进行处理,我遇到了一些我无法弄清楚的问题.当我对所有数据集(大约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.
Run Code Online (Sandbox Code Playgroud)

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

如果相反,我会像这样写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
Run Code Online (Sandbox Code Playgroud)

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

Errore in na.roughfix.default(x) :  roughfix can only deal with numeric data
Run Code Online (Sandbox Code Playgroud)

但是我的列是所有因素和数字.

谁能看到我错了?

jor*_*ran 21

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

这里的混淆源于因子的水平是变量的属性.无论您采用哪种数据子集,无论该子集有多小,这些级别都将保持不变.这是一个功能,而不是一个bug,也是一个常见的混淆源.

如果要在子集化时删除缺少的级别,请将子集操作包装在droplevels():

groupA <- droplevels(dataset2[dataset2$order=="groupA",])
Run Code Online (Sandbox Code Playgroud)

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


小智 6

通过子集删除因子级别时,必须重置级别:

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"
Run Code Online (Sandbox Code Playgroud)


DrD*_*Dom 0

看来问题出在调用语句上。如果您使用公式接口,则调用

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

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

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

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