Выбор значения CP для сокращения дерева решений с помощью rpart

Я понимаю, что обычной практикой для выбора значения CP является выбор самого низкого уровня с минимальным xerror значение. Тем не менее, в моем следующем случае, используя cp <- fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"] даст мне 0.17647059 что приведет к отсутствию разделения или просто корня после сокращения с этим значением.

> myFormula <- Kyphosis~Age+Number+Start
> set.seed(1)
> fit <- rpart(myFormula,data=data,method="class",control=rpart.control(minsplit=20,xval=10,cp=0.01))
> fit$cptable
          CP nsplit rel error   xerror      xstd
1 0.17647059      0 1.0000000 1.000000 0.2155872
2 0.01960784      1 0.8235294 1.000000 0.2155872
3 0.01000000      4 0.7647059 1.058824 0.2200975

Есть ли другая альтернатива / хорошая практика для выбора значения CP?

2 ответа

Решение

Как правило, код, похожий на тот, который у вас есть, является предупреждением о том, что дерево, вероятно, вообще бесполезно и, вероятно, не может хорошо обобщать будущие данные. Таким образом, ответ не в том, чтобы найти другой способ выбрать cp, а в том, чтобы создать полезное дерево, если вы можете, или признать поражение и сказать, что на основе имеющихся у нас примеров и возможностей мы не можем создать модель, которая будет предсказывать кифоз,

В вашем случае не все - обязательно - потеряно. Данные очень малы, и перекрестная проверка, которая приводит к появлению столбца ксеррор, очень изменчива. Если вы посеете семена до 2 или 3, вы увидите очень разные ответы в этом столбце (некоторые даже хуже).

Таким образом, одна вещь, которая интересна на этих данных, состоит в том, чтобы увеличить количество сгибов перекрестной проверки до количества наблюдений (чтобы вы получили LOOCV). Если вы делаете это:

myFormula <- Kyphosis ~ Age + Number + Start
rpart_1 <- rpart(myFormula, data = kyphosis,
                 method = "class", 
                 control = rpart.control(minsplit = 20, xval = 81, cp = 0.01))
rpart_1$cptable

Вы найдете таблицу CP, которая вам понравится больше! (Обратите внимание, что установка семян больше не нужна, поскольку сгибы каждый раз одинаковы).

В общем (и учитывая экономию) вы должны предпочесть меньшее дерево из тех, которые имеют минимальное значение ксеррор, то есть любое из тех, чье значение ксеррор находится в пределах [min(xerror) - xstd; min(xerror) + xstd].

Согласно rpart vignette: "Любой риск в пределах одной стандартной ошибки достигнутого минимума помечается как эквивалентный минимуму (то есть считается частью плоского плато). Тогда самая простая модель из всех" привязанных "на плато, выбран."

Смотрите: /questions/27907448/kak-podrezat-derevo-v-r/27907460#27907460

Вы можете выбрать наиболее подходящее значение cp (чтобы обрезать начальный your.tree, переоснащенный rpart) со специальной функцией, такой как:

cp.select <- function(big.tree) {
  min.x <- which.min(big.tree$cptable[, 4]) #column 4 is xerror
  for(i in 1:nrow(big.tree$cptable)) {
    if(big.tree$cptable[i, 4] < big.tree$cptable[min.x, 4] + big.tree$cptable[min.x, 5]) return(big.tree$cptable[i, 1]) #column 5: xstd, column 1: cp 
  }
}

pruned.tree <- prune(your.tree, cp = cp.select(your.tree))

[В вашем конкретном примере все деревья эквивалентны, поэтому предпочтительным должен быть размер 1 (без разбиений), поскольку выбранный ответ уже объяснен]

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