2014-12-09 2 views
7

Я использую пакет e1071 в R, чтобы построить одноклассную модель SVM. Я не знаю, как это сделать, и я не нашел ни одного примера в Интернете.Одноклассная классификация с SVM в R

Может ли кто-нибудь дать примерный код, характеризующий, например, класс «setosa» в наборе данных «iris» с одноклассной классификационной моделью, а затем проверить все примеры в одном наборе данных (чтобы проверить, что примеры относятся к характеристике класса «setosa», а какие нет)?

ответ

14

Я думаю, что это то, что вы хотите:

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 

Выход:

-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 (только некоторые из предсказаний показаны здесь (где Видовой = = 'setosa') по визуальной причине):

> 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

Спасибо вам большое за очень подробный код, но я думаю, что один класс классификации другая вещь. В классификации одного класса вы предоставляете только примеры одного из классов для обучения SVM. Модель учится характеризовать только этот класс (на этапе тестирования вы можете знать только, принадлежит или нет пример этому классу). Я знаю, что мне нужно использовать опцию tpye = one-классификацию в fuction svm, но я не знаю, как это сделать точно. – dreamscollector

+0

Да. Я понял это сейчас. Я обновил ответ. Это то, что вам нужно :). Надеюсь, что это поможет и спасибо за ваш комментарий раньше. – LyzandeR

+0

Теперь кажется правильным! Спасибо! – dreamscollector

4

Немного разработан код с точностью: поезд = 78.125 тест = 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)

Смежные вопросы