首页 文章

如何利用R的遗传算法优化支持向量机的参数

提问于
浏览
3

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

例如,存在诸如成本和伽玛之类的参数 .

我正在尝试使用“GA”包和R的“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函数时,会返回以下错误 .

“找不到支持向量 . 您可能想要更改参数”

我无法理解为什么代码不好 .

1 回答

  • 4

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

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

    Example

    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^x for x in {-10,-8,-6,-6,-4,-2,0,2,4} .

    GA是一种元优化算法,参数空间很大,参数和优化函数之间没有简单的关联 . 它需要调整更多参数然后SVM(代数,群体大小,变异概率,交叉概率,变异算子,交叉算子......)所以这里完全没用 .

    当然 - 正如之前在评论中所说的那样 - C和Gamma have to 是严格正面的 .

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

相关问题