Понимание древовидной структуры в пакете R gbm

У меня возникли некоторые затруднения с пониманием того, как деревья структурированы в пакете машин с усилением градиента RGB. В частности, глядя на вывод pretty.gbm.tree Какие функции делают индексы в SplitVar указать на?

Я обучил GBM на наборе данных, вот верхняя четверть одного из моих деревьев - результат вызова pretty.gbm.tree:

   SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight   Prediction
0         9  6.250000e+01        1         2          21      0.6634681   5981  0.005000061
1        -1  1.895699e-12       -1        -1          -1      0.0000000   3013  0.018956988
2        31  4.462500e+02        3         4          20      1.0083722   2968 -0.009168477
3        -1  1.388483e-22       -1        -1          -1      0.0000000   1430  0.013884830
4        38  5.500000e+00        5        18          19      1.5748155   1538 -0.030602956
5        24  7.530000e+03        6        13          17      2.8329899    361 -0.078738904
6        41  2.750000e+01        7        11          12      2.2499063    334 -0.064752766
7        28 -3.155000e+02        8         9          10      1.5516610     57 -0.243675567
8        -1 -3.379312e-11       -1        -1          -1      0.0000000     45 -0.337931219
9        -1  1.922333e-10       -1        -1          -1      0.0000000     12  0.109783128
```

Здесь мне кажется, что индексы основаны на 0, глядя на то, как LeftNode, RightNode, а также MissingNode указать на разные строки. Когда я проверяю это, используя образцы данных и следуя по дереву к их предсказаниям, я получаю правильный ответ, когда считаю SplitVar использовать 1 на основе индексации.

Тем не менее, одно из многих деревьев, которые я строю, имеет ноль в SplitVar колонка! Вот это дерево:

SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight    Prediction
0         4  1.462500e+02        1         2          21      0.41887   5981  0.0021651262
1        -1  4.117688e-22       -1        -1          -1      0.00000    512  0.0411768781
2         4  1.472500e+02        3         4          20      1.05222   5469 -0.0014870985
3        -1 -2.062798e-11       -1        -1          -1      0.00000     23 -0.2062797579
4         0  4.750000e+00        5         6          19      0.65424   5446 -0.0006222011
5        -1  3.564879e-23       -1        -1          -1      0.00000   4897  0.0035648788
6        28 -3.195000e+02        7        11          18      1.39452    549 -0.0379703437

Как правильно просмотреть индексацию, используемую деревьями gbm?

1 ответ

Решение

Первый столбец, который печатается при использовании pretty.gbm.tree это row.names что назначено в сценарии pretty.gbm.tree.R, В сценарии row.names назначается как row.names(temp) <- 0:(nrow(temp)-1) где temp информация дерева хранится в data.frame форма. Правильный способ интерпретации row.names это читать как node_id с корневым узлом присваивается значение 0.

В вашем примере:

Id SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight Prediction 0 9 6.250000e+01 1 2 21 0.6634681 5981 0.005000061

означает, что корневой узел (обозначенный номером строки 0) разделен 9-й переменной разделения (нумерация переменной разделения здесь начинается с 0, поэтому переменная разделения является 10-м столбцом в обучающем наборе x). SplitCodePred из 6.25 обозначает, что все точки меньше 6.25 ушел к LeftNode 1 и все точки больше 6.25 пошел в RightNode 2, Все точки, у которых в этом столбце отсутствовало значение, были назначены MissingNode 21, ErrorReduction было 0.6634 из-за этого раскола и было 5981 (Weight) в корневом узле. Prediction из 0.005 обозначает значение, присвоенное всем значениям в этом узле до разделения точки. В случае терминальных узлов (или листьев) обозначается -1 в SplitVar, LeftNode, RightNode, а также MissingNode, Prediction обозначает значение, предсказанное для всех точек, принадлежащих этому листовому узлу, скорректированное (раз) shrinkage,

Чтобы понять древовидную структуру, важно отметить, что расщепление дерева происходит сначала по глубине. Таким образом, когда корневой узел (с идентификатором узла 0) разделяется на его левый узел и правый узел, левая сторона обрабатывается до тех пор, пока дальнейшие разбиения невозможны перед возвратом и маркировкой правого узла. На обоих деревьях в вашем примере RightNode получает значение 2. Это потому, что в обоих случаях LeftNode оказывается листовым узлом.

Другие вопросы по тегам