8

我正在对我的数据使用两个不同的包来训练两个 SVM 模型,并得到截然不同的结果。这是可以预料的吗?

使用 e1071 的模型 1

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)

使用插入符号的模型2

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 值,给定目标的预测值和实际值。我将这些值视为:

型号 1 (e1071)

1
0.8567979

模型2(插入符号)

0.9910193
0.758201

这是可能的吗?还是我做错了?

如果有帮助,我可以提供示例数据

4

3 回答 3

7

是的,这是可能的,例如:

  • 不同C的值,e1071默认值为1,也许caret使用其他?
  • 数据缩放,e1071默认缩放您的输入,插入符号默认不缩放(尽管 kernlab 的 svm 可以,并且它是“幕后”模型,因此需要进行源检查才能确定)
  • 不同eps/maxiteration或其他优化相关阈值

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

于 2013-09-20T09:53:01.157 回答
5

我观察到 kernlab 使用 rbfkernel 作为,

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

但根据这个wiki 链接,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,而内核 sigma=100)。这仅在第二种情况下观察到。

于 2014-07-08T05:38:04.583 回答
0

首先注意svmLinear依赖kernlab. 您可以直接使用e1071fromcaret简单地替换svmLinear参数(请参阅docssvmLinear2 中的模型和它们所依赖的库的详细列表)。

现在,请注意,如果您向它们传递正确的参数,这两个库会产生相同的结果。我最近对这些方法进行了基准测试,并指出传递以下参数可确保获得相同的结果:

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 ...

于 2018-06-12T12:42:41.993 回答