Você pode explicar a diferença entre SVC e LinearSVC no scikit-learn?

19

Recentemente, comecei a aprender a trabalhar sklearne acabei de encontrar esse resultado peculiar.

Usei o digitsconjunto de dados disponível sklearnpara experimentar diferentes modelos e métodos de estimativa.

Quando testei um modelo de máquina de vetor de suporte nos dados, descobri que existem duas classes diferentes sklearnpara a classificação SVM: SVCe LinearSVC, onde o primeiro usa a abordagem um contra um eo outro usa a abordagem um contra o resto .

Eu não sabia que efeito isso poderia ter nos resultados, então tentei os dois. Fiz uma estimativa no estilo Monte Carlo, onde executei os dois modelos 500 vezes, dividindo a amostra aleatoriamente em 60% de treinamento e 40% de teste e calculando o erro da previsão no conjunto de testes.

O estimador SVC regular produziu o seguinte histograma de erros: Taxa de erro SVC Enquanto o estimador SVC linear produziu o seguinte histograma: Taxa de erro SVC linear

O que poderia explicar uma diferença tão gritante? Por que o modelo linear tem uma precisão tão maior na maioria das vezes?

E, relacionado, o que poderia estar causando a forte polarização nos resultados? Precisão próxima de 1 ou precisão próxima de 0, nada no meio.

Para comparação, uma classificação em árvore de decisão produziu uma taxa de erro muito mais normalmente distribuída com uma precisão de cerca de 0,85.

metjush
fonte
Presumo que a documentação do scikit-learn não destaque a diferença? Você checou?
Rohit
1. Qual kernel você usou no SVC? configurações padrão = "rbf"? 2. Um contra-um e um-contra-todos são diferentes abordagens
kpb
a documentação é meio escassa / vaga sobre o assunto. Ele menciona a diferença entre um contra-um e um-contra-restante, e que a linear SVS éSimilar to SVC with parameter kernel=’linear’, but implemented in terms of liblinear rather than libsvm, so it has more flexibility in the choice of penalties and loss functions and should scale better (to large numbers of samples).
metjush
para SVC comum, usei o kernel padrão. Eu sei que 1v1 e 1vR são abordagens diferentes, mas acho que é isso que quero saber - por que eles produzem resultados tão diferentes? É a escolha do kernel ou a abordagem diferente para a classificação de múltiplas categorias?
metjush

Respostas:

23

Um SVM regular com valores padrão usa uma função de base radial como o kernel SVM. Este é basicamente um núcleo gaussiano, também conhecido como curva de sino. Significando que a terra de ninguém entre classes diferentes é criada com uma função gaussiana. O SVM linear usa um kernel linear para a função base, então você pode pensar nisso como uma função em forma de ^. É muito menos sintonizável e é basicamente apenas uma interpolação linear.

As pessoas estão meio que martelando essa pergunta porque você não forneceu muita informação, mas analisando profundamente o que você postou ... isso afeta alguns aspectos fundamentais de realmente entender os detalhes de viés e variação e a diferença entre linear e não linear funções básicas no SVM.

Confira esta imagem descrevendo as quatro regiões de viés alto e baixo e alta e baixa variação. Obviamente, o melhor lugar para se estar é baixa variação e baixo viés.

imagem de variação de dardos

Primeiro vamos avaliar a variação -

Agora dê uma olhada nos seus gráficos: insira a descrição da imagem aqui

A função de base não linear possui uma variação maior. Veja como é mais barulhento que o kernel linear! O kernel linear tem menor variação. Veja como é menos barulhento!

Agora vamos avaliar o viés -

Qual kernel é mais preciso? Podemos adicionar os erros que você forneceu. O kernel não linear possui um erro total de ~ 550 + 325 = ~ 875. O kernel linear tem um erro de ~ 690 + ~ 50 = ~ 740. Portanto, o kernel linear parece ter um desempenho melhor no geral, mas eles são bem próximos no geral. Isto é onde as coisas ficam complicadas!

Juntando tudo

Veja como o kernel linear fez um trabalho ruim nos 1s e um ótimo trabalho nos 0s. Isso é bastante desequilibrado. Onde, como o kernel não linear, é mais equilibrado. Parece que o ponto ideal pode ser criar um modelo equilibrado que não tenha uma variação tão alta. Como controlamos a alta variação? Bingo - regularização. Podemos adicionar regularização ao modelo não linear e provavelmente veremos resultados muito melhores. Esse é o parâmetro C no SVMs do scikit learn, que você deseja aumentar a partir do padrão. Também poderíamos jogar com o parâmetro gama. Gamma controla a largura do gaussiano. Talvez tente aumentar um pouco para obter resultados menos ruidosos, por exemplo, uma terra maior de ninguém entre as classes.

Espero que isto ajude!

AN6U5
fonte
O parâmetro C precisa ser diminuído do padrão não aumentado.
Hamdi
4

Se você usou o kernel padrão no SVC (), o kernel da Função Base Radial (rbf), provavelmente aprendeu um limite de decisão mais não linear. No caso do conjunto de dados de dígitos , isso superará amplamente o limite de decisão linear nessa tarefa (consulte 3.1 'Classificador linear de linha de base')

jamesmf
fonte