Entendo o básico do objetivo de um Support Vector Machines em termos de classificação de um conjunto de entradas em várias classes diferentes, mas o que não entendo são alguns detalhes minuciosos. Para começar, estou um pouco confuso com o uso de Slack Variables. Qual é o seu propósito?
Estou com um problema de classificação em que capturei leituras de pressão de sensores que coloquei na palmilha de um sapato. Um sujeito fica sentado, em pé e caminha por alguns minutos enquanto os dados de pressão são registrados. Quero treinar um classificador para poder determinar se uma pessoa está sentada, em pé ou andando e poder fazer isso para quaisquer dados de teste futuros. Que tipo de classificador eu preciso tentar? Qual é a melhor maneira de treinar um classificador a partir dos dados que capturei? Eu tenho 1000 entradas para sentar, ficar de pé e caminhar (3x1000 = 3000 total) e todas elas têm o seguinte formulário de vetor de recurso. (pressão do sensor1, pressão do sensor2, pressão do sensor3, pressão do sensor4)
fonte
Respostas:
Eu acho que você está tentando começar de um final ruim. O que se deve saber sobre o SVM para usar é que esse algoritmo está encontrando um hiperplano no hiperespaço de atributos que separa melhor duas classes, onde melhor significa com maior margem entre as classes (o conhecimento de como é feito é seu inimigo aqui, porque desfoca a imagem geral), conforme ilustrado por uma imagem famosa como esta:
Agora, existem alguns problemas restantes.
Primeiro de tudo, o que fazer com aqueles desagradáveis outliers deitados descaradamente em um centro de nuvens de pontos de uma classe diferente?
Para esse fim, permitimos que o otimizador deixe certas amostras com um rótulo incorreto, mas punir cada um desses exemplos. Para evitar a opimização multiobjetiva, as sanções para casos com rótulos incorretos são mescladas com o tamanho da margem com o uso do parâmetro adicional C, que controla o equilíbrio entre esses objetivos.
Em seguida, às vezes o problema não é linear e não é possível encontrar um hiperplano bom. Aqui, apresentamos o truque do kernel - apenas projetamos o espaço não-linear original para um espaço dimensional mais alto com alguma transformação não-linear, é claro definida por vários parâmetros adicionais, esperando que no espaço resultante o problema seja adequado para uma planificação simples. SVM:
Mais uma vez, com um pouco de matemática e podemos ver que todo esse processo de transformação pode ser ocultado com elegância, modificando a função objetivo, substituindo o produto escalar de objetos pela chamada função do kernel.
Finalmente, tudo isso funciona para 2 classes e você tem 3; O que fazer com isso? Aqui, criamos 3 classificadores de 2 classes (sentado - sem sentar, em pé - sem pé, andando - sem andar) e na classificação combinamos aqueles com votação.
Ok, então os problemas parecem resolvidos, mas temos que selecionar o kernel (aqui consultamos nossa intuição e escolher RBF) e ajustar pelo menos alguns parâmetros (kernel C +). E devemos ter uma função objetivo com segurança excessiva, por exemplo, aproximação de erros a partir da validação cruzada. Então deixamos o computador trabalhando nisso, vamos tomar um café, voltamos e vemos que existem alguns parâmetros ótimos. Ótimo! Agora, apenas começamos a validação cruzada aninhada para ter uma aproximação de erro e pronto.
É claro que esse breve fluxo de trabalho é simplificado demais para ser totalmente correto, mas mostra os motivos pelos quais eu acho que você deve tentar primeiro com a floresta aleatória , que é quase independente dos parâmetros, multiclasse nativa, fornece estimativa de erro imparcial e executa SVMs quase tão bons quanto adequados .
fonte