【问题标题】:caret function 'train' failing for bagged svm袋装 svm 的插入符号函数“train”失败
【发布时间】:2015-10-28 22:49:52
【问题描述】:

我在 R 版本 3.1.2 的 Ubuntu 上使用 bioconductor 包 MLSeq。我试过通过the example provided by the package 运行,效果很好。但是,我想将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: stop("停止")
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")

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

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 是类的一个因素,我得到了完全相同的结果。非常感谢任何帮助。

【问题讨论】:

    标签: r svm r-caret bioconductor kernlab


    【解决方案1】:

    我承认我没有尝试重现您的所有步骤。但是,您要做的只是从可行的“SVM”转变为“SVM 的bagging ensemble”。我不确定你是否知道entirely what that means,但简而言之:

    您可以:

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

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

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

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


    如何解决?

      1234563 table(is.na(feature_oi))
    • 接下来,如果模型确实适用于上述任何修复,我会看看您是否可以通过以下方式修复数据本身) 查看是否有一些具有缺失值的观察质量太低,您可能需要考虑完全删除该观察。

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

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

    【讨论】:

    • 我尝试了您的建议,数据中没有缺失值。当我尝试将 B 值增加到 1000 时,我得到了相同的错误,但是警告更改为 In .local(x, ...) : Variable(s) ' constant. Cannot scale data. 我直接在 train 函数中尝试了所有这些,如上面最后一行代码所示,所以它可以'不特定于MLSeq 实现与bagsvm
    • 它说“变量常数” b/c 你有一些只表示一次的级别,当你分成 1000 个组时。如果这些建议都不起作用,那么找到另一个你确定是干净的数据集,看看它是否适合你。
    • 我列出的所有错误和警告都来自MLSeq 包的创建者提供的数据集,而不是我的数据。您是否推荐了其他一些数据源,或者有更好的方法来评估数据是否“干净”?我不认为问题出在数据上。如果您查看下面发布的答案,我可以通过将分类器的 predict 函数存储在不同的变量中来使函数工作,但我不知道为什么会修复任何问题。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-05-15
      • 2017-09-25
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 2017-05-19
      • 2018-11-11
      • 2016-07-14
      相关资源
      最近更新 更多