rpart 复杂度参数值

rpart Complexity Parameter values

可以使用 getModelInfo

找到 rpart 参数
getModelInfo("rpart")[[1]]$grid
function(x, y, len = NULL, search = "grid"){
                    dat <- if(is.data.frame(x)) x else as.data.frame(x)
                    dat$.outcome <- y
                    initialFit <- rpart(.outcome ~ .,
                                        data = dat,
                                        control = rpart.control(cp = 0))$cptable
                    initialFit <- initialFit[order(-initialFit[,"CP"]), , drop = FALSE] 
                    if(search == "grid") {
                      if(nrow(initialFit) < len) {
                        tuneSeq <- data.frame(cp = seq(min(initialFit[, "CP"]), 
                                                       max(initialFit[, "CP"]), 
                                                       length = len))
                      } else tuneSeq <-  data.frame(cp = initialFit[1:len,"CP"])
                      colnames(tuneSeq) <- "cp"
                    } else {
                      tuneSeq <- data.frame(cp = unique(sample(initialFit[, "CP"], size = len, replace = TRUE)))
                    }

                    tuneSeq
                  }

唯一的参数是

cp = seq(min(initialFit[, "CP"]), max(initialFit[, "CP"]),length = len) 

但是我怎样才能得到 initialFitlen

在别处搜索我发现cp通常可以取10个值,从0.18到0.01。但仍然无法找到这些值的来源

如果您不确定参数的合适值,可以让 caret 为您选择并使用默认值。这是一个端到端工作的示例,无需明确指定 cp:

library(tidyverse)
library(caret)
library(forcats)

# Take mtcars data for example
df <- mtcars %>%
  # Which cars are automatic, which ones are manual?
  mutate(am = as.factor(am),
         am = fct_recode(am, 'automatic' = '1', 'manual' = '0'))

set.seed(123456)
fitControl <- trainControl(method = 'repeatedcv',
                           number = 10,
                           repeats = 10,
                           classProbs = TRUE,
                           summaryFunction = twoClassSummary)

# Run rpart
# Tuning grid is left unspecified, so caret uses the default
tree1 <- train(am ~ .,
               df,
               method = 'rpart',
               tuneLength = 20,
               metric = 'ROC',
               trControl = fitControl)

或者,如果您想明确指定 cp,请使用调整网格:

tuneGrid <- expand.grid(cp = seq(0, 0.05, 0.005))
tree2 <- train(am ~ .,
               df,
               method = 'rpart',
               tuneLength = 20,
               metric = 'ROC',
               trControl = fitControl,
               tuneGrid = tuneGrid)

关于 为什么 你应该 select cp 值的问题可能最好张贴在 CrossValidated.


更新:

要回答有关默认值和我在示例中选择的值的后续问题,我建议返回到建模函数的主要来源。 caret 出于方便的原因是一个很棒的包,但它所做的只是通过共享语法使许多算法更容易访问。如果您有关于 rpart 的技术问题,请参阅包手册 here

如上所述,这类问题最好放在 CrossValidated,那里的重点是数学、统计和机器学习。

不过,在这里给大家一个tldr

调整网格参数的选择总是在某种程度上是任意的。 objective 是为你的特定问题找到产生最佳结果的值,这又取决于你的数据、你的算法和你的评估指标。一些常见的 "rules of thumb" 包括从宽范围开始,确定可能具有最大值的区域,然后在该区域周围使用更精细的间隔。在您的情况下,这相对容易,因为您只有一个参数可以优化。只需尝试几个值,看看会发生什么。您可以 plot 拟合的 tree 对象 (plot(tree1)) 来查看您的模型如何随着复杂性参数 cp 的变化而改进。最终,您将开始开发一个 "feel" 和 "intuition" 可能有用的东西。