【问题标题】:R caret package rfe never finishes error task 1 failed - "replacement has length zero"R 插入符号包 rfe 永远不会完成错误任务 1 失败 - “替换长度为零”
【发布时间】:2014-04-03 11:39:29
【问题描述】:

我最近开始研究我正在开发的模型的插入符号包。我正在使用最新版本。作为第一步,我决定将其用于特征选择。我使用的数据有大约 760 个特征和 10k 个观察值。我根据网上的培训资料创建了一个简单的函数。不幸的是,我一直收到错误,因此该过程永远不会完成。这是产生错误的代码。在此示例中,我使用了一小部分功能。我从全套功能开始。我还更改了子集、折叠次数和重复次数,但无济于事。我知道如果没有数据就很难追查问题。我有shared 数据的一小部分(在下面使用的 r 对象格式中)。如果您无法从那里获取文件,请尝试link

它总是产生这个错误:

{ 中的错误:任务 1 失败 -“替换长度为零”

caretFeatureSelection <- function() {
  library(caret)
  library(mlbench)
  library(Hmisc)

  set.seed(10)

  lr.features = c("f2", f271","f527","f528","f404", "f376", "f67",  "f670", "f281", "f333", "f13",  "f282", "f599",
                  "f597", "f68",  "f629", "f378", "f230", "f229", "f273", "f768", "f406", "f630", 
                  "f596", "f598", "f413", "f412", "f332", "f377", "f766", "f767", "f775", "f10", "f442")

  trainDF <- readRDS(file='trainDF.rds')
  trainDF <- trainDF[trainDF$loss>0,]
  trainDF$lossProb <- trainDF$loss/100
  y <- trainDF[,'lossProb']
  x <- trainDF[,names(trainDF) %in% lr.features]

  rm(trainDF)

  subsets <- c(1:5, 10, 15, 20, 25)
  ctrl <- rfeControl(functions = lrFuncs,
                   method = "repeatedcv",
                   repeats = 1,
                   number=5)

  lrProfile <- rfe(x, y,
                 sizes = subsets,
                 rfeControl = ctrl)

  lrProfile
}

【问题讨论】:

  • Fred:您将不得不重新保存数据。加载该文件时,我得到"Error: bad restore file magic number (file may be corrupted) -- no data loaded, In addition: Warning message: file ‘small_trainDF.rds’ has magic number 'X' Use of save versions prior to 2 is deprecated"
  • 我添加了第二个链接,但第一个链接在我刚尝试时有效。我能够使用 loadRDS 在 R 中加载文件。这是同一文件的第二个链接app.box.com/s/j3f5nkuu4mxg9a4rauke
  • 将链接更改为指向 dput 文件。

标签: r r-caret feature-selection


【解决方案1】:

所以看数据,失败的原因有3个。首先,

> str(x)
'data.frame':   100 obs. of  34 variables:
 $ f2  : Factor w/ 10 levels "1","2","3","4",..: 8 8 8 8 9 8 9 9 7 8 ...
<snip>

rfelm 模型拟合到这些数据并生成 39 个系数,即使数据框 x 有 34 列。结果,rfe 变得……困惑。在运行rfe之前尝试使用model.matrix将因子转换为虚拟变量:

x2 <- model.matrix(~., data = x)[,-1]  ## the -1 removes the intercept column

...但是...

> table(x$f2)

 1  2  3  4  6  7  8  9 10 11 
 0  0  0  2  2  5 32 36 23  0 

所以model.matrix 将生成一些零方差预测变量(这是一个问题)。您可以使用排除空级别的新级别创建一个新因子,但请记住,对这些数据进行任何重新采样都会将某些因子级别(例如“4”、“6”)强制转换为零方差预测变量。

其次,一些预测变量之间存在完美的相关性:

> cor(x$f597, x$f599)
     [,1]
[1,]    1

这将导致某些模型系数的NA 值,并导致缺少变量重要性,并将导致rfe 失效。

除非您使用的是树或其他能够容忍稀疏和/或相关预测变量的模型,否则rfe 之前的可能工作流程可能是:

> x2 <- model.matrix(~., data = x)[,-1]
> 
> nzv <- nearZeroVar(x2)
> x3 <- x2[, -nzv]
> 
> corr_mat <- cor(x3)
> too_high <- findCorrelation(corr_mat, cutoff = .9)
> x4 <- x3[, -too_high]
> 
> c(ncol(x2), ncol(x3), ncol(x4))
[1] 42 37 27

最后,从 y 的外观看,您想预测一个数字,但 lrFuncs 用于逻辑回归,所以我认为这是 lmFuncs 的拼写错误。如果是这样,rfe 工作正常:

> subsets <- c(1:5, 10, 15, 20, 25)
> ctrl <- rfeControl(functions = lmFuncs,
+                    method = "repeatedcv",
+                    repeats = 1,
+                    number=5)
> set.seed(1)
> lrProfile <- rfe(as.data.frame(x4), y,
+                  sizes = subsets,
+                  rfeControl = ctrl)

最大

【讨论】:

  • 谢谢马克斯。现在说得通了。我正在使用 lrFunc 获得 0,1 之间的概率,目标变量是 lossProb 而不是 loss。
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多