简体   繁体   中英

One-class classification with SVM in R

I'm using the package e1071 in R in order to build a one-class SVM model. I don't know how to do that and I neither find any example on the Internet.

Could someone give an example code to characterize, for example, the class "setosa" in the "iris" dataset with a one-class classification model and then test all the examples in the same dataset (in order to check what examples belong to the characterization of the "setosa" class and what examples not)?

I think this is what you want:

library(e1071)
data(iris)
df <- iris

df <- subset(df ,  Species=='setosa')  #choose only one of the classes

x <- subset(df, select = -Species) #make x variables
y <- df$Species #make y variable(dependent)
model <- svm(x, y,type='one-classification') #train an one-classification model 


print(model)
summary(model) #print summary

# test on the whole set
pred <- predict(model, subset(iris, select=-Species)) #create predictions

Output:

-Summary:

> summary(model)

Call:
svm.default(x = x, y = y, type = "one-classification")


Parameters:
   SVM-Type:  one-classification 
 SVM-Kernel:  radial 
      gamma:  0.25 
         nu:  0.5 

Number of Support Vectors:  27




Number of Classes: 1

-Predictions (only some of the predictions are shown here (where Species=='setosa') for visual reason):

> pred
    1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19    20    21    22 
 TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE 
   23    24    25    26    27    28    29    30    31    32    33    34    35    36    37    38    39    40    41    42    43    44 
FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE 
   45    46    47    48    49    50 
FALSE  TRUE  TRUE  TRUE  TRUE  TRUE 

A little bit elaborated code with accuracy: train=78.125 test= 91.53:

 library(e1071) library(caret) library(NLP) library(tm) data(iris) iris$SpeciesClass[iris$Species=="versicolor"] <- "TRUE" iris$SpeciesClass[iris$Species!="versicolor"] <- "FALSE" trainPositive<-subset(iris,SpeciesClass=="TRUE") testnegative<-subset(iris,SpeciesClass=="FALSE") inTrain<-createDataPartition(1:nrow(trainPositive),p=0.6,list=FALSE) trainpredictors<-trainPositive[inTrain,1:4] trainLabels<-trainPositive[inTrain,6] 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) # confusionMatrixTable<-table(Predicted=svm.pred,Reference=testLabels) # confusionMatrix(confusionMatrixTable,positive='TRUE') confTrain<-table(Predicted=svm.predtrain,Reference=trainLabels) confTest<-table(Predicted=svm.predtest,Reference=testLabels) confusionMatrix(confTest,positive='TRUE') print(confTrain) print(confTest) 

 library(e1071) library(caret) library(NLP) library(tm) data(iris) iris$SpeciesClass[iris$Species=="versicolor"] <- "TRUE" iris$SpeciesClass[iris$Species!="versicolor"] <- "FALSE" trainPositive<-subset(iris,SpeciesClass=="TRUE") testnegative<-subset(iris,SpeciesClass=="FALSE") inTrain<-createDataPartition(1:nrow(trainPositive),p=0.6,list=FALSE) trainpredictors<-trainPositive[inTrain,1:4] trainLabels<-trainPositive[inTrain,6] 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) # confusionMatrixTable<-table(Predicted=svm.pred,Reference=testLabels) # confusionMatrix(confusionMatrixTable,positive='TRUE') confTrain<-table(Predicted=svm.predtrain,Reference=trainLabels) confTest<-table(Predicted=svm.predtest,Reference=testLabels) confusionMatrix(confTest,positive='TRUE') print(confTrain) print(confTest) 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM