извлекать выбранные переменные из результатов исключения рекурсивных функций каретки (rfe) - PullRequest
0 голосов
/ 23 октября 2018

В моем рабочем проекте я использую функцию rfe из пакета caret, чтобы исключить рекурсивные функции.Я использую игрушечный пример, чтобы проиллюстрировать свою точку зрения.

library(mlbench)
library(caret)
data(PimaIndiansDiabetes)

rfFuncs$summary <- twoClassSummary
control <- rfeControl(functions=rfFuncs, method="cv", number=10)
results <- rfe(PimaIndiansDiabetes[,1:8], PimaIndiansDiabetes[,9], sizes=c(1:8), rfeControl=control, metric="ROC")

Оптимальная выбранная переменная основана на тех переменных, которые дают наивысший ток в процессе и могут быть получены с помощью results$optVariables.Однако я хочу использовать «1 стандартное правило ошибки», чтобы выбрать меньше функций (код ниже).Число идентифицированных переменных равно 4.

# auc that is 1-se from the highest auc 
df.results = results$results %>% dplyr::mutate(ROCSE = ROCSD/sqrt(10-1))
idx = which.max(df.results$ROC)
ROC.1se = df.results$ROC[idx] - df.results$ROCSE[idx]

# plot ROC vs feature size
g = ggplot(df.results, aes(x=Variables, y=ROC)) + 
    geom_errorbar(aes(ymin=ROC-ROCSE, ymax=ROC+ROCSE), 
                  width=.2, alpha=0.4, linetype=1) +
    geom_line() + 
    geom_point()+
    scale_color_brewer(palette="Paired")+
    geom_hline(yintercept = ROC.1se)+
    labs(x ="Number of Variables", y = "AUROC")
print(g) 

Количество идентифицированных переменных равно 4. Теперь мне нужно узнать, какие четыре переменные.Я сделал ниже:

results$variables %>% filter(Variables==4) %>% distinct(var)

Это показывает мне 5 переменных!

Кто-нибудь знает, как я могу получить эти переменные?В основном это относится к получению этих переменных для любого количества выбранных переменных.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 27 октября 2018

Однострочный ответ

Если вы знаете, что хотите выбрать только 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])
# }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...