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

时间:2013-09-20 07:37:54

标签: r machine-learning svm r-caret kernlab

我正在训练两个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值。 我将值视为:

model1(e1071)

1
0.8567979

model2(插入符号)

0.9910193
0.758201

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

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

3 个答案:

答案 0 :(得分:6)

是的,有可能,例如:

  • C默认值为1的e1071值不同caret,可能e1071使用其他值?
  • 数据缩放,默认情况下eps缩放您的输入,默认情况下插入符号不会缩放(尽管kernlab的svm确实如此,并且它是一个“引擎盖下”模型,所以它需要源检查才能确定)
  • 不同的maxiteration / {{1}}或其他与优化相关的阈值

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

答案 1 :(得分:4)

我观察到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))

这也更直观,因为两个具有大sigma值的近似样本将导致更高的相似性匹配。

我不确定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)。这仅在第二种情况下观察到。

答案 2 :(得分:0)

首先请注意svmLinear依赖于kernlab。您可以直接使用e1071中的caret,只需将svmLinear参数替换为svmLinear2(请参阅详细的模型列表及其依赖于in the docs的库)。< / p>

现在,请注意,如果您传递正确的参数,这两个库会产生相同的结果。我最近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 /费用 - sigma / gamma - eps / epsilon - rbfdot / radial ...