Одним из компонентов randomForest является пакетирование, в котором вы получаете консенсус-прогноз по количеству деревьев.
При увеличении количества деревьев ошибка OOB вычисляется на каждом шаге. Ошибка OOB не рассчитывается из сравнения прогноза, полученного из 1 дерева, с выборками OOB относительно этого дерева, но вместо этого вы используете усредненный прогноз по деревьям, из которых эта выборка не используется. Я рекомендую проверить это для обзора .
Итак, в вашем примере мы можем визуализировать это:
library(ggplot2)
library(tidyr)
plotdf <- pivot_longer(data.frame(ntrees=1:nrow(rf$err.rate),rf$err.rate),-ntrees)
ggplot(plotdf,aes(x=ntrees,y=value,col=name)) +
geom_line() + theme_bw()
M и R - строки для ошибки в прогнозе для этой указанной c метки, а OOB (ваш первый столбец) - просто среднее из двух. По мере увеличения числа деревьев ваша ошибка OOB становится меньше, потому что вы получаете лучший прогноз по большему количеству деревьев.
Хорошая особенность randomForest в том, что вам не нужна перекрестная проверка, поскольку оценка OOB обычно довольно показательно. Ниже мы можем попытаться показать, что получаем тот же результат:
set.seed(12)
# split in 5 parts
trn = split(1:nrow(Sonar),sample(1:nrow(Sonar) %% 5))
sim = vector("list",5)
# the number of trees we incrementally grow
ntrees = c(1,20*(1:50)+1)
for(CV in 1:5){
idx = trn[[CV]]
train.set <- Sonar[-idx, ]
test.set <- Sonar[idx, ]
# first forest, n=1, but works
mdl <- randomForest(Class ~ ., data = train.set, ntree=1,
keep.inbag = TRUE, importance = TRUE,keep.forest=TRUE)
err_rate <- vector("numeric",51)
err_rate[1] <- mean(predict(mdl,test.set)!=test.set$Class)
#growing the tree
for(i in 1:50){
mdl <- grow(mdl,10)
err_rate[i+1] <- mean(predict(mdl,test.set)!=test.set$Class)
}
sim[[CV]] <- data.frame(ntrees=ntrees,err_rate=err_rate,CV=CV)
}
sim = do.call(rbind,sim)
#plot
ggplot(sim,aes(x=ntrees,y=err_rate)) + geom_line(aes(group=CV),alpha=0.2) +
stat_summary(fun.y=mean,geom="line",col="blue")+theme_bw()