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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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