插入符函数 'train' 袋装 svm 失败

caret function 'train' failing for bagged svm

我在 Ubuntu 上使用 R 版本 3.1.2 的 bioconductor 包 MLSeq。我试过 运行 到 the example provided by the package,效果很好。但是,我想对 classify 函数使用 bagsvm 方法,所以在 chunk 14 处,我将代码从

svm <- classify(data = data.trainS4, method = "svm", normalize = "deseq",
               deseqTransform = "vst", cv = 5, rpt = 3, ref = "T") 

 bagsvm <- classify(data = data.trainS4, method = "bagsvm", normalize = "deseq",
               deseqTransform = "vst", cv = 5, rpt = 3, ref = "T")

产生了错误:

Something is wrong; all the Accuracy metric values are missing:
    Accuracy       Kappa   
 Min.   : NA   Min.   : NA 
 1st Qu.: NA   1st Qu.: NA 
 Median : NA   Median : NA 
 Mean   :NaN   Mean   :NaN 
 3rd Qu.: NA   3rd Qu.: NA 
 Max.   : NA   Max.   : NA 
 NA's   :1     NA's   :1   
Error in train.default(counts, conditions, method = "bag", B = B, bagControl = bagControl(fit = svmBag$fit,  :
  Stopping
In addition: There were 17 warnings (use warnings() to see them)

警告是:

 Warning messages:
1: executing %dopar% sequentially: no parallel backend registered
2: In eval(expr, envir, enclos) :
  model fit failed for Fold1.Rep1: vars=150 Error in fitter(btSamples[[iter]], x = x, y = y, ctrl = bagControl, v = vars,  :
  task 1 failed - "could not find function "lev""

然后警告 2 重复了 14 次,然后是:

17: In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo,  ... :
  There were missing values in resampled performance measures.

traceback()出品

4: stop("Stopping")
3: train.default(counts, conditions, method = "bag", B = B, bagControl = bagControl(fit = svmBag$fit, 
       predict = svmBag$pred, aggregate = svmBag$aggregate), trControl = ctrl, 
       ...)
2: train(counts, conditions, method = "bag", B = B, bagControl = bagControl(fit = svmBag$fit, 
       predict = svmBag$pred, aggregate = svmBag$aggregate), trControl = ctrl, 
       ...)
1: classify(data = data.trainS4, method = "bagsvm", normalize = "deseq", 
       deseqTransform = "vst", cv = 5, rpt = 3, ref = "T")

我认为问题可能是我认为 MLSeq 代码使用的 kernlab 库没有加载,所以我尝试了

library(kernlab)
bagsvm <- classify(data = data.trainS4, method = "bagsvm", normalize = "deseq",
               deseqTransform = "vst", cv = 5, rpt = 3, ref = "T")

导致相同的错误,但警告更改为:

Warning messages:
    1: In eval(expr, envir, enclos) :
      model fit failed for Fold1.Rep1: vars=150 Error in fitter(btSamples[[iter]], x = x, y = y, ctrl = bagControl, v = vars,  :
      task 1 failed - "no applicable method for 'predict' applied to an object of class "c('ksvm', 'vm')""

重复 15 次后跟

16: In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo,  ... :
  There were missing values in resampled performance measures.

我不认为这个问题是 MLSeq 特有的,因为我尝试 运行 train 函数作为

ctrl <- trainControl(method = "repeatedcv", number = 5, 
    repeats = 3)
train <- train(counts, conditions, method = "bag", B = 100, 
           bagControl = bagControl(fit = svmBag$fit, predict = svmBag$pred, 
                                   aggregate = svmBag$aggregate), trControl = ctrl)

其中 counts 是包含 RNASeq 数据的数据框,conditions 是 类 的一个因素,我得到了完全相同的结果。非常感谢任何帮助。

我承认我没有尝试重现您的所有步骤。但是,您要做的只是从有效的 "SVM" 到 "bagging ensemble of SVMs"。我不确定你是否知道entirely what that means,但这里简而言之:

您不是只使用所有(训练)数据制作 1 个模型,而是:

  • 制作多个模型
  • 其中每个模型都使用随机选择的 训练 数据子集 ("bagging")
  • 并且每个模型的质量都通过观察它在 未使用 部分训练 数据上的表现来验证。

因为是这种情况,并且因为这是您所做的唯一更改,所以我怀疑:

  • 您的数据太少,或者空条目太多,或者 NA,以至于无法完成装袋中的任何这些迷你 SVM 模型。

看起来像 mini-SVM models are broken into sets of 100 samples, by default。 (请参阅分类中的 B = 100 默认选项。)例如,如果这些只有 100 个观察值的子模型之一可能具有完全空白/NA 特征,则装袋模型将失败。


如何解决?

  • 首先,我会尝试将 B 值提高到更大的值,比如 1000。出于类似的原因,我会检查任何缺失值的数量类似 table(is.na(feature_oi))

  • 的功能
  • 接下来,如果模型确实适用于上述任何修复,我会看看您是否可以通过以下任一方式修复数据本身:(a) 查看是否可以以某种方式恢复缺失值,或者 (b) 查看是否有一些缺失值的观测值质量太低以至于您可能要考虑完全删除观测值。

  • 当然,如果模型确实适用于这些修复,另一种解决方案是仅将其与这些修复一起使用。使 B 1000 或更大的东西。请记住,如果这是您在生产中尝试 运行 的东西,那么您仍在构建有时会崩溃的摇摇欲坠的东西。

  • 最后,如果最初的修复没有使模型工作,那么我不确定问题所在。可能是 bagsvm 的实现本身有一个错误。希望更熟悉图书馆的人可以在这方面提供更多建议。

我试图调试我的问题,似乎无意中找到了解决方案。由于问题似乎出在预测函数中,所以我将 svmBag$pred 函数存储为变量 predfunct 这样我就可以看到它在哪里不起作用

predfunct<-function (object, x)
{
 if (is.character(lev(object))) {
    out <- predict(object, as.matrix(x), type = "probabilities")
    colnames(out) <- lev(object)
    rownames(out) <- NULL
  }
  else out <- predict(object, as.matrix(x))[, 1]
  out
}

然后调用

train <- train(counts, conditions, method = "bag", B = 100, 
       bagControl = bagControl(fit = svmBag$fit, predict = predfunct, 
                               aggregate = svmBag$aggregate), trControl = ctrl)

在问题描述的最后一个代码块中用 predfunct 替换 svmBag$pred。这以某种方式解决了问题,一切运行正常。如果有人能弄清楚为什么会这样,并且最好能找到一个不是那么麻烦的解决方案,我会将您的回复作为答案。