Выбор значения 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 (без разбиений), поскольку выбранный ответ уже объяснен]