Melhor maneira de executar SVM multiclasse

18

Eu sei que o SVM é um classificador binário. Eu gostaria de estendê-lo ao SVM de várias classes. Qual é a melhor e talvez a maneira mais fácil de realizá-la?

código: em MATLAB

   u=unique(TrainLabel); 
    N=length(u); 
    if(N>2)    
        itr=1;    
        classes=0;   
        while((classes~=1)&&(itr<=length(u)))   
            c1=(TrainLabel==u(itr));    
            newClass=double(c1); 
            tst = double((TestLabel == itr));
            model = svmtrain(newClass, TrainVec, '-c 1 -g 0.00154');  
            [predict_label, accuracy, dec_values] = svmpredict(tst, TestVec, model);    
            itr=itr+1;   
        end
        itr=itr-1;
    end

Como isso pode ser melhorado?

lakesh
fonte
O que a variável classesfaz no código? Parece ser inútil.
você chegou a alguma conclusão? Eu tenho esse problema com o meu trabalho. se você tiver alcançado um resultado adequado, compartilhe seu código de classificação múltipla aqui. obrigado.
me.rasouli 6/09/2015

Respostas:

16

Existem muitos métodos para a classificação de várias classes. Duas opções clássicas, que não são específicas do SVM, são:

  1. Classificação de um contra todos (OVA):
    suponha que você tenha as classes A, B, C e D. Em vez de fazer uma classificação de quatro vias, treine quatro classificadores binários: A vs. não-A, B vs. não-B , C vs. não-C e D vs. não-D. Em seguida, escolha a classe positiva que é "melhor" (por exemplo, mais afastada da margem nas quatro corridas). Se nenhuma das classificações for positiva (ou seja, todas elas não são X), escolha o "oposto" da classe que é pior (por exemplo, o mais próximo da margem).

  2. Tudo contra todos:
    Treine todos os pares possíveis de classificações. Classifique as classes por algum fator (por exemplo, número de vezes selecionado) e escolha o melhor.

O que funciona melhor foi controverso: Duan e Keerthi têm um estudo empírico que sugere um método específico de tudo contra todos, enquanto Rifkin e Klautau defendem um esquema de um contra todos. Existem até esquemas em que se aprende códigos de correção de erros que descrevem os rótulos das classes, em vez dos próprios rótulos.

Boa sorte!

Edit: O que você realmente deseja, especialmente para o OVA, é a probabilidade posterior de cada classe. Para alguns métodos, como Naive Bayes, isso é trivial. Os SVMs normalmente não fornecem probabilidades, mas existem maneiras de calculá-las. Veja o artigo de John Platt, 1999, "Saídas probabilísticas para máquinas de vetores de suporte ..."

Matt Krause
fonte
2
Para OVA - você pode escolher a classe que tem a maior probabilidade (induzida pelo dimensionamento de Platt)?
B_Miner
1
Sim, isso é basicamente o resultado do jornal Duan e Keerthi. Eles combinam as probabilidades de Platt com o truque de acoplamento em pares de Hastie e obtêm bons resultados. Eu provavelmente deveria editar o texto para incluir isso. Boa captura B_Miner!
Matt Krause
no SVM, você precisa votar ou somar soma?
lakesh
@lakesh, One-vs-all ou All-vs-all são como esquemas de votação. Se você estiver usando um conjunto de classificadores binários, precisará fazer algo para transformá-los em um classificador de várias classes. Como alternativa, você pode usar o SVM modificado descrito por carlosdc abaixo ...
Matt Krause
o que é isso alguma coisa?
precisa saber é