有人知道 R 语言的 randomForest 包是如何解决分类平局问题的吗?即当树在两个或多个类别中得到相同票数时的情况?
文档中提到平局是随机打破的。然而,当你在某一数据集上训练模型,然后用一组验证数据多次评分时,得到的平局类别决策并不是 50/50 的分布。
cnum = vector("integer",1000)for (i in 1:length(cnum)){ cnum[i] = (as.integer(predict(model,val_x[bad_ind[[1]],])))}cls = unique(cnum)for (i in 1:length(cls)){ print(length(which(cnum == cls[i])))}
其中 model
是 randomForest 对象,bad_ind
只是一个特征向量索引列表,这些特征向量在类别投票中出现了平局。在我的测试案例中,使用上述代码,两个平局类别之间的分布更接近于 90/10。
此外,建议使用奇数棵树的方法通常在第三个类别拉走一些票数后,仍然会导致另外两个类别出现平局。
这些随机森林树在投票中出现平局的情况不应该是 50/50 吗?
更新:由于训练森林的随机性,很难提供一个例子,但以下代码(抱歉代码有些乱)应该会产生一些森林无法确定明确赢家的例子。我的测试运行显示,在打破平局时,分布是 66%/33% – 我原本期望这是 50%/50%。
library(randomForest)x1 = runif(200,-4,4)x2 = runif(200,-4,4)x3 = runif(1000,-4,4)x4 = runif(1000,-4,4)y1 = dnorm(x1,mean=0,sd=1)y2 = dnorm(x2,mean=0,sd=1)y3 = dnorm(x3,mean=0,sd=1)y4 = dnorm(x4,mean=0,sd=1)train = data.frame("v1"=y1,"v2"=y2)val = data.frame("v1"=y3,"v2"=y4)tlab = vector("integer",length(y1))tlab_ind = sample(1:length(y1),length(y1)/2)tlab[tlab_ind]= 1tlab[-tlab_ind] = 2tlabf = factor(tlab)vlab = vector("integer",length(y3))vlab_ind = sample(1:length(y3),length(y3)/2)vlab[vlab_ind]= 1vlab[-vlab_ind] = 2vlabf = factor(vlab)mm <- randomForest(x=train,y=tlabf,ntree=100)out1 <- predict(mm,val)out2 <- predict(mm,val)out3 <- predict(mm,val)outv1 <- predict(mm,val,norm.votes=FALSE,type="vote")outv2 <- predict(mm,val,norm.votes=FALSE,type="vote")outv3 <- predict(mm,val,norm.votes=FALSE,type="vote")(max(as.integer(out1)-as.integer(out2)));(min(as.integer(out1)-as.integer(out2)))(max(as.integer(out2)-as.integer(out3)));(min(as.integer(out2)-as.integer(out3)))(max(as.integer(out1)-as.integer(out3)));(min(as.integer(out1)-as.integer(out3)))bad_ind = vector("list",0)for (i in 1:length(out1)) {#for (i in 1:100) { if (out1[[i]] != out2[[i]]){ print(paste(i,out1[[i]],out2[[i]],sep = "; ")) bad_ind = append(bad_ind,i) }}for (j in 1:length(bad_ind)) { cnum = vector("integer",1000) for (i in 1:length(cnum)) { cnum[[i]] = as.integer(predict(mm,val[bad_ind[[j]],])) } cls = unique(cnum) perc_vals = vector("integer",length(cls)) for (i in 1:length(cls)){ perc_vals[[i]] = length(which(cnum == cls[i])) } cat("for feature vector ",bad_ind[[j]]," the class distrbution is: ",perc_vals[[1]]/sum(perc_vals),"/",perc_vals[[2]]/sum(perc_vals),"\n")}
更新:这个问题在 randomForest 的 4.6-3 版本中应该已经修复了。
回答:
这个问题在 randomForest 的 4.6-3 版本中应该已经修复了。