Qual é a influência de C em SVMs com kernel linear?

134

Atualmente, estou usando um SVM com um kernel linear para classificar meus dados. Não há erro no conjunto de treinamento. Tentei vários valores para o parâmetro ( 10 - 5 , , 10 2 ). Isso não alterou o erro no conjunto de teste.C10-5,...,102

Agora eu me pergunto: isso é um erro causado pelas ligações do ruby porque libsvmestou usando ( rb-libsvm ) ou isso é teoricamente explicável ?

O parâmetro sempre alterar o desempenho do classificador?C

alfa
fonte
Apenas um comentário, não uma resposta: qualquer programa que minimize uma soma de dois termos, como deve (IMHO) dizer-lhe que os dois termos são, no final, para que você possa ver como eles equilibrar. (Para obter ajuda para computar os dois termos SVM-se, tente fazer uma pergunta separada Você já olhou para alguns dos pontos mais mal classificados Você poderia postar um problema semelhante ao seu.??)|W|2+CξEu,
denis

Respostas:

136

O parâmetro C informa à otimização do SVM quanto você deseja evitar classificar incorretamente cada exemplo de treinamento. Para valores grandes de C, a otimização escolherá um hiperplano de margem menor se esse hiperplano fizer um trabalho melhor para obter todos os pontos de treinamento classificados corretamente. Por outro lado, um valor muito pequeno de C fará com que o otimizador procure um hiperplano de separação de margem maior, mesmo que esse hiperplano classifique incorretamente mais pontos. Para valores muito pequenos de C, você deve obter exemplos mal classificados, geralmente mesmo que seus dados de treinamento sejam linearmente separáveis.

Marc Shivers
fonte
1
OK, entendo que C determina a influência da classificação incorreta na função objetivo. A função objetivo é a soma de um termo de regularização e a taxa de classificação incorreta (consulte en.wikipedia.org/wiki/Support_vector_machine#Soft_margin ). Quando troco C, isso não afeta o mínimo da minha função objetivo. Isso poderia significar que o termo de regularização é sempre muito pequeno?
Alfa
3
Sugiro tentar uma faixa mais ampla de valores C, talvez 10 ^ [- 5, ..., 5] ou mais, se a otimização for rápida no seu conjunto de dados, para ver se você obtém algo que parece mais razoável. Tanto o erro de treinamento quanto o valor do custo mínimo devem mudar à medida que C é variado. Além disso, a escala de seus dados é extrema? Em geral, um parâmetro C ideal deve ser maior quando você reduz seus dados e vice-versa; portanto, se você tiver valores muito pequenos para os recursos, inclua valores muito grandes para os possíveis valores C. Se nenhuma das opções acima ajuda, eu acho que o problema está nas ligações de rubi
Marc Shivers
3
alterar a precisão balanceada de 0,5 (apenas adivinhando) para 0,86 não soa como uma influência marginal para mim. Seria uma boa idéia investigar uma grade mais fina de valores para C, como sugere Marc, mas os resultados que você forneceu parecem ser um comportamento bastante normal. Pode-se esperar que o erro volte novamente, pois C tende ao infinito devido ao ajuste excessivo, mas isso não parece ser um grande problema nesse caso. Note que se você está realmente interessado em erro equilibrada e seu conjunto de treinamento não tem uma divisão 50:50, então você pode ser capaz de obter melhores resultados ...
Dikran Marsupial
2
... usando diferentes valores de C para padrões pertencentes às classes positiva e negativa (que é assintoticamente equivalente a reamostrar os dados para alterar a proporção de padrões pertencentes a cada classe).
Dikran Marsupial
2
Eu acho que é possível que uma vez que você chegue a C = 10 ^ 0, o SVM já esteja classificando todos os dados de treinamento corretamente e nenhum dos vetores de suporte esteja vinculado (o alfa é igual a C), nesse caso, aumentar C nenhum efeito sobre a solução.
Dikran Marsupial
152

Em um SVM, você está procurando por duas coisas: um hiperplano com a maior margem mínima e um hiperplano que separa corretamente o maior número possível de instâncias. O problema é que nem sempre você conseguirá as duas coisas. O parâmetro c determina quão grande é o seu desejo para o último. Eu desenhei um pequeno exemplo abaixo para ilustrar isso. À esquerda, você tem um c baixo, o que fornece uma margem mínima bastante grande (roxa). No entanto, isso exige que negligenciemos o círculo azul que não conseguimos classificar correto. À direita, você tem um alto c. Agora você não negligenciará o outlier e, portanto, terá uma margem muito menor.

insira a descrição da imagem aqui

Então, qual desses classificadores é o melhor? Isso depende da aparência dos dados futuros que você irá prever e, na maioria das vezes, você não sabe disso, é claro. Se os dados futuros forem assim:

c grande é melhor então, o classificador aprendido usando um valor c grande é o melhor.

Por outro lado, se os dados futuros forem assim:

c baixo é melhor então, o classificador aprendido usando um valor c baixo é o melhor.

Dependendo do seu conjunto de dados, alterar c pode ou não produzir um hiperplano diferente. Se isso acontecer produzir um hiperplano diferente, isso não implica que o classificador irá saída classes diferentes para os dados específico que você tê-lo usado para classificar. O Weka é uma boa ferramenta para visualizar dados e brincar com diferentes configurações para um SVM. Isso pode ajudá-lo a ter uma idéia melhor da aparência de seus dados e por que alterar o valor c não altera o erro de classificação. Em geral, ter poucas instâncias de treinamento e muitos atributos facilita a separação linear dos dados. Além disso, o fato de você estar avaliando seus dados de treinamento e não os novos dados invisíveis facilita a separação.

De que tipo de dados você está tentando aprender um modelo? Quantos dados? Podemos ver isso?

Kent Munthe Caspersen
fonte
4
Não toquei nos dados por mais de três anos. É muito dimensional e barulhento e não tenho permissão para publicá-lo. A pergunta já foi respondida, mas acho que sua visualização é muito boa e intuitiva.
alfa alfa
impressionante. você tem essas explicações para o valor gama também?
MonsterMMORPG
2
O parâmetro gama é usado para a função do kernel gaussiano. As funções do kernel podem ser vistas como uma maneira eficiente de transformar seus recursos originais em outro espaço, onde um hiperplano de separação no novo espaço de recursos não precisa ser linear no espaço de recursos original. Por exemplo, a posição bidimensional de um ponto de dados no espaço de recurso original pode ser usada para calcular um novo recurso que representa a distância de algum marcador em um mapa. Com este novo recurso, um classificador não-linear (no espaço original) poderá ser feito se a decisão de fronteira forma um círculo em volta do marcador
Kent Munthe Caspersen
@KentMuntheCaspersen não é a sua explicação de C incorreta? É o oposto do que diz no livro "Introdução à aprendizagem estatística".
Diugalde
2
@diugalde você pode citar no livro o que exatamente difere da minha explicação? Eu sempre penso em c como o custo da classificação incorreta (fácil de lembrar por c na classificação). Dessa forma, c mais alto significa alto custo de classificação incorreta, levando o algoritmo a tentar separar perfeitamente todos os pontos de dados. Com valores discrepantes, isso nem sempre é possível ou nem sempre leva a um bom resultado geral, que é uma boa razão para diminuir / introduzir c.
Kent Munthe Caspersen
26

C é essencialmente um parâmetro de regularização, que controla o compromisso entre obter um baixo erro nos dados de treinamento e minimizar a norma dos pesos. É análogo ao parâmetro cume na regressão cume (na verdade, na prática, há pouca diferença no desempenho ou na teoria entre SVMs lineares e regressão cume, então geralmente uso o último - ou regressão cume do núcleo, se houver mais atributos do que observações).

O ajuste correto de C é uma etapa vital das melhores práticas no uso de SVMs, pois a minimização de risco estrutural (o princípio fundamental por trás da abordagem básica) é implementada através do ajuste de C. O parâmetro C impõe um limite superior à norma do pesos, o que significa que existe um conjunto aninhado de classes de hipóteses indexadas por C. À medida que aumentamos C, aumentamos a complexidade da classe de hipóteses (se aumentarmos ligeiramente C, ainda podemos formar todos os modelos lineares que poderíamos antes e também alguns que não podíamos antes de aumentarmos o limite superior da norma permitida dos pesos). Além de implementar o SRM por meio da classificação de margem máxima, ele também é implementado limitando a complexidade da classe de hipótese através do controle C.

Infelizmente, a teoria para determinar como definir C não está muito bem desenvolvida no momento; portanto, a maioria das pessoas tende a usar a validação cruzada (se fizer alguma coisa).

Dikran Marsupial
fonte
OK, acho que entendo o significado de C agora. :)
alfa
2
Mas se C é um parâmetro de regularização, por que um alto C aumenta a super adaptação, quando geralmente é feita uma regularização para mitigar a super adaptação, ou seja, criando um modelo mais geral?
user1603472
2
C é um parâmetro de regularização, mas é essencialmente anexado ao termo de desajuste dos dados (a soma das variáveis ​​de folga) em vez do termo de regularização (o bit de margem); portanto, um valor maior de C significa menos regularização, em vez de mais. Como alternativa, você pode visualizar a representação usual do parâmetro de rgularização como 1 / C.
Dikran marsupiais
8

C é um parâmetro de regularização que controla a troca entre obter um baixo erro de treinamento e um baixo erro de teste, que é a capacidade de generalizar seu classificador para dados não vistos.

Considere a função objetivo de um SVM linear: min | w | ^ 2 + C∑ξ. Se seu C for muito grande, o algoritmo de otimização tentará reduzir | w | o máximo possível, levando a um hiperplano que tenta classificar cada exemplo de treinamento corretamente. Fazer isso levará à perda nas propriedades de generalização do classificador. Por outro lado, se seu C for muito pequeno, você concederá à sua função objetivo certa liberdade para aumentar | w | muito, o que levará a um grande erro de treinamento.

As figuras abaixo podem ajudá-lo a visualizar isso. Classificador SVM linear com C = 10000000Classificador SVM linear com C = 0,001

Deerishi
fonte
Eu realmente não entendo suas tramas. Você pode explicar isso?
Alfa
1
@alfa: Minha intenção de mostrar os gráficos era: 1) Se C for muito grande (gráfico 1), seu classificador se ajustará demais, ou seja, tentará classificar cada ponto de dados de treinamento com precisão. O gráfico 1 mostra quase todos os pontos de treinamento sendo classificados corretamente. 2) Por outro lado, se C for muito menor (gráfico 2), o seu classificador ficará em forma. O gráfico 2 mostra o classificador em falta. Não separa os pontos em suas respectivas classes. Espero que isto ajude.
deerishi
Isso significa que seus eixos x e y mostram dois recursos diferentes. Os rótulos "comprimento do conjunto de dados" e "Soma das médias" são um pouco confusos?
alfa
Seria interessante ver como a escolha certa para C ajuda nos dois casos.
Alfa
2
Eu acho que não é óbvio ver que C = 10000000 é uma má escolha e acho que o conjunto de dados não é o correto para demonstrar isso. Talvez um conjunto de dados com apenas alguns discrepantes no lado errado do hiperplano de separação seja melhor?
alfa
4

As respostas acima são excelentes. Depois de ler atentamente suas perguntas, descobri que há dois fatos importantes que podemos ignorar.

  1. Você está usando o kernel linear
  2. Seus dados de treinamento são separáveis ​​linearmente, pois "Não há erro no conjunto de treinamento".

Dado os 2 fatos, se os valores de C mudarem dentro de um intervalo razoável, o hiperplano ideal mudará aleatoriamente apenas uma pequena quantidade dentro da margem (a lacuna formada pelos vetores de suporte).

Intuitivamente, suponha que a margem nos dados de treinamento seja pequena e / ou não haja pontos de dados de teste dentro da margem também, a mudança do hiperplano ideal dentro da margem não afetará o erro de classificação do conjunto de testes.

No entanto, se você definir C = 0, o SVM ignorará os erros e apenas tentará minimizar a soma dos quadrados dos pesos (w), talvez você possa obter resultados diferentes no conjunto de testes.

luz
fonte
2

O parâmetro C é usado para controlar os valores discrepantes - C baixo implica que estamos permitindo mais discrepantes, C alto implica que estamos permitindo menos discrepantes.

H. Irshad
fonte
1

Alto C (custo) significa que o custo da classificação incorreta é aumentado. Isso significa que um kernel flexível se tornará mais irregular para evitar observações errôneas no conjunto de treinamento.

Se o kernel for muito irregular, o modelo não generalizará bem ao prever novos dados.

Se o kernel for reto, o modelo não generalizará bem ao prever novos dados.

Brad
fonte