Однострочный ответ
Если вы знаете, что хотите выбрать только 4 лучшие переменные из повторной выборки rfe, это даст вам то, что вы ищете.
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 наблюдений.10 сгибов из лучших 4 переменных.Лучшие 4 переменные не всегда одинаковы в каждом сгибе.Следовательно, чтобы получить лучшие 4 верхние переменные в повторных выборках, вам нужно усреднить их производительность по складкам, как показано в коде выше.Еще проще, переменные в optVariables
сортируются в таком порядке, так что вы можете просто взять первые 4 (как в моем однострочном ответе).Чтобы доказать это, нужно немного покопаться в исходном коде (показано ниже).
Подробности: копаться в исходном коде
Хорошее первоеделать с объектами, возвращаемыми из функций, таких как 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 = "")
Итак, в основном это получение 5 верхних переменных непосредственно из 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])
# }