首页 文章

使用e1071和插入符号的SVM模型的结果差异很大

提问于
浏览
8

我正在训练两个SVM模型,在我的数据上使用两个不同的包,并得到截然不同的结果 . 这是预期的吗?

model1使用e1071

library('e1071')
model1 <- svm(myFormula, data=trainset,type='C',kernel='linear',probability = TRUE)
outTrain <- predict(model1, trainset, probability = TRUE)
outTest <- predict(model1, testset, probability = TRUE)
train_pred <- attr(outTrain, "probabilities")[,2]
test_pred <- attr(outTest, "probabilities")[,2]
calculateAUC(train_pred,trainTarget)
calculateAUC(test_pred,testTarget)

model2使用插入符号

model2 <- train(myFormula,data=trainset,method='svmLinear')
train_pred <- predict(model2, trainset)
test_pred  <- predict(model2, testset)
calculateAUC(train_pred,trainTarget)
calculateAUC(test_pred,testTarget)

calculateAUC() 是我定义的函数,用于计算目标的预测值和实际值的AUC值 . 我认为 Value 观为:

model1(e1071)

1
0.8567979

model2(插入符号)

0.9910193
0.758201

这是可能的吗?或者我做错了吗?

我可以提供样本数据,如果这将有所帮助

3 回答

  • 4

    是的,有可能,例如:

    • 不同的 C 值, e1071 默认值为1,也许 caret 使用其他?

    • 数据缩放, e1071 默认情况下缩放输入,插入符号默认不缩放(尽管kernlab的svm确实如此,并且它是"under the hood"模型,所以它需要源检查才能确定)

    • 不同的 eps / maxiteration 或其他与优化相关的阈值

    只需在学习后显示模型参数并检查它们是否相同,您可能会发现一些参数,默认情况下这两个库之间的参数不同 .

  • 6

    我观察到kernlab使用rbfkernel,

    rbf(x,y) = exp(-sigma * euclideanNorm(x-y)^2)
    

    但根据这个wiki link,rbf内核应该是

    rbf(x,y) = exp(-euclideanNorm(x-y)^2/(2*sigma^2))
    

    这也更直观,因为具有大西格玛值的两个紧密样本将导致更高的相似性匹配 .

    我不确定 e1071 svm 使用什么(本机代码libsvm?)

    我知道这是一个老线程,但希望有人可以告诉我为什么会有区别?比较的一个小例子

    set.seed(123)
    x <- rnorm(3)
    y <- rnorm(3)
    sigma <- 100
    
    rbf <- rbfdot(sigma=sigma)
    rbf(x, y)
    exp( -sum((x-y)^2)/(2*sigma^2) )
    

    我希望内核值接近1(因为x,y来自sigma = 1,而kernel sigma = 100) . 仅在第二种情况下观察到这种情况 .

  • 0

    首先请注意 svmLinear 依赖于 kernlab . 您可以直接使用 e1071caret 简单地用 svmLinear2 替换 svmLinear 参数(参见模型的详细列表和它们依赖的库in the docs) .

    现在,请注意,如果您向它们传递正确的参数,则两个库会产生相同的结果 . 我最近benchmarked these methods并注意到传递以下参数可确保相同的结果:

    model_kernlab <-
      kernlab::ksvm(
          x = X,
          y = Y,
          scaled = TRUE,
          C = 5,
          kernel = "rbfdot",
          kpar = list(sigma = 1),
          type = "eps-svr",
          epsilon = 0.1
          )
    
    model_e1071 <- e1071::svm(x = X,
          y = Y,
          cost = 5,
          scale = TRUE, 
          kernel = "radial",
          gamma = 1,
          type = "eps-regression",
          epsilon = 0.1)
    

    注意不同的名称: - C / cost - sigma / gamma - eps / epsilon - rbfdot / radial ...

相关问题