R randomForest 投票平局的解决方法

有人知道 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 版本中应该已经修复了。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注