1

我在MLSeqR 版本 3.1.2 的 Ubuntu 上使用 bioconductor 包。我已经尝试运行包提供的示例,并且效果很好。但是,我想使用bagsvm该函数的方法classify,所以在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:停止(“停止”)
3:train.default(计数,条件,方法=“包”,B = B,bagControl = bagControl(fit = svmBag$fit,
       预测 = svmBag$pred,聚合 = svmBag$aggregate),trControl = ctrl,
       ...)
2:火车(计数,条件,方法=“包”,B = B,bagControl = bagControl(fit = svmBag$fit,
       预测 = svmBag$pred,聚合 = svmBag$aggregate),trControl = ctrl,
       ...)
1:分类(数据= data.trainS4,方法=“bagsvm”,标准化=“deseq”,
       deseqTransform = "vst", cv = 5, rpt = 3, ref = "T")

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

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

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

警告信息:
    1:在 eval(expr, envir, enclos) 中:
      Fold1.Rep1 的模型拟合失败:vars=150 拟合器错误(btSamples[[iter]],x = x,y = y,ctrl = bagControl,v = vars,:
      任务 1 失败 - “没有适用于 'predict' 的方法应用于类“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是类的一个因素,我得到了完全相同的结果。任何帮助深表感谢。

4

2 回答 2

1

我承认我没有尝试重现您的所有步骤。但是,您要做的只是从可行的“SVM”转变为“SVM 的bagging ensemble”。我不确定您是否完全了解这意味着什么,但简而言之:

您不仅可以使用所有(训练)数据制作 1 个模型,还可以:

  • 制作几个模型
  • 每个模型都使用随机选择的训练数据子集(“装袋”
  • 每个模型的质量都通过查看它在训练数据的未使用部分上的表现来验证。

因为是这样,而且因为这是你所做的唯一改变,我怀疑:

  • 您的数据太少,或者空的条目太多,或者NA无法完成 bagging 中的任何这些 mini-SVM 模型。

看起来mini-SVM 模型默认分为 100 个样本集。(请参阅B = 100分类中的默认选项。)例如,如果这些子模型中的一个只有 100 个观察值有可能具有完全空白/NA特征,那么装袋模型将失败。


如何解决?

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

  • 接下来,如果该模型确实适用于上述任何修复,我会看看您是否可以通过(a)查看缺失值是否可以以某种方式恢复,或者(b)查看某些具有缺失值的观察质量非常低,您可能需要考虑完全删除该观察。

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

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

于 2015-08-06T00:55:44.620 回答
1

我试图调试我的问题,似乎无意中找到了解决方案。由于问题似乎出在预测函数中,所以我将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. 不知何故,这解决了问题,一切运行良好。如果有人能弄清楚为什么会这样,并且最好找到一个不是那么复杂的解决方案,我会让你的回答成为答案。

于 2015-08-10T17:43:04.043 回答