Recentemente, comecei a aprender a trabalhar sklearn
e acabei de encontrar esse resultado peculiar.
Usei o digits
conjunto de dados disponível sklearn
para 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 sklearn
para a classificação SVM: SVC
e 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: Enquanto o estimador SVC linear produziu o seguinte histograma:
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.
fonte
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).
Respostas:
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.
Primeiro vamos avaliar a variação -
Agora dê uma olhada nos seus gráficos:
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!
fonte
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')
fonte