R randomForest 패키지가 분류 관계를 해결하는 데 사용하는 메커니즘을 알고 있습니까? 즉, 트리가 두 개 이상의 클래스에서 동등한 투표로 끝나는 경우?R randomForest 투표 타이 브레이크
문서에 넥타이가 무작위로 분리되었다고 나와 있습니다. 그러나 일련의 데이터 집합에 대해 모델을 훈련시킨 다음 단일 모델의 유효성 검사 데이터로 여러 번 점수를 매기면 동점 계층 결정은 50/50이 아닙니다. model
가 랜덤 포레스트 객체이며 bad_ind
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])))
}
클래스 표를 연결 한 특징 벡터에 대한 인덱스 단지 목록입니다. 위의 코드를 사용하여 테스트 한 결과 두 묶음 클래스 간의 분포는 90/10에 가깝습니다.
또한 홀수 개의 트리를 사용하는 권장 사항은 일반적으로 세 번째 클래스가 몇 개의 투표를 가져 와서 두 개의 다른 클래스를 묶어 두지 않고 작동하지 않습니다.
투표 결과가 50/50을 넘는 rf 나무가있는이 경우가 좋지 않습니까?
업데이트 : 인해 숲을 교육하지만, (슬롭 죄송합니다) 다음 코드의 임의 특성으로 예를 제공하기 어려운 숲이 명확한를 판별 할 수있는 예를 생산 결국합니다 와 함께 승자. 넥타이가 고장 났을 때 테스트 결과 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