支持向量机中的战斗机 -- One class SVM

浏览: 5589

SVM

支持向量机(support vector machine),简称SVM,是一种基于监督的二类分类模型。 通俗的说,SVM是通过选取高维空间上的一个超平面(plane)来进行数据分类,这个超平面即为分类平面,构成这个超平面的向量,即为支撑向量。SVM先已广泛应用于统计分析,回归分析和机器学习中。

One class SVM

与传统SVM不同的是,one class SVM是一种非监督的算法。它是指在训练集中只有一类positive(或者negative)的数据,而没有另外的一类。而这时,需要学习(learn)的就是边界(boundary),而不是最大间隔(maximum margin)。

如下图中所示,

白点:训练集

红线:边界

绿点:正常测试数据

红点:异常的测试数据

1.png

核函数(Kernel

e1071库中的One class SVM采用的是径向基函数(RBF)中的高斯核方程。

高斯核的表达式为       

也有人把表达式写成 其中是方差

应用实例 -- 新奇检测Novelty detection

R 代码实例

library(e1071)

 

data(iris)

 

iris$SpeciesClass[iris$Species=="versicolor"] <- "TRUE"
iris$SpeciesClass[iris$Species!="versicolor"] <- "FALSE"
trainPositive<-subset(iris,SpeciesClass=="TRUE")
testNegative<-subset(iris,SpeciesClass=="FALSE")
 
# 60%  “TRUE” 数据为训练集
inTrain<-createDataPartition(1:nrow(trainPositive),p=0.6,list=FALSE)
 
trainPredictors<-trainPositive[inTrain,1:4]
trainLabels<-trainPositive[inTrain,6]
 
# 40%”TRUE”数据和所有”FLASE”数据为测试集
testPositive<-trainPositive[-inTrain,]
testPosNeg<-rbind(testPositive,testNegative)
 
testPredictors<-testPosNeg[,1:4]
testLabels<-testPosNeg[,6]
 
# 建模
svm.model<-svm(trainPredictors,y=NULL,
               type='one-classification',
               nu=0.10,
               scale=TRUE,
               kernel="radial")

 

# 预测训练集和侧视集

svm.predtrain<-predict(svm.model,trainPredictors)
svm.predtest<-predict(svm.model,testPredictors)
 
confTrain<-table(Predicted=svm.predtrain,Reference=trainLabels)
confTest<-table(Predicted=svm.predtest,Reference=testLabels)
 

运行结果:

测试集结果矩阵

confusionMatrix(confTest,positive='TRUE')
 confusionMatrix(confTest,positive='TRUE')
Confusion Matrix and Statistics
 
         Reference
Predicted FALSE TRUE
    FALSE    98    7
    TRUE      2   11
                                          
               Accuracy : 0.9237          
                 95% CI : (0.8601, 0.9645)
    No Information Rate : 0.8475          
    P-Value [Acc > NIR] : 0.01008         
                                          
                  Kappa : 0.6671          
 Mcnemar's Test P-Value : 0.18242         
                                          
            Sensitivity : 0.61111         
            Specificity : 0.98000         
         Pos Pred Value : 0.84615         
         Neg Pred Value : 0.93333         
             Prevalence : 0.15254         
         Detection Rate : 0.09322         
   Detection Prevalence : 0.11017         
      Balanced Accuracy : 0.79556         
       'Positive' Class : TRUE            
我们可以从运行结果中看到,预测的准确率为92.37% 在混淆矩阵中,一共有92+7)个数据被错分。 

应用模型到训练数据集中

print(confTrain)
> print(confTrain)
         Reference
Predicted TRUE
    FALSE    6
TRUE    26


小结及延伸

SVM作为监督算法一直在工业界倍受欢迎,有着广泛的应用。本文中提及的非监督one class SVM算法也同样受到重用着,例如,Oracle的自家数据挖掘中,特指Oracle 11g/12c中的ODMOracle Data Mining),就是使用one class SVM来进行异常检测, Oracle给它起了个名字,叫anomaly detection




推荐 3
本文由 张小胖 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

3 个评论

支持
代码部分 可以一起弄 代码格式的。看起来更好看。
多一些描述就更好了

要回复文章请先登录注册