2

我使用以下软件包将带有径向内核的 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)有关的问题?

任何帮助都感激不尽。

最好的问候, 海伦

4

0 回答 0