use*_*594 8 r machine-learning svm kernlab r-caret
我正在训练两个SVM模型,在我的数据上使用两个不同的包,并得到截然不同的结果.这是预期的吗?
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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
calculateAUC()
是给定目标的预测值和实际值,我定义的函数来计算AUC值.我认为价值观为:
1
0.8567979
0.9910193
0.758201
这是可能的吗?或者我做错了吗?
我可以提供样本数据,如果这将有所帮助
是的,有可能,例如:
C
值,e1071
默认值为1,可能caret
使用其他值?e1071
默认情况下缩放输入,默认情况下插入符号不会缩放(尽管kernlab的svm确实如此,并且它是"引擎盖下"模型,因此需要进行源检查才能确定)eps
/ maxiteration
或其他优化相关的阈值只需在学习后显示模型参数并检查它们是否相同,您可能会发现一些参数,默认情况下这两个库之间的参数不同.
我观察到kernlab使用rbfkernel作为,
rbf(x,y) = exp(-sigma * euclideanNorm(x-y)^2)
Run Code Online (Sandbox Code Playgroud)
但根据此Wiki链接,rbf内核应为
rbf(x,y) = exp(-euclideanNorm(x-y)^2/(2*sigma^2))
Run Code Online (Sandbox Code Playgroud)
这也更加直观,因为两个接近的具有大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) )
Run Code Online (Sandbox Code Playgroud)
我希望内核值接近1(因为x,y来自sigma = 1,而内核sigma = 100)。这仅在第二种情况下可以观察到。