有誰知道R randomForest包用來解決分類關係的機制是什麼?即當樹最終在兩個或更多類中得到相同的投票時?R randomForest vote vote tie break
該文件稱領帶被隨機打破。但是,當您在一組數據上訓練模型,然後使用一組驗證數據對該模型進行多次評分時,綁定的類別決策不是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
是隨機森林對象和bad_ind
只是一個指數已經追平類票的特徵向量的列表。在我的測試用例中,使用上面的代碼,兩個綁定類之間的分佈接近90/10。
此外,建議使用奇數棵樹通常不會與第三課拉動一些投票而將其他兩個班級並列在一起。
這些rf樹的投票結果應該不是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]= 1
tlab[-tlab_ind] = 2
tlabf = factor(tlab)
vlab = vector("integer",length(y3))
vlab_ind = sample(1:length(y3),length(y3)/2)
vlab[vlab_ind]= 1
vlab[-vlab_ind] = 2
vlabf = 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")
}
更新: 本應固定在隨機森林的4.6-3版本。
你能提供一個可重現的小例子來證明這種行爲嗎? – joran
代碼的最後部分在bad_ind行之後出現錯誤... – Benjamin
您能告訴我錯誤在哪裏嗎?我只是添加了'library(randomForest)'行(在頂部),但是對於我而言,在R的新實例上剪切和粘貼代碼從頭到尾運行。 – Nate