Кто-нибудь знает, какой механизм использует пакет 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]= 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 для randomForest.