【问题标题】:How to do multi class classification using Support Vector Machines (SVM)如何使用支持向量机 (SVM) 进行多类分类
【发布时间】:2010-12-29 19:39:30
【问题描述】:

在每本书和示例中,它们总是只显示二进制分类(两个类),新向量可以属于任何一个类。

这里的问题是我有 4 个类(c1、c2、c3、c4)。我有 4 个类的训练数据。

对于新向量,输出应该是这样的

C1 80%(获胜者)

c2 10%

c3 6%

c4 4%

如何做到这一点?我打算使用 libsvm (因为它最流行)。我对此了解不多。如果你们中的任何人以前使用过它,请告诉我我应该使用的具体命令。

【问题讨论】:

    标签: machine-learning svm libsvm


    【解决方案1】:

    您始终可以通过递归地选择类集的随机分区,将多类分类问题简化为二元问题。这不一定比一次学习更有效或效率更低,因为子学习问题需要更少的示例,因为分区问题更小。 (它可能最多需要一个恒定的订购时间,例如两倍的时间)。它还可能导致更准确的学习。

    我不一定推荐这个,但它是您问题的一个答案,是一种可以应用于任何二元学习算法的通用技术。

    【讨论】:

      【解决方案2】:

      常用的方法是一对一休息和一对一。 在第一种方法中,您得到 n 个分类器,结果类将获得最高分。 在第二种方法中,结果类是通过所有分类器的多数票获得的。

      AFAIR,libsvm 支持多类分类的两种策略。

      【讨论】:

      • 我认为 libsvm 只支持一对一。但它确实运作良好。
      【解决方案3】:

      LibSVM 使用 one-against-one 方法解决多类学习问题。来自FAQ

      问:libsvm 对多类 SVM 使用什么方法?你为什么不使用“1-against-the rest”的方法呢?

      这是一对一的。我们在做了以下比较后选择了它:C.-W。许和 C.-J。林。 A comparison of methods for multi-class support vector machines, IEEE Transactions on Neural Networks, 13(2002), 415-425。

      “1-against-the rest”是一种很好的方法,其性能与“1-against-1”相当。我们做后者只是因为它的训练时间更短。

      【讨论】:

        【解决方案4】:

        使用 SVM 多类库。在the SVM page by Thorsten Joachims 找到它

        【讨论】:

          【解决方案5】:

          它没有用于多类预测的特定开关(命令)。如果您的训练数据集包含两个以上的类,它会自动处理多类预测。

          【讨论】:

            【解决方案6】:

            与二进制预测相比没有什么特别的。关于基于 SVM 的 3 类预测,请参见以下示例。

            install.packages("e1071")
            library("e1071")
            data(iris)
            attach(iris)
            ## classification mode
            # default with factor response:
            model <- svm(Species ~ ., data = iris)
            # alternatively the traditional interface:
            x <- subset(iris, select = -Species)
            y <- Species
            model <- svm(x, y) 
            print(model)
            summary(model)
            # test with train data
            pred <- predict(model, x)
            # (same as:)
            pred <- fitted(model)
            # Check accuracy:
            table(pred, y)
            # compute decision values and probabilities:
            pred <- predict(model, x, decision.values = TRUE)
            attr(pred, "decision.values")[1:4,]
            # visualize (classes by color, SV by crosses):
            plot(cmdscale(dist(iris[,-5])),
                 col = as.integer(iris[,5]),
                 pch = c("o","+")[1:150 %in% model$index + 1])
            

            【讨论】:

              【解决方案7】:
              data=load('E:\dataset\scene_categories\all_dataset.mat');
                  meas = data.all_dataset;
                  species = data.dataset_label;
                  [g gn] = grp2idx(species);                      %# nominal class to numeric
              
              %# split training/testing sets
              [trainIdx testIdx] = crossvalind('HoldOut', species, 1/10);
              %# 1-vs-1 pairwise models
              num_labels = length(gn);
              clear gn;
              num_classifiers = num_labels*(num_labels-1)/2;
              pairwise = zeros(num_classifiers ,2);
              row_end = 0;
              for i=1:num_labels - 1
                  row_start = row_end + 1;
                  row_end = row_start + num_labels - i -1;
                  pairwise(row_start : row_end, 1) = i;
                  count = 0;
                  for j = i+1 : num_labels        
                      pairwise( row_start + count , 2) = j;
                      count = count + 1;
                  end    
              end
              clear row_start row_end count i j num_labels num_classifiers;
              svmModel = cell(size(pairwise,1),1);            %# store binary-classifers
              predTest = zeros(sum(testIdx),numel(svmModel)); %# store binary predictions
              
              %# classify using one-against-one approach, SVM with 3rd degree poly kernel
              for k=1:numel(svmModel)
                  %# get only training instances belonging to this pair
                  idx = trainIdx & any( bsxfun(@eq, g, pairwise(k,:)) , 2 );
              
                  %# train
                  svmModel{k} = svmtrain(meas(idx,:), g(idx), ...
                               'Autoscale',true, 'Showplot',false, 'Method','QP', ...
                               'BoxConstraint',2e-1, 'Kernel_Function','rbf', 'RBF_Sigma',1);
              
                  %# test
                  predTest(:,k) = svmclassify(svmModel{k}, meas(testIdx,:));
              end
              pred = mode(predTest,2);   %# voting: clasify as the class receiving most votes
              
              %# performance
              cmat = confusionmat(g(testIdx),pred);
              acc = 100*sum(diag(cmat))./sum(cmat(:));
              fprintf('SVM (1-against-1):\naccuracy = %.2f%%\n', acc);
              fprintf('Confusion Matrix:\n'), disp(cmat)
              

              【讨论】:

              • 您可以添加任何描述以帮助用户理解它吗?如果仅是代码,则您的答案价值较小:/
              • all_dataset.mat 有 15 个类,我使用基于构建 ons 的多分类 svm 与一个二进制 svm 分类器。
              【解决方案8】:

              使用 SVM 进行多类分类; 它不是(一对一)也不是(一对 REST)。

              改为学习一个二分类器,其中特征向量为 (x, y),其中 x 是数据,y 是与数据关联的正确标签。

              训练差距是正确类的值与最近的其他类的值之间的差异。

              在推理时选择具有最大值的“y” (x,y) 的值。

              y = arg_max(y') W.(x,y') [W为权重向量,(x,y)为特征向量]

              请访问链接: https://nlp.stanford.edu/IR-book/html/htmledition/multiclass-svms-1.html#:~:text=It%20is%20also%20a%20simple,the%20label%20of%20structural%20SVMs%20.

              【讨论】:

                猜你喜欢
                • 2013-08-31
                • 1970-01-01
                • 2018-05-28
                • 2011-07-01
                • 2011-11-09
                • 2017-01-30
                • 2015-06-03
                • 2014-04-08
                • 2014-11-21
                相关资源
                最近更新 更多