简介
支持向量机的思想就是使用整个训练示例作为分类的地标(即支持向量)。有关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语言实践]