【问题标题】:One-class classification with SVM in R在 R 中使用 SVM 进行一类分类
【发布时间】:2015-02-07 03:25:45
【问题描述】:

我在 R 中使用包 e1071 来构建一类 SVM 模型。我不知道该怎么做,也没有在 Internet 上找到任何示例。

有人可以给出一个示例代码来表征,例如,“iris”数据集中的“setosa”类具有一类分类模型,然后测试同一数据集中的所有示例(以便检查哪些示例属于“setosa”类的表征,哪些例子不属于)?

【问题讨论】:

    标签: r classification svm libsvm


    【解决方案1】:

    我想这就是你想要的:

    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(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
    

    -预测(出于视觉原因,此处仅显示部分预测(其中 Species=='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 
    

    【讨论】:

    • 非常感谢您提供非常详细的代码,但我认为一类分类是另一回事。在一类分类中,您只需提供其中一类的示例来训练 SVM。模型只学习表征这个类(在测试阶段你只能知道一个例子是否属于这个类)。我知道我必须在函数 svm 中使用选项 tpye = one-classification,但我不知道该怎么做。
    • 是的。我现在想通了。我更新了答案。这就是你需要的:)。希望对您有所帮助,并感谢您之前的评论。
    • @dreamscollector,您不是要求使用模型对剩余的虹膜类型进行分类吗?也就是说,@LyzanderR,你的预测不应该是predict(model, subset(iris, select=-Species))吗?
    • @goangit 你是对的,最后一行代码有错误。正如你所说的
    • @dreamscollector,在这种情况下最好支持评论:-)
    【解决方案2】:

    精确的详细代码: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)

    【讨论】:

      猜你喜欢
      • 2017-10-23
      • 2018-03-24
      • 2016-12-01
      • 2018-02-08
      • 2018-06-29
      • 2014-05-12
      • 2012-04-02
      • 2016-08-13
      相关资源
      最近更新 更多