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