![](https://crypto4nerd.com/wp-content/uploads/2023/07/1G2Zsn9YgOQnLJFgjWayzDQ.png)
As Support Vector Machines (SVMs) são algoritmos de machine learning amplamente utilizados para tarefas de classificação e regressão. Neste post, vamos focar na classificação. As SVMs são particularmente eficazes em problemas de classificação binária, onde o objetivo é dividir os dados em duas classes distintas. Para ilustrar, vamos imaginar que temos um conjunto de dados que contém uma variável, o tamanho, e desejamos classificar laranjas e maçãs com base nessa característica.
No exemplo acima, o gráfico representa as maçãs e laranjas em um espaço unidimensional, onde apenas uma característica (tamanho) está sendo considerada para a classificação.
A linha azul no gráfico é chamada de fronteira de decisão (ou hiperplano de separação) e é resultado do processo de treinamento de um modelo de classificação. Essa fronteira de decisão divide as laranjas de um lado e as maçãs do outro com base no tamanho.
A figura abaixo mostra que quando uma nova observação é inserida no gráfico, o modelo de classificação compara seu tamanho em relação à posição da fronteira de decisão. Se o tamanho da nova observação for maior do que a posição da fronteira, o modelo classificará a observação como uma maçã. Por outro lado, se o tamanho for menor do que a posição da fronteira, a observação será classificada como uma laranja.
No entanto, as Máquinas de Vetores de Suporte (SVMs) não buscam apenas qualquer fronteira de separação. Seu objetivo é encontrar o hiperplano de separação ótimo entre as duas classes de frutas (ou quaisquer outras classes). Em vez de simplesmente traçar uma linha que divide as classes, as SVMs procuram o hiperplano que esteja o mais distante possível das duas classes. Isso é feito para evitar erros de classificação e garantir uma separação mais clara.
O porquê disso é facilmente compreendido pela representação abaixo. Uma nova observação na posição indicada seria classificada como uma maçã, apesar de ser mais provável que seja uma laranja, já que está mais próxima das observações que pertencem à classe laranja.
Uma opção para melhorar a classificação nesse caso poderia ser focar nas observações das pontas de cada agrupamento e usar o ponto médio das distâncias entre elas como a fronteira de separação, conforme ilustrado abaixo. Essa abordagem pode tornar a fronteira mais adaptável e precisa, permitindo que novas instâncias próximas da fronteira sejam corretamente classificadas.
Os pontos de cada classe mais próximos da fronteira de decisão são chamados vetores de suporte. É daí que vem o nome “Support Vector Machines” (Máquinas de Vetores de Suporte). Esses vetores de suporte desempenham um papel crucial na determinação da fronteira de decisão e influenciam diretamente a capacidade do modelo de generalizar bem para novas instâncias. Por fim, a distância entre a fronteira de decisão e as observações mais próximas de cada classe (vetores de suporte) é chamada de margem.
O objetivo principal das SVMs é encontrar o hiperplano de separação que maximiza essa margem. Como vimos anteriormente, ao maximizar a margem, a SVM cria uma fronteira de decisão mais robusta, que seja capaz de separar as classes de forma clara, resultando em um modelo que provavelmente vai generalizar melhor para novas observações.
Em vez de olhar apenas para uma característica, como tamanho, as SVMs também podem levar em consideração várias características ao mesmo tempo. Por exemplo, podemos incluir informações sobre cor, forma e textura das frutas para fazer uma separação mais precisa, conforme ilustrado abaixo.
Até agora, falamos sobre SVMs usando uma linha reta como fronteira de decisão. Mas e se os dados não puderem ser separados linearmente? Para a representação abaixo não parece tão óbvio onde a fronteira de decisão pode ser posicionada para separar os dados de uma forma mais clara.
Aqui é onde entram os kernels. Kernels são funções matemáticas que nos permitem mapear os dados para espaços dimensionais mais altos, onde a separação linear pode ser possível. É como se estivéssemos jogando nossos dados em uma dimensão extra para encontrar uma fronteira de decisão melhor.
O “kernel trick” é uma forma de contornar o problema de linearidade no espaço original e tornar os dados linearmente separáveis em um espaço de dimensões mais elevadas. Dessa forma, a SVM pode encontrar uma fronteira de decisão não linear nesse espaço de características, permitindo que as classes sejam separadas de forma mais clara e precisa.
Existem diferentes tipos de kernels, como o kernel RBF (Radial Basis Function) e o kernel polinomial, que podem ser usados no “kernel trick”. Cada tipo de kernel permite lidar com diferentes formas de não linearidade nos dados, tornando as SVMs muito versáteis e eficazes em uma ampla gama de problemas de classificação.
O “kernel trick” é uma das principais vantagens das SVMs e é uma das razões pelas quais elas são amplamente utilizadas em problemas complexos e com dados que não podem ser separados linearmente em seu espaço original.
Após definir a função de decisão (linear, polinomial, RBF) e encontrar os parâmetros ótimos, a SVM está pronta para fazer previsões para novas instâncias. Nesse processo, a função de decisão é aplicada com os parâmetros otimizados.
Na classificação binária com SVM, o sinal do resultado da função de decisão é usado para determinar a qual classe a nova instância será atribuída.
O processo de determinar qual classe é representada pelo sinal positivo e qual classe é representada pelo sinal negativo é definido durante o treinamento da SVM. Vamos usar um exemplo para esclarecer isso:
Suponha que estamos classificando laranjas e maçãs. Durante o treinamento da SVM, é atribuído um rótulo numérico a cada classe. Por exemplo, podemos definir que laranjas são rotuladas como +1 e maçãs como -1.
Ao fazer a previsão para uma nova instância (um novo dado que não fazia parte do conjunto de treinamento), aplicamos a função de decisão, e o resultado será um número real. Se o resultado for positivo, a nova instância será classificada como laranja (+1), e se o resultado for negativo, será classificada como maçã (-1).
Portanto, o sinal positivo e negativo indicam a qual classe a nova instância será atribuída com base na convenção que foi estabelecida durante o treinamento. O rótulo numérico de cada classe é usado para determinar a direção da fronteira de decisão, e isso orienta a classificação correta das novas instâncias.
Vale acresecentar que o algoritmo SVM implementado na biblioteca Scikit-learn (sklearn) faz automaticamente a classificação binária e atribui os rótulos corretos às classes. Ao treinar o modelo SVM com a função fit em Scikit-learn, você não precisa se preocupar com a atribuição dos rótulos numéricos às classes manualmente. O Scikit-learn gerencia essa tarefa internamente.
Agora que entendemos a intuição por trás das SVMs, podemos explorar a parte do treinamento, que envolve otimizar uma função de custo para encontrar a fronteira de decisão ideal.
- Hinge Loss: Medindo a Discrepância entre Previsões e Rótulos
Uma das funções de custo comumente usadas no treinamento de uma SVM é a Hinge Loss (ou perda hinge). A Hinge Loss é uma função de perda que mede a discrepância entre as previsões do modelo e os rótulos verdadeiros dos dados de treinamento.
A Hinge Loss é especialmente útil para problemas de classificação binária, como o exemplo das laranjas e maçãs. Ela é projetada para penalizar as previsões incorretas, ou seja, quando o modelo classifica uma instância de forma errada em relação ao seu rótulo verdadeiro.
A forma matemática da Hinge Loss para uma única amostra é a seguinte:
L(y, f(x)) = max(0, 1 — y * f(x))
Onde:
- L é a Hinge Loss;
- y é o rótulo verdadeiro da amostra (que pode ser -1 ou 1, onde -1 representa a classe negativa e 1 a classe positiva);
- f(x) é a saída do modelo para a amostra x.
Vamos adicionar um exemplo para ilustrar a situação descrita:
Imagine que estamos usando uma SVM para classificar imagens de animais como “cachorro” ou “gato” com base em suas características. Definimos “1” como rótulo para “cachorro” e “-1” para “gato”.
Suponha que temos uma amostra de imagem de um cachorro e a saída do modelo (f(x)) para essa imagem é 0.5, o que significa que o modelo está prevendo que a imagem é de um “cachorro” (uma vez que a saída é positiva). O rótulo verdadeiro (y) para essa amostra é 1, indicando que é realmente um “cachorro”.
Vamos calcular a Hinge Loss para essa amostra:
L(y, f(x)) = max(0, 1 — y * f(x))
L(1, 0.5) = max(0, 1–1 * 0.5)
= max(0, 0.5) = 0.5
Nesse caso, como a previsão do modelo está correta (y * f(x)) é positivo (1 * 0.5 = 0.5), a Hinge Loss é calculada como 0.5. Isso indica que o modelo está relativamente confiante na classificação correta da imagem como “cachorro”.
Agora, vamos considerar uma amostra de imagem de um gato, onde a saída do modelo (f(x)) é 2.0, ou seja, o modelo está prevendo que a imagem é de um “cachorro”. O rótulo verdadeiro (y) para essa amostra é -1, indicando que é na realidade é um “gato”.
Vamos calcular a Hinge Loss para essa amostra:
L(y, f(x)) = max(0, 1 — y * f(x))
L(-1, 2.0) = max(0, 1 — (-1) * (2.0))
= max(0, 1 — (-2))
= max(0, 3) = 3
Neste caso, a previsão do modelo é 2.0, e o rótulo verdadeiro é -1, indicando que é um “gato”. Como a previsão é incorreta (y * f(x)) é negativa (-1 * 2.0 = -2.0), a Hinge Loss é calculada como 3.
A Hinge Loss penaliza a previsão incorreta proporcionalmente à distância entre a previsão incorreta e a margem de separação 1. Isso ilustra como a Hinge Loss funciona para penalizar as previsões incorretas e como a perda é proporcional à distância entre a previsão incorreta e a margem de separação 1. Quanto maior a distância entre a previsão incorreta e a margem, maior será a Hinge Loss e a penalidade para a previsão errada.
Parâmetro C: Equilibrando a Margem e as Violações de Classificação
Agora, vamos abordar o papel crucial do parâmetro “C” no treinamento das SVMs. O parâmetro “C” é um hiperparâmetro que controla a intensidade da regularização aplicada ao modelo SVM durante o treinamento.
Considerando o exemplo das laranjas e maçãs citado anteriormente, imagine que os dados estivessem distribuídos da seguinte forma:
No exemplo acima, ao impor uma restrição rigorosa para que a instância laranja não seja incorretamente classificada, podemos acabar com um modelo que está muito próximo dos pontos de cada classe e é mais suscetível a problemas de overfitting.
O overfitting ocorre quando o modelo se ajusta muito bem aos dados de treinamento, mas não generaliza bem para novos dados que não foram vistos durante o treinamento. Essa superadaptação aos dados de treinamento pode resultar em uma fronteira de decisão excessivamente complexa e sensível aos outliers, tornando o modelo pouco robusto quando aplicado a novos dados.
Portanto, é importante encontrar um equilíbrio adequado ao treinar uma SVM, considerando o parâmetro “C” que controla a regularização.
- Valor alto de C: Quando o valor de “C” é alto, a SVM será mais sensível às violações de classificação no conjunto de treinamento. Nesse caso, o modelo buscará classificar corretamente o maior número possível de amostras, mesmo que isso resulte em uma margem mais estreita. Essa abordagem pode ser útil quando se deseja ter uma classificação mais precisa nos dados de treinamento.
- Valor baixo de C: Por outro lado, quando o valor de “C” é baixo, a SVM dará mais importância à maximização da margem de separação entre as classes, mesmo que isso resulte em algumas violações de classificação no conjunto de treinamento. Essa abordagem pode ser benéfica para melhorar a generalização do modelo em novos dados não vistos, evitando o overfitting.
A escolha adequada do valor de “C” dependerá da natureza do problema e dos dados em questão. O processo de ajuste de hiperparâmetros, incluindo o “C”, é uma parte essencial do treinamento de SVMs para obter um modelo bem calibrado e com melhor desempenho tanto nos dados de treinamento quanto em novos dados não vistos.
Por hoje é só pessoal, chegamos ao final de mais um post!
Eu espero que o post tenha te ajudado. Se tiver alguma coisa que eu tenha esquecido ou alguma informação incorreta, por favor me avise nos comentários. Agradeço muito por sua atenção. Obrigada e até o próximo post!