R语言之支持向量机

简介

支持向量机的思想就是使用整个训练示例作为分类的地标(即支持向量)。有关SVM的详细介绍和数学推导看这里

R语言使用

这里使用Spambase数据,关于垃圾邮件的识别。数据在这里

首先读取并划分数据集,然后用glm先来建模:

spamD <- read.table('D:/zmPDSwR-master/Spambase/spamD.tsv', header = T, sep = '\t')
spamTrain <- subset(spamD, spamD$rgroup >= 10)
spamTest <- subset(spamD, spamD$rgroup < 10)
spamVars <- setdiff(colnames(spamD), list('rgroup', 'spam'))
spamFormula <- as.formula(paste('spam=="spam"', paste(spamVars, collapse = ' + '), sep = ' ~ '))
spamModel <- glm(spamFormula, family = binomial(link = 'logit'), data = spamTrain)
spamTest$pred <- predict(spamModel, newdata = spamTest, type = 'response')
print(with(spamTest, table(y = spam, glPred = pred >= 0.5)))
        glPred
y          FALSE TRUE
non-spam   264   14
spam        22  158

然后在SVM上建模来看看效果:

library(kernlab)
spamFormulaV <- as.formula(paste('spam', paste(spamVars, collapse=' + '), sep = ' ~ '))
svmM <- ksvm(spamFormulaV, data = spamTrain,
            kernel = 'rbfdot',
            C = 10,     # 将“软边缘惩罚”设置为高
            prob.model = T, cross = 5,
            class.weights = c('spam' = 1, 'non-spam'=10))       # 显式地控制假阳性和假阴性错误之间的权衡
spamTest$svmPred <- predict(svmM, newdata = spamTest, type = 'response')
print(with(spamTest, table(y = spam, svmPred = svmPred)))
        svmPred
y          non-spam spam
non-spam      269    9
spam           29  151

输出SVM的结果概要信息:

> print(svmM)
Support Vector Machine object of class "ksvm" 

SV type: C-svc  (classification) 
parameter : cost C = 10 

Gaussian Radial Basis kernel function. 
Hyperparameter : sigma =  0.0297371046691448 

Number of Support Vectors : 1119 

Objective Function Value : -4667.621 
Training error : 0.028965 
Cross validation error : 0.077724 
Probability model included. 

转移决策点来执行同类比较:

> sameCut <- sort(spamTest$pred)[length(spamTest$pred)-162]
> print(with(spamTest, table(y = spam, glPred = pred > sameCut)))
        glPred
y          FALSE TRUE
non-spam   267   11
spam        29  151

新的转移glm与SVM几乎没有区别。在未知的变量组合起重要作用的情况下,SVM表现的更好,同时示例相似性是示例属于同一类的有利证据的情况下,其表现也很好。

总结

  • SVM是一个基于核的分类方法,方法中的核用训练示例的子集来表示。
  • 支持向量机设法将问题提升到一个这样的空间,在该空间中数据是线性可分的。
  • 在事先不知道有用的交互变量或者输入变量的其他组合的情况下,支持向量机是有用的。在相似性属于相同类别的强有力证据时,SVM也很有用。

参考文献

[1][数据科学 理论、方法与R语言实践]