Понимание древовидной структуры в пакете 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
оказывается листовым узлом.