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)
但是我怎样才能得到 initialFit
和 len
?
在别处搜索我发现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" 可能有用的东西。
可以使用 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)
但是我怎样才能得到 initialFit
和 len
?
在别处搜索我发现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" 可能有用的东西。