我使用以下软件包将带有径向内核的 SVM 算法应用于回归问题:caret(使用 SVMRadial 方法的训练函数)、e1071(svm 函数)和 kernlab(ksvm 函数)。对于 caret 和 kernlab 上的函数,我修复了由 e1071 中的 svm 函数估计的超参数值。
我从 e1071 的 svm 模型和来自 kernlab 的 ksvm 模型获得了相同的结果,但是对于插入符号上的 train 函数的实现,结果完全不同。
这是一个可重现的示例:
library(caret)
library(kernlab)
library(tidyverse)
library(e1071)
library(hydroGOF)
library(AppliedPredictiveModeling)
#data set
data(solubility)
trainData<-cbind(solTrainY,solTrainXtrans)
names(trainData)[1]<-"Y"
testData<-cbind(solTestY,solTestXtrans)
names(testData)[1]<-"Y_holdout"
#e1071 package
SVMr_e1071 <- svm(Y ~ ., data = trainData, kernel = "radial")
predSVMr_e1071 <- predict(SVMr_e1071, select(testData,-Y_holdout))
modelRMSE1<-rmse(testData$Y_holdout, predSVMr_e1071)
modelRMSE1 #0.6535902
#caret package
SVMrGrid <- expand.grid(.C = 1,.sigma=0.004385965)
SVMr_caret <- train(Y ~ .,
data=trainData,
method = "svmRadial",
tuneGrid = SVMrGrid,
trControl = trainControl(method="none",savePredictions=TRUE))
predSVMr_caret <- predict(SVMr_caret,select(testData,-Y_holdout))
modelRMSE2<-rmse(testData$Y_holdout, predSVMr_caret)
modelRMSE2 #1.887908
#kernlab package
SVMr_k<- ksvm(Y ~ ., data = trainData,kernel ="rbfdot",
C = 1, kpar = list(sigma=0.004385965))
predSVMr_k <- as.numeric(predict(SVMr_k, select(testData,-Y_holdout)))
modelRMSE3<-rmse(testData$Y_holdout, predSVMr_k)
modelRMSE3 #0.6535902
我怀疑在 train 函数的实现中,问题被认为是分类而不是回归。有没有办法验证这是否真的发生了?也许这是与我的 R 版本(R 版本 3.3.2(2016-10-31)有关的问题?
任何帮助都感激不尽。
最好的问候, 海伦