R randomForest パッケージが分類の同点を解決するために使用するメカニズムを知っている人はいますか?
ドキュメントによると、同点はランダムに壊れています。ただし、一連のデータでモデルをトレーニングし、そのモデルを 1 つの検証データ セットで何度もスコアリングする場合、同点のクラスの決定は 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
のクラス投票を持つ特徴ベクトルの単なるインデックスのリストです。上記のコードを使用した私のテスト ケースでは、同順位の 2 つのクラス間の分布は 90/10 に近づきました。
また、奇数のツリーを使用するという推奨事項は、通常、3 番目のクラスがいくつかの票を集め、他の 2 つのクラスが引き分けになった場合には機能しません。
投票で結ばれた 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")
}
更新: これは、randomForest のバージョン 4.6-3 で修正される必要があります。