2015-04-04 44 views
2

目前插入符号引擎使用kernlab svm函数,这些函数对于我当前的目的而言是缓慢的。但e1071 svm培训师提供了急需的速度提升。所以我想用e1071的svm培训师来做cv程序。有没有办法做到这一点?基本上我希望插入符号的svm引擎由默认kernlab中的e1071替换。R中的SVM与使用e1071而不是kernlab的插入符号

我使用下面的代码来训练当前。

SVM使用kernlab

svmModel2 = train(factor(TopPick) ~. - Date , data = trainSet, method = 'svmRadial') 
pred.svm2 = predict(svmModel2, testSet) 

SVM使用e1071

svmModel = e1071::svm(factor(TopPick) ~ . - Date, data = trainSet) 
pred.svm = predict(svmModel, testSet) 

感谢您的帮助。

+1

我没有试过,但它看起来像你可以使用'定义caret'设施使用''e1071'功能svm'在'caret'一个[自定义模型](http://topepo.github.io/caret/custom_models.html)。 – eipi10 2015-04-04 23:50:07

+0

谢谢,会尝试使用。 – Frash 2015-04-05 05:05:46

回答

3

正如评论中所建议的,您可以创建自己的自定义模型。

svmRadial2ModelInfo <- list(
    label = "Support Vector Machines with Radial Kernel based on libsvm", 
    library = "e1071", 
    type = c("Regression", "Classification"), 
    parameters = data.frame(parameter = c("cost", "gamma"), 
          class = c("numeric", "numeric"), 
          label = c("Cost", "Gamma")), 
    grid = function(x, y, len = NULL, search = NULL) { 
       sigmas <- kernlab::sigest(as.matrix(x), na.action = na.omit, scaled = TRUE) 
       return(expand.grid(gamma = mean(as.vector(sigmas[-2])), 
            cost = 2 ^((1:len) - 3))) 
    }, 
    loop = NULL, 
    fit  = function(x, y, wts, param, lev, last, classProbs, ...) { 
       if(any(names(list(...)) == "probability") | is.numeric(y)) 
       { 
       out <- svm(x = as.matrix(x), y = y, 
          kernel = "radial", 
          cost = param$cost, 
          gamma = param$gamma, 
          ...) 
       } else { 
       out <- svm(x = as.matrix(x), y = y, 
          kernel = "radial", 
          cost = param$cost, 
          gamma = param$gamma, 
          probability = classProbs, 
          ...) 
       } 
       out 
    }, 
    predict = function(modelFit, newdata, submodels = NULL) { 
    predict(modelFit, newdata) 
    }, 
    prob = function(modelFit, newdata, submodels = NULL) { 
    out <- predict(modelFit, newdata, probability = TRUE) 
    attr(out, "probabilities") 
    }, 
    varImp = NULL, 
    predictors = function(x, ...){ 
    out <- if(!is.null(x$terms)) predictors.terms(x$terms) else x$xNames 
    if(is.null(out)) out <- names(attr(x, "scaling")$x.scale$`scaled:center`) 
    if(is.null(out)) out <-NA 
    out 
    }, 
    levels = function(x) x$levels, 
    sort = function(x) x[order(x$cost, -x$gamma),] 
) 

用法:

svmR <- caret::train(x = trainingSet$x, 
        y = trainingSet$y, 
        trControl = caret::trainControl(number=10), 
        method = svmRadial2ModelInfo, 
        tuneLength = 3) 
+0

为什么你仍然在这里使用kernlab而不是e1071来估计西格玛? (x,y,len = NULL,search = NULL) sigmas < - kernlab :: sigest(as.matrix(x),na.action = na.omit,scaled = TRUE) return (expand.grid(gamma = mean(as.vector(sigmas [-2])), cost = 2 ^((1:len)-3)))'' – Glassjawed 2016-11-13 18:22:57