一条线回答
如果您知道您只需要 rfe 重采样中最好的 4 个变量,这将为您提供所需的内容。
results$optVariables[1:4]
# [1] "glucose" "mass" "age" "pregnant"
dplyr
回答
# results$variables %>%
# group_by(var) %>%
# summarize(Overall = mean(Overall)) %>%
# arrange(-Overall)
#
# A tibble: 8 x 2
# var Overall
# <chr> <dbl>
# 1 glucose 34.2
# 2 mass 15.8
# 3 age 12.7
# 4 pregnant 7.92
# 5 pedigree 5.09
# 6 insulin 4.87
# 7 triceps 3.25
# 8 pressure 1.95
为什么您的尝试提供超过 4 个变量
您正在过滤 40 个观察值。最好的 4 个变量的 10 倍。最好的 4 个变量在每个折叠中并不总是相同的。因此,要在重新采样中获得最佳的前 4 个变量,您需要像上面的代码一样在折叠中平均它们的性能。更简单的是,其中的变量optVariables
按此顺序排序,因此您只需获取前 4 个(如我的单行答案中所示)。证明这种情况需要深入研究源代码(如下所示)。
细节:深入研究源代码
对从 like 函数返回的对象做的第一件事rfe
是尝试类似print
,summary
或的函数plot
。通常会存在自定义方法,这些方法将为您提供非常有用的信息。例如...
# Run rfe with a random seed
# library(dplyr)
# library(mlbench)
# library(caret)
# data(PimaIndiansDiabetes)
# rfFuncs$summary <- twoClassSummary
# control <- rfeControl(functions=rfFuncs, method="cv", number=10)
# set.seed(1)
# results <- rfe(PimaIndiansDiabetes[,1:8], PimaIndiansDiabetes[,9], sizes=c(1:8),
# rfeControl=control, metric="ROC")
#
# The next two lines identical...
results
print(results)
# Recursive feature selection
#
# Outer resampling method: Cross-Validated (10 fold)
#
# Resampling performance over subset size:
#
# Variables ROC Sens Spec ROCSD SensSD SpecSD Selected
# 1 0.7250 0.870 0.4071 0.07300 0.07134 0.10322
# 2 0.7842 0.840 0.5677 0.04690 0.04989 0.05177
# 3 0.8004 0.824 0.5789 0.02823 0.04695 0.10456
# 4 0.8139 0.842 0.6269 0.03210 0.03458 0.05727
# 5 0.8164 0.844 0.5969 0.02850 0.02951 0.07288
# 6 0.8263 0.836 0.6078 0.03310 0.03978 0.07959
# 7 0.8314 0.844 0.5966 0.03075 0.04502 0.07232
# 8 0.8316 0.860 0.6081 0.02359 0.04522 0.07316 *
#
# The top 5 variables (out of 8):
# glucose, mass, age, pregnant, pedigree
嗯,这给出了 5 个变量,但你说你想要 4 个。我们可以很快深入研究源代码来探索它是如何计算并返回这 5 个变量作为前 5 个变量的。
print(caret:::print.rfe)
#
# Only a snippet code shown below...
# cat("The top ", min(top, x$bestSubset), " variables (out of ",
# x$bestSubset, "):\n ", paste(x$optVariables[1:min(top,
# x$bestSubset)], collapse = ", "), "\n\n", sep = "")
所以,基本上它是直接从results$optVariables
. 那是如何被填充的?
# print(caret:::rfe.default)
#
# Snippet 1 of code...
# bestVar <- rfeControl$functions$selectVar(selectedVars,
bestSubset)
#
# Snippet 2 of code...
# bestSubset = bestSubset, fit = fit, optVariables = bestVar,
好的,optVariables
正在填充rfeControl$functions$selectVar
.
print(rfeControl)
#
# Snippet of code...
# list(functions = if (is.null(functions)) caretFuncs else functions,
从上面,我们看到caretFuncs$selectVar
正在使用...
详细信息:正在填充的源代码optVariables
print(caretFuncs$selectVar)
# function (y, size)
# {
# finalImp <- ddply(y[, c("Overall", "var")], .(var), function(x) mean(x$Overall,
# na.rm = TRUE))
# names(finalImp)[2] <- "Overall"
# finalImp <- finalImp[order(finalImp$Overall, decreasing = TRUE),
# ]
# as.character(finalImp$var[1:size])
# }