2015-07-08 3 views
5

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

Я тренировался 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 на основе индексации.

Однако 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 в?

+0

Это поможет, если вы включили небольшой [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) с образцом ввода и кодом вы используете для генерации ваших объектов. Показ только результатов не позволяет нам получить хорошее представление о том, что происходит. Векторы в R всегда основаны на 1. Неименованный первый столбец обычно представляет собой имя строки, а не индекс. – MrFlick

ответ

7

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

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

+0

Просто хотел указать, что точки, равные 6.25, идут вправо. – Zelazny7

Смежные вопросы