使用 Bootstrap 重采样、LASSO 和逐步回归进行特征选择

问题描述 投票:0回答:2

本文中,作者通过以下方式进行放射组学特征选择以进行生存预测:

  1. Bootstrap 对数据集重采样 x 1000
  2. 将交叉验证的 LASSO 模型拟合到每个重采样的数据集
  3. 在所有 1000 个模型中保留 10 个最常见且系数非零的特征
  4. 使用十个选定的特征将反向逐步回归拟合到重新采样的数据集(与步骤 1 中生成的数据集相同)
  5. 根据最常见的cox回归模型选择最终特征。

我想复制这种方法(尽管是逻辑回归而不是 cox 回归)。

我能够使用以下 R 代码使用“boot”库从 Lasso 模型中获取前 K 个特征:

lasso_Select <- function(x, indices){ 
   x <- x[indices,]
   y <- x$Outcome
   x = subset(x, select = -Outcome)
   x2 <- as.matrix(x)
   fit <- glmnet(x2, y , family="binomial",alpha=1, standardize=TRUE)
   cv <- cv.glmnet(x2, y, family="binomial",alpha=1,  standardize=TRUE)
   fit <- glmnet(x2, y, family="binomial",alpha=1, lambda=cv$lambda.min,  standardize=TRUE)
     return(coef(fit)[,1])
   }

myBootstrap <- boot(scaled_train, lasso_Select, R = 1000, parallel = "multicore", ncpus=5)

但是,我不相信我可以访问各个重新采样的数据集,然后运行多个逻辑回归模型并选择最常见的模型。

关于如何解决这个问题有什么建议吗?

r machine-learning cross-validation feature-selection resampling
2个回答
1
投票

正如

boot()
的手册页所解释的:

对于大多数引导方法,重采样是在主进程中完成的,但如果

simple = TRUE
sim = "parametric"
则不会。

由于您没有进行参数引导,并且不需要指定

simple = TRUE
,因此当您在 R 提示符下键入
boot::boot
时显示的代码显示了如何生成重采样数据索引。关键代码是:

if (!simple) 
            i <- index.array(n, R, sim, strata, m, L, weights)

其中

n
是数据行数,
R
是引导样本数,其他参数在对
boot()
的调用中定义,似乎不适用于您的情况。输入
boot:::index.array
显示该函数的代码,该代码又根据您的情况调用
boot:::ordinary.array
。在您的情况下,
i
只是一个矩阵,显示每个引导样本使用哪些数据行。

调整

boot()
的代码以返回索引矩阵以及函数通常返回的其他值应该相当简单。

另一种方法可能是直接在

indices
函数中返回
lasso_Select()
,尽管我不确定
boot()
函数处理得如何。


0
投票

有一些

R
软件包也可以实现相对透明的引导LASSO分析!

查看:

您不必显式使用

boot
包 - 您可以简单地循环遍历 lasso 过程并保存系数。

保存单独的“重新采样”数据集将会非常快地消耗内存 - 我建议简单地保存每次迭代的采样方案:即采样的列和行。

您的具体要求是我没有想到的,

fastFeatures
,这是一个好主意,可以保留作为进一步分析的选项。

© www.soinside.com 2019 - 2024. All rights reserved.