2014-12-09 31 views
7

Sto utilizzando il pacchetto e1071 in R per creare un modello SVM di classe. Non so come farlo e non trovo alcun esempio su Internet.Classificazione a una classe con SVM in R

Qualcuno potrebbe fornire un codice di esempio per caratterizzare, ad esempio, la classe "setosa" nel set di dati "iris" con un modello di classificazione a una classe e quindi testare tutti gli esempi nello stesso set di dati (per verificare quali gli esempi appartengono alla caratterizzazione della classe "setosa" e quali esempi no)?

risposta

14

Credo che questo sia ciò che si vuole:

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 

uscita:

-Sintesi:

> 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 (solo alcune delle previsioni sono mostrati qui (dove Specie = = 'setosa') per ragioni visive):

> 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 
+0

ringrazio molto per il vostro codice molto dettagliata, ma penso che la classificazione di un classe è una cosa diversa. Nella classificazione di una classe fornisci solo gli esempi di una delle classi per addestrare l'SVM. Il modello impara a caratterizzare solo questa classe (nella fase di test puoi solo sapere se un esempio appartiene o meno a questa classe). So che devo usare l'opzione tpye = one-classification nella svm di fuction, ma non so come farlo esattamente. – dreamscollector

+0

Sì. L'ho capito ora. Ho aggiornato la risposta. Questo è quello di cui hai bisogno :). Spero che aiuti e grazie per il tuo commento prima. – LyzandeR

+0

Sembra essere corretto ora! Grazie! – dreamscollector

4

Un po 'elaborato codice con accuratezza: treno = 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)