为了学习支持向量机,我们必须确定各种参数。

例如,有一些参数,例如成本和伽玛。

我正在尝试使用R的“ GA”包和“ kernlab”包确定SVM的sigma和gamma参数。

我将准确性用作遗传算法的评估函数。

我创建了以下代码,并运行了它。

library(GA)
library(kernlab)
data(spam)
index <- sample(1:dim(spam)[1])
spamtrain <- spam[index[1:floor(dim(spam)[1]/2)], ]
spamtest <- spam[index[((ceiling(dim(spam)[1]/2)) + 1):dim(spam)[1]], ]

f <- function(x)
{
x1 <- x[1]
x2 <- x[2]
filter <- ksvm(type~.,data=spamtrain,kernel="rbfdot",kpar=list(sigma=x1),C=x2,cross=3)
mailtype <- predict(filter,spamtest[,-58])
t <- table(mailtype,spamtest[,58])
return(t[1,1]+t[2,2])/(t[1,1]+t[1,2]+t[2,1]+t[2,2])
}

GA <- ga(type = "real-valued", fitness = f, min = c(-5.12, -5.12), max = c(5.12, 5.12), popSize = 50, maxiter = 2)
summary(GA)
plot(GA)


但是,当我调用GA函数时,将返回以下错误。

“未找到支持向量。您可能要更改参数”

我不明白为什么代码不好。

最佳答案

将GA用于SVM参数不是一个好主意-仅进行常规的网格搜索就足够了(两个用于循环,一个用于C,一个用于gamma值)。

在Rs库e1071 (which also provides SVMs) there is a method tune.svm`中,它使用网格搜索来查找最佳参数。



data(iris)
obj <- tune.svm(Species~., data = iris, sampling = "fix",
gamma = 2^c(-8,-4,0,4), cost = 2^c(-8,-4,-2,0))
plot(obj, transform.x = log2, transform.y = log2)
plot(obj, type = "perspective", theta = 120, phi = 45)


这也显示了一件重要的事情-您应该以几何方式寻找良好的C和伽玛值,例如。 2^xx中的{-10,-8,-6,-6,-4,-2,0,2,4}

遗传算法是一种用于元优化的算法,其中参数空间巨大,并且参数与优化函数之间不存在容易的关联。它需要比SVM调整更多的参数(世代数,种群大小,变异概率,杂交概率,变异算子,杂交算子...),因此在这里它完全没用。

当然,正如前面评论中所述,C和Gamma必须严格为正。

有关使用e1071的更多详细信息,请查看CRAN文档:http://cran.r-project.org/web/packages/e1071/e1071.pdf

08-25 08:01