我使用以下包将带有径向内核的SVM算法应用于回归问题: 插入符号(使用SVMRadial方法训练函数),e1071(svm函数)和kernlab(ksvm函数)。 对于插入符号和kernlab上的函数,我修复了e1071中svm函数估计的超参数值。
我从e1071和kernlab的ksvm模型获得了相同的svm模型结果, 但是为了在插入符号上实现列车功能,结果完全不同。
这是一个可重复的例子:
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
我怀疑在执行列车功能时, 这个问题被认为是分类而不是回归。 有没有办法验证这是否真的发生了?也许这是与我的R版本有关的问题(R版本3.3.2(2016-10-31)?
非常感谢任何帮助。
祝你好运, 海伦