从插入符递归特征消除 (rfe) 结果中检索选定的变量

2024-03-25

在我的工作项目中,我使用 caret 包中的 rfe 函数来进行递归特征消除。我用一个玩具例子来说明我的观点。

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")

选择的最佳变量基于在过程中给出最高 auroc 的那些变量,并且可以通过以下方式检索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 个变量!

有谁知道我如何检索这些变量?基本上它适用于获取任意数量的选定变量的这些变量。

预先非常感谢!


一行回答

如果您知道您只需要 rfe 重采样中最好的 4 个变量,这将为您提供所需的内容。

results$optVariables[1:4]
# [1] "glucose"  "mass"     "age"      "pregnant"

dplyr Answer

# 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 个(如我的单行答案所示)。要证明这种情况,需要深入研究源代码(如下所示)。

详细信息:深入研究源代码

首先处理从函数返回的对象,例如rfe是尝试类似的功能print, summary, or 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,

Ok, 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])
# }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从插入符递归特征消除 (rfe) 结果中检索选定的变量 的相关文章

  • 抑制 R 中的错​​误消息

    我正在 R 中运行模拟研究 有时 我的模拟研究会产生错误消息 当我在函数中实现模拟研究时 当出现此错误消息时模拟停止 我知道抑制错误是不好的做法 但此时对我来说 除了抑制错误然后继续下一个模拟 直到达到我喜欢运行的模拟总数为止 没有其他选择
  • 在 Shiny 应用程序中过滤数据时,长度为 1 的字符向量除了第一个元素之外的所有元素都将被忽略错误

    我有以下闪亮的应用程序 library shiny library rhandsontable library shinydashboard library ggplot2 library dplyr setwd C Users Marc
  • 在ggplotly散点图中添加自定义数据标签

    我想显示Species对于每个数据点 当光标位于该点上方而不是 x 和 y 值时 我用iris数据集 另外 我希望能够单击数据点以使标签持久存在 并且当我在图中选择新位置时标签不会消失 如果可能的话 最基本的是标签 持久性问题是一个优点 这
  • 对于多项式,获取其所有极值并通过突出显示所有单调部分来绘制它

    有人问我这个有趣的问题 我认为值得将其发布在这里 因为 Stack Overflow 上还没有任何相关线程 假设我有长度为的多项式系数n vector pc 其中次数多项式n 1对于变量x可以以其原始形式表示 pc 1 pc 2 x pc
  • Shiny可以识别用鼠标选择的文本(突出显示的文本)吗?

    我需要用户将文本片段分配给 Shiny 中的类别或 代码 基本上 我希望用户突出显示输出中的文本 在下面的示例中 来自table or text输出 然后按一个按钮 code 并将选定的文本分配给应用程序内的对象 在下面的应用程序中 所选文
  • 使用滑动窗口动画 ggplot 时间序列图

    我正在寻找在不失去分辨率的情况下对长时间序列图进行动画处理的方法 我希望视图能够 平移 数据 显示从开始到结束的滑动子集 假设我有以下内容 library ggplot2 library dplyr library gganimate df
  • 如何在 R 中只为直方图的一个标签着色?

    我有一个像这样的数据框 CellLines ZEB1 600MPE 2 8186 AU565 2 783 BT20 2 7817 BT474 2 6433 BT483 2 4994 BT549 3 035 CAMA1 2 718 DU447
  • 回归时如何设置系数值;右

    我正在寻找一种指定预测变量值的方法 当我使用当前数据运行 glm 时 其中一个变量的系数接近 1 我想将其设置为 0 8 我知道这会给我一个较低的 R 2 值 但我先验地知道模型的预测能力会更大 glm 的权重组件看起来很有希望 但我还没有
  • R闪亮:使用闪亮的JS从数据表中获取信息

    我想读出所有列名称以及它们在数据表中显示的顺序 由于不同的原因 我无法使用 stateSave 等选项 我对 JS 没有什么把握 但我确信用它可以完成 所以我需要你帮助我 我尝试过类似的代码片段 datatable data callbac
  • 为每个因素级别添加日期时间序列

    我有一个带有因子列的数据框 s lt data frame id 901 910 s id lt as factor s id 我有一个日期时间序列 library lubridate start lt now as difftime 2
  • 改进R中从google获取股票新闻数据的功能

    我已经编写了一个函数来从 Google 获取和解析给定股票代码的新闻数据 但我确信有一些方法可以改进它 对于初学者来说 我的函数返回一个 GMT 时区的对象 而不是用户当前的时区 如果传递的数字大于 299 它就会失败 可能是因为 goog
  • 在 R 中导入 csv 文件时如何保留前导零?

    当我写一个 csv来自 R 的文件 其中我的组名称以前导零值开头 前导零被保留 但是当我导入 csv前导零被删除 组名称被转换为整数 当我导入一个组时 如何保留组名称中的前导零 csvR 中的文件 Example df lt data fr
  • 根据 R 数据框中的名称对列进行平均

    我想知道是否有一种有效的方法来获取每组的平均值类似命名的列谁的名字结尾为 1S and 2S ex ex1S ex2S at time 1并取每组的平均值类似命名的列谁的名字结尾为 1C or 2C ex ex1C ex2C at time
  • 如何在R中匹配具有相同主键的两个表中的数据

    我有两个表 其中包含有关人员的数据 df1 lt data frame id c 113 202 377 288 359 name c Alex Silvia Peter Jack Jonny 这为我提供了 id name 1 113 Al
  • 空间数据xyz到矩阵

    我有一个大数据框 100 000 行 其中包含 LON LAT VALUE 我想将其转换为矩阵 EPSG 中的坐标 3035 我使用以下命令尝试了 reshape2 包 acast df lon lat value var value 效果
  • R参考类问题

    我正在尝试在 R 中创建一个简单的参考类 这是我的代码 R 初学者 MyClass lt setRefClass MyClass fields list a numeric b numeric methods list initialize
  • 在 R 中使用逻辑 grep 抓取文本

    下午好 谢谢你帮我解答这个问题 我有兴趣抓取一组超过 5000 个 URL 的列表 我使用 lapply 和 readLines 使用下面的示例代码提取这些网页的文本 multipleURL lt c http dailymed nlm n
  • 在 Lavaan 生长曲线模型中提取个体轨迹

    我已经使用 R 的 Lavaan 包中的 Growth 函数成功地对一项研究的纵向数据进行了建模 我找不到任何关于如何提取每个参与者的预测轨迹的记录 我只能找到整个组的预测轨迹 在摘要输出的 拦截 部分下给出 使用 lavPredict m
  • R Leaflet Legend:colorBin-删除中断之间的小数

    我正在使用 Leaflet 库在 R 中创建交互式 HTML 地图 传说中采用的是colorBin用于创建将数据分为 6 个类别的方法 使用min values and max values 我已经定义了美国社区调查收入数据的特定范围可能落
  • R data.table fwrite 到 fread 空间分隔符并清空

    我在使用 fread 以 作为分隔符和散布的空白值时遇到问题 例如 这个 dt lt data table 1 5 1 5 1 5 make a simple table dt 3 V2 NA add a blank in the midd

随机推荐