Извлечение разделенных значений из объекта rpart в R - PullRequest
1 голос
/ 19 мая 2019

Я не могу найти значения разделения (или другие данные) для узлов в объекте rpart. Я вижу это с сводкой (sample_model) , но не в списке или во фрейме данных

Некоторые образцы данных

foo.df <- structure(list(type = c("fudai", "fudai", "fudai", "fudai", "fudai", 
                              "fudai", "fudai", "tozama", "fudai", "fudai", "tozama", "tozama", 
                              "fudai", "tozama", "fudai", "fudai", "tozama", "fudai", "fudai", 
                              "tozama", "fudai", "fudai", "fudai", "tozama", "fudai", "fudai", 
                              "tozama", "fudai", "fudai", "fudai", "fudai", "fudai", "tozama", 
                              "fudai", "fudai", "fudai", "fudai", "fudai", "fudai", "tozama", 
                              "tozama", "fudai", "tozama", "tozama", "tozama", "tozama", "fudai", 
                              "fudai", "tozama", "tozama"), distance = c(12.5366985071383, 
                                                                         272.697138147139, 40.4780423740381, 109.806349869662, 147.781805212839, 
                                                                         89.4280438527415, 49.1425850803745, 555.414271440522, 119.365138867582, 
                                                                         182.902536555383, 310.019126513348, 277.122207392514, 214.510428881317, 
                                                                         235.111617874157, 104.494518693549, 50.7561853895564, 343.308898045237, 
                                                                         151.796857505073, 36.0391449169937, 30.8214406651022, 343.294467363406, 
                                                                         135.841501028422, 154.798119311647, 317.739208576563, 3.33794280697559, 
                                                                         98.9182898110913, 422.915369767251, 194.957988642709, 87.6548263591412, 
                                                                         187.571370158631, 236.292608259126, 17.915709270268, 193.548578374405, 
                                                                         262.190146422316, 21.6219797945323, 121.199009527283, 261.670997612517, 
                                                                         202.2051991431, 125.418459536787, 275.964068539003, 190.112226847932, 
                                                                         20.1753302760961, 488.80323504215, 579.25515722891, 233.500797034697, 
                                                                         207.588349435329, 183.770003408524, 168.739293254246, 313.140075747773, 
                                                                         131.69228390613), age = c(1756, 1711, 1712, 1746, 1868, 1866, 
                                                                                                   1682, 1617, 1771, 1764, 1672, 1636, 1864, 1704, 1762, 1868, 1694, 
                                                                                                   1749, 1703, 1616, 1691, 1702, 1723, 1683, 1742, 1691, 1623, 1721, 
                                                                                                   1704, 1745, 1749, 1723, 1639, 1661, 1843, 1845, 1669, 1698, 1698, 
                                                                                                   1664, 1868, 1633, 1783, 1642, 1615, 1648, 1734, 1758, 1725, 1635
                                                                         )), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
                                                                                                                                     -50L))

и базовая модель

library("rpart")
sample_model <- rpart(formula = type ~ ., 
                  data = sample_data, 
                  method = "class",
                  control = rpart.control(xval = 50, minbucket = 5, cp = 0.05),
                  parms = list(split = "gini"))

Документация rpart говорит, что в sample_model $ frame должны быть столбцы, которые называются "split", но их там нет. Процитируем: «разбивает две матрицы столбцов левой и правой меток разделения для каждого узла» https://www.rdocumentation.org/packages/rpart/versions/4.1-15/topics/rpart.object

Где находятся эти столбцы в sample_model $ frame или sample_model ? Тем не менее, я вижу данные, которые я хочу в

summary(sample_model)

Что происходит?

1 Ответ

1 голос
/ 19 мая 2019

Я вижу, чем сейчас, но, похоже, не описывает текущую структуру. Элемент $splits является отдельным элементом списка:

  sample_model$splits

 #----------

         count ncat  improve     index adj
distance    50   -1 9.134639  274.3306   0
age         50    1 7.910588 1687.0000   0
age         39    1 6.062937 1654.5000   0
distance    39   -1 1.950142  188.8418   0

Чтобы увидеть полную структуру sample_model, сделайте следующее:

str(sample_model)

Я не смог подтвердить догадку, что документы запаздывают с кодом:

news(grepl('splits', Text), 'rpart')     #--------------------

Изменения в версии 4.1-0

Суррогатные разбиения теперь рассматриваются, только если они отправляют два или более случая с ненулевым весом в каждую сторону. Для числовых / порядковых переменных ограничение на ненулевые веса является новым: для категориальных переменных это новое ограничение. Суррогатные разбиения, которые улучшаются только при ошибке округления по сравнению с разделением по умолчанию, больше не возвращаются. Там, где присутствуют веса и пропущенные значения, компонент разбиения для некоторых из них был возвращен неправильно.

Изменения в версии 4.0-1

Другим важным изменением была ошибка для асимметричных матриц потерь, вызванная запросом пользователя. При L = асимметричной потере измененные приоры были вычислены неправильно - они использовали L 'вместо L. Upshot - дерево не обязательно выберет оптимальные расщепления для данной матрицы потерь. После выбора расщепления были оценены правильно. Напечатанные значения «улучшения», конечно, тоже неправильные. Интересно, что для моего небольшого тестового примера, когда L довольно асимметричный, ранние расщепления в дереве не изменились - хорошее расщепление все еще выглядит хорошо.

Чтобы получить канонический ответ, вам необходимо связаться с сопровождающим:

 maintainer('rpart')
...