2015-04-04 5 views
2

В настоящее время каретный поезд использует функцию kernlab svm под капотом, и это медленно для моей текущей цели. Но e1071 svm trainers предлагают очень необходимое ускорение скорости. Поэтому мне бы хотелось, чтобы cv-процедура карет с svm-тренерами e1071. Есть ли способ сделать это? В основном я хочу, чтобы svm-движок каретки был заменен на e1071 из ядра kernlab по умолчанию.SVM в R с кареткой с использованием 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

Я не пробовал, но это выглядит, как вы можете использовать '' e1071' svm' функцию '' caret' используя средства caret' для определения [пользовательская модель] (http://topepo.github.io/caret/custom_models.html). – eipi10

+0

Спасибо, попробуем использовать это. – Frash

ответ

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 здесь, чтобы оценить sigma? '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 (сигма [-2])), cost = 2^((1: len) - 3))) ' – Glassjawed

Смежные вопросы