Я использую пакет R randomForest
и хотел бы вычислить размер узла в каждом дереве. Вот код
library(randomForest)
library(MASS)
set.seed(42L)
rf <- randomForest(medv ~ ., Boston, keep.inbag = TRUE)
tree <- getTree(rf, 3)
tree.inbag <- rf$inbag[, 3]
reorder.regressors <- match(rownames(rf$importance), names(Boston[, -14]))
tree.node.sizes <- rep(0, rf$forest$ndbigtree[3])
for (sample_id in 1:nrow(Boston)) {
if (tree.inbag[sample_id]) {
tree.node.sizes[1] <-
tree.node.sizes[1] +
tree.inbag[sample_id]
node <- 1
while(tree[node, 1] || tree[node, 2]) {
regressors <- Boston[sample_id, -14]
value <- regressors[reorder.regressors[tree[node, 3]]]
split.point <- tree[node, 4]
if (value <= split.point) {
node <- tree[node, 1]
} else {
node <- tree[node, 2]
}
tree.node.sizes[node] <-
tree.node.sizes[node] +
tree.inbag[sample_id]
}
}
}
Результат не выглядит правильным: для деревьев регрессии значение по умолчанию для nodesize
(которое определяет «Минимальный размер терминальных узлов») равно 5, что означает каждыйзапись должна быть не менее 5, но у меня есть куча 1
, 2
и 3
, и даже 0
.
> tree.node.sizes
[1] 506 146 360 122 24 279 81 30 92 12 12 105 174 20 61 27 3 38
[19] 54 4 8 9 3 10 95 168 6 10 10 41 20 2 25 13 25 42
[37] 12 7 1 4 5 6 4 74 21 95 73 5 1 6 4 3 7 27
[55] 14 2 18 22 3 9 4 11 14 22 20 11 1 1 6 2 4 4
[73] 70 3 18 87 8 30 43 3 3 1 6 6 21 11 3 4 14 14
[91] 8 1 8 10 1 13 1 3 19 15 5 6 5 4 2 54 16 11
[109] 7 65 22 1 7 23 7 10 33 3 3 4 2 3 18 7 4 6
[127] 8 9 5 3 5 2 6 1 9 3 10 18 1 14 1 4 2 5
[145] 49 11 5 10 1 4 3 40 25 19 3 5 2 11 12 3 4 1
[163] 9 11 22 8 10 2 5 4 2 6 2 1 8 3 3 7 2 7
[181] 3 5 13 13 1 11 38 5 6 8 2 37 3 11 14 8 11 5
[199] 6 9 3 7 2 2 9 2 20 4 4 7 3 2 4 1 7 3
[217] 4 1 6 7 6 6 7 3 8 22 16 2 4 1 7 4 33 5
[235] 6 10 4 6 2 5 6 2 4 8 1 6 1 4 5 4 16 4
[253] 3 2 5 5 1 4 3 5 1 1 5 1 6 4 4 20 2 12
[271] 4 2 5 2 31 4 2 6 4 1 5 1 5 4 4 1 5 6
[289] 10 4 2 15 5 3 9 30 1 3 3 4 2 9 1 6 9 6
[307] 3 12 18 7 2 0 6 4 5 4 2 7 5 13 5 5 2 2
[325] 5 11 2 3 8 1 7 3 4
Что не так с моим кодом?