簡體   English   中英

用於在插入符中進行調整的自定義SVM模型出錯

[英]Error with custom SVM model for tuning in caret

我試圖通過此鏈接創建自定義SVM,並通過一些交叉驗證運行它。 我這樣做的主要原因是在我的網格搜索中運行Sigma,Cost和Epsilon參數,而最接近的插入符號模型(svmRadial)只能做到其中兩個。

當我嘗試運行以下代碼時,在網格的每次迭代中到處都會出現以下錯誤:

Warning in eval(expr, envir, enclos) :
  model fit failed for Fold1.: sigma=0.2, C=2, epsilon=0.1 Error in if (!isS4(modelFit) & !(method$label %in% c("Ensemble Partial Least Squares Regression",  : 
  argument is of length zero

即使從逐字復制鏈接中的代碼時,我也會遇到類似的錯誤,並且不確定如何解決它。 我發現該鏈接遍歷了自定義模型的構建方式,並且看到了引用此錯誤的位置,但是仍然不確定問題出在哪里。 我的代碼如下:

#Generate Tuning Criteria across Parameters
C <- c(1,2)
sigma <- c(0.1,.2)
epsilon <- c(0.1,.2)
grid <- data.frame(C,sigma)

#Parameters
prm <- data.frame(parameter = c("C", "sigma","epsilon"),
                  class = rep("numeric", 3),
                  label = c("Cost", "Sigma", "Epsilon"))

#Tuning Grid
svmGrid <- function(x, y, len = NULL) {
    expand.grid(sigma = sigma,
                C = C,
                epsilon = epsilon)
}

#Fit Element Function
svmFit <- function(x, y, wts, param, lev, last, weights, classProbs, ...) {
    ksvm(x = as.matrix(x), y = y,
         type = "eps-svr",
         kernel = rbfdot,
         kpar = list(sigma = param$sigma),
         C = param$C,
         epsilon = param$epsilon,
         prob.model = classProbs,
         ...)
}

#Predict Element Function
svmPred <- function(modelFit, newdata, preProc = NULL, submodels = NULL)
    predict(modelFit, newdata)

#Sort Element Function
svmSort <- function(x) x[order(x$C),]

#Model
newSVM <- list(type="Regression",
               library="kernlab",
               loop = NULL,
               parameters = prm,
               grid = svmGrid,
               fit = svmFit,
               predict = svmPred,
               prob = NULL,
               sort = svmSort,
               levels = NULL)                    


#Train 
tc<-trainControl("repeatedcv",number=2, repeats = 0,
                 verboseIter = T,savePredictions=T)
svmCV <- train(
    Y~ 1
    + X1
    + X2
    ,data = data_nn,
    method=newSVM, 
    trControl=tc
    ,preProc = c("center","scale"))                 
svmCV

在查看了提供的第二個鏈接之后,我決定嘗試在模型的參數中包含一個標簽,從而解決了該問題! 有趣的是,它的作用在於插入符號文檔中指出該值是可選的,但如果起作用,我就不會抱怨。

#Model 
newSVM <- list(label="My Model",
                   type="Regression",
                   library="kernlab",
                   loop = NULL,
                   parameters = prm,
                   grid = svmGrid,
                   fit = svmFit,
                   predict = svmPred,
                   prob = NULL,
                   sort = svmSort,
                   levels = NULL)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM