Estou tentando ajustar um SVM aos meus dados. Meu conjunto de dados contém 3 classes e estou executando uma validação cruzada de 10 vezes (no LibSVM):
./svm-train -g 0.5 -c 10 -e 0.1 -v 10 training_data
A ajuda afirma assim:
-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
Para mim, fornecer valores mais altos de custo (C) me proporciona maior precisão. O que C no SVM realmente significa? Por que e quando devo usar valores mais altos / mais baixos (ou o LibSVM com o valor padrão) de C?
cross-validation
svm
libsvm
parameterization
optimization
Mestre Abid Hasan
fonte
fonte
Respostas:
Estou tentando dar uma resposta simples e fácil de entender. Uma resposta completa provavelmente precisará cobrir tudo, desde o objetivo por trás dos SVMs até os detalhes mais precisos dos vetores de perda e suporte. Se você quiser aprofundar esses detalhes, pode ser necessário examinar, por exemplo, os capítulos sobre SVMs nos livros de aprendizado de máquina.
SVMs são grandes classificadores de margem . Isso significa que a separação (vamos assumir linear) entre amostras da classe preto e branco não é apenas uma possível, mas a melhor separação possível , definida pela obtenção da maior margem possível entre amostras das duas classes. Este seriaH3 na imagem de exemplo:
Se você pensar sobre isso por um momento que você vai concluir que a separação é derivado unicamente a partir dessas amostras que estão mais perto de "a outra classe", daí as pessoas próximas à margem (para ser exato: aqueles na margem). Na imagem de exemplo, essas são as amostras marcadas com as linhas cinza ortogonais aoH3 . Esse comportamento causa um problema: com a quantidade de amostras usada para derivar a separação sendo amplamente um subconjunto, o ruído que afeta essas amostras provavelmente fará com que a separação seja abaixo do ideal para a maioria dos dados. Isso é o que todos conhecemos como sobreajuste: a separação seria ideal do ponto de vista da grande margem do treinamento usado, mas seria generalizada de maneira inadequada e, portanto, seria insatisfatória para outros / ainda não vistos dados.
O que falamos até agora é a "classificação das margens rígidas": não permitimos que nenhuma amostra esteja dentro da margem, pois é assim que a margem é definida até agora. Quando agora relaxamos essa propriedade difícil, acabamos fazendo "classificação de margem macia". A ideia por trás da margem permanece a mesma - mas agora podemos permitir que determinadas amostras estejam dentro da margem . O principal benefício é que, ao fazer isso, o ajuste geral do modelo aos dados pode muito bem ser melhor do que com a classificação de margem rígida ( reduza a variação ao custo de algum viés ).
Portanto, por um lado, ainda temos que resolver nosso problema simples de otimização (a melhor forma de ajustar o modelo = linha aos nossos dados). Por outro lado, não queremos ter todas / muitas amostras na margem - de alguma forma, queremos ajustar quantas amostras deixamos dentro da margem, para que a margem não se adapte completamente nem perca completamente sua propriedade de margem grande.
E é aqui que oC parâmetro entra no palco. A ideia principal é simples: modificar o problema de optimização para optimizar tanto o ajuste da linha de dados e penalizar a quantidade de amostras no interior da margem, ao mesmo tempo, ondeC define o peso de quantas amostras dentro da margem contribuem para o erro geral. Consequentemente, comC você pode ajustar a rigidez ou a suavidade da classificação de margem grande . Com um baixoC , amostras dentro das margens são penalizadas menos do que com uma C . Com umC de 0, amostras dentro das margens não são mais penalizadas - que é o extremo possível de desativar a classificação de margem grande. Com um infinitoC você tem o outro extremo possível de margens rígidas.
Aqui está um pequeno exemplo visualizando o efeito causado pela alteraçãoC usando o conhecido conjunto de dados da íris (no
R
e usando ocaret
pacote, mas o mesmo se aplicalibsvm
também, é claro). É assim que os dados originais se parecem (é um problema de classificação binária):É assim que mudarC pode influenciar o desempenho do seu modelo:
E esta é a diferença na separação entre dois diferentes escolhidosC valores (observe que as linhas de separação têm inclinação diferente!):
Portanto, praticamente, o que você provavelmente deseja fazer na configuração do ML é ajustar adequadamenteC , por exemplo, usando uma grade de ajuste. Você pode considerar, por exemplo, esta publicação para obter mais detalhes. É do pessoal da LibSVM, e eles fornecem muitas informações úteis, desde explicar como os SVMs funcionam com bons exemplos até codificar trechos de como, por exemplo, usar grades de parâmetros com o LibSVM:
Hsu et al. (2003). "Um guia prático para apoiar a classificação vetorial." Departamento de Ciência da Computação e Engenharia da Informação, Universidade Nacional de Taiwan.
BTW: há uma pequena lista de coisas que as pessoas disseram sobre SVMsC parâmetro, que também acho útil para entendê-lo: http://www.svms.org/parameters/
fonte