Расчет размера узла в randomForest - PullRequest
0 голосов
/ 13 октября 2019

Я использую пакет 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

Что не так с моим кодом?

...