2014-12-09 9 views
7

Ich verwende das Paket e1071 in R, um ein Einklassen-SVM-Modell zu erstellen. Ich weiß nicht, wie ich das machen soll und finde auch im Internet kein Beispiel.Einklassige Klassifizierung mit SVM in R

Kann jemand einen Beispielcode angeben, um zum Beispiel die Klasse "setosa" im Datensatz "iris" mit einem Einklassen-Klassifikationsmodell zu charakterisieren und dann alle Beispiele im selben Datensatz zu testen (um zu prüfen, was) Beispiele gehören zur Charakterisierung der Klasse "setosa" und welche Beispiele nicht?

Antwort

14

Ich denke, das ist, was Sie wollen:

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 

Ausgang:

-Zusammenfassung:

> 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 (nur einige der Prognosen werden hier gezeigt (wo Species = = 'setosa') aus optischen Gründen):

> 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

Vielen Dank für Ihre sehr detaillierten Code, aber ich denke, dass eine Klasse Klassifizierung eine andere Sache. In der Ein-Klassen-Klassifikation liefern Sie nur die Beispiele einer der Klassen zum Trainieren der SVM. Das Modell lernt, nur diese Klasse zu charakterisieren (in der Testphase kann man nur wissen, ob ein Beispiel zu dieser Klasse gehört oder nicht). Ich weiß, dass ich die Option tpye = one-classification in der Funktion svm verwenden muss, aber ich weiß nicht, wie ich das genau machen soll. – dreamscollector

+0

Ja. Ich habe es jetzt herausgefunden. Ich habe die Antwort aktualisiert. Das brauchst du :). Hoffe es hilft und danke für deinen Kommentar vorher. – LyzandeR

+0

Es scheint jetzt zu stimmen! Vielen Dank! – dreamscollector

4

Ein wenig ausgearbeitet Code mit Genauigkeit: Zug = 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)

Verwandte Themen