【问题标题】:Least Square Support Vector Machine in Caret fail插入符号中的最小二乘支持向量机失败
【发布时间】:2018-02-21 20:53:48
【问题描述】:

我尝试在R 中安装caret 包中的最小二乘支持向量机,但我无法让它工作。即使对于像这样的极端简单的例子,它也会失败:

library(caret)
library(tidyverse)
data("iris")


#to make this example a binary classification task

iris <- iris %>% filter(Species %in% c("setosa", "versicolor")) %>%
    mutate(Species = droplevels(Species))

svmls <- train(Species ~ .,
               iris,
               method = "lssvmLinear",
               preProc = c("center", "scale")
               )

有几个这样的警告:

In eval(xpr, envir = envir) :
  model fit failed for Resample09: tau=0.0625 Error in if (truegain[k] < tol) break : 
  missing value where TRUE/FALSE needed

同时从kernlab直接调用lssmv函数成功:

library(kernlab)
svmls2 <- lssvm(Species~.,data=iris)
svmls2

如果你能猜出什么是错误的,我真的很感激。

【问题讨论】:

  • 可以直接用lssvm得到模型吗?我们怎么知道这是caret 问题?
  • @topepo 抱歉,我没有提到我尝试过。见编辑。
  • 下一个问题是您能否将它直接安装在它失败的单个折叠上。然后预测坚持。我倾向于发现这些错误是由于在给定重采样的训练集中省略了某个类的重采样造成的,因此当您预测模型不知道如何处理该类时。
  • 我不知道如何获得失败的折叠。那么如何获取例如 Resample09 的数据集呢?

标签: r machine-learning svm r-caret


【解决方案1】:

我知道这个问题已经很老了,但这里有一些答案

我也遇到了同样的错误,当 Look depth in 时,LSSVM Linear 的 Caret Default 使用的是 Polygonal Kernel,看起来像这样:

getModelInfo()$lssvmLinear$fit
function(x, y, wts, param, lev, last, classProbs, ...) {
                    kernlab::lssvm(x = as.matrix(x), y = y,
                                   tau = param$tau,
                                   kernel = kernlab::polydot(degree = 1,
                                                             scale = 1,
                                                             offset = 1), ...)    
                  }

因此我将其编辑为仅使用默认内核,这样它就可以像预期的那样运行:

newlssvm <- getModelInfo()$lssvmLinear
newlssvm$fit <- function(x, y, wts, param, lev, last, classProbs, ...) {
  kernlab::lssvm(x = as.matrix(x), y = y,
                 tau = param$tau)    
}

svmls <- train(Species ~ .,
               iris,
               method = newlssvm,
               preProc = c("center", "scale")
               )

我说这个问题出在kernlab,因为:

lssvm(Species~.,data= iris, kernel = kernlab::polydot(degree = 2,
                                                      scale = 0.01, offset=1))

给出类似的错误:

Error in if (truegain[k] < tol) break : 
  missing value where TRUE/FALSE needed
In addition: Warning message:
In sqrt(G[kadv, kadv]) : NaNs produced

【讨论】:

  • 确实如此,但这仅适用于 generics::train,不适用于 caret::train。用最后一个尝试会得到一个“错误:模型 newlssvm 不在插入符号的内置库中”。我想这需要创建一个新模型(topepo.github.io/caret/using-your-own-model-in-train.html)才能被 caret::train 函数访问。
猜你喜欢
  • 2013-07-24
  • 2019-06-03
  • 2018-11-03
  • 1970-01-01
  • 2015-01-18
  • 2013-04-26
  • 1970-01-01
  • 2016-06-11
  • 2021-11-11
相关资源
最近更新 更多