Support Vector Machine (SVM)
Uma máquina de vetores de suporte (SVM) separa classes com o hiperplano de maior margem e usa kernels para limites curvos. Veja como funciona, como ajustar e o código.
Uma máquina de vetores de suporte (SVM) é um algoritmo de aprendizado supervisionado que classifica dados ao encontrar o hiperplano que separa duas classes com a maior margem possível, isto é, o espaço entre a fronteira e os pontos de treinamento mais próximos de cada classe. Esses pontos mais próximos, os vetores de suporte, são os únicos exemplos de treinamento que determinam a fronteira. As funções de kernel permitem que as SVMs aprendam fronteiras curvas, e as variantes lidam com regressão e detecção de valores atípicos. Vladimir Vapnik e colegas desenvolveram o método nos AT&T Bell Labs, com a versão de kernel em 1992 e a formulação de margem flexível usada hoje publicada por Cortes e Vapnik em 1995. Antes do aprendizado profundo, as SVMs estavam entre os classificadores mais precisos para texto, imagens e dados biológicos, e continuam sendo eficazes em conjuntos de dados pequenos a médios com muitos atributos.
Como as SVMs funcionam#
Uma SVM linear prevê a classe pelo sinal de w·x + b, portanto sua fronteira de decisão é o hiperplano w·x + b = 0; com os pesos escalados para que os pontos mais próximos satisfaçam |w·x + b| = 1, a margem tem largura de 2/‖w‖. O treinamento maximiza a margem minimizando ‖w‖² e exigindo que cada ponto de treinamento fique do lado correto dela. As classes reais se sobrepõem, então a SVM de margem flexível permite que os pontos atravessem a margem, a um custo definido pelo parâmetro de regularização C. Sua perda hinge não cobra nada por pontos classificados corretamente além da margem e aplica aos demais uma penalidade que cresce linearmente com a violação. Um C pequeno tolera mais violações e produz uma margem mais ampla e suave, enquanto um C grande se ajusta mais aos dados de treinamento, com maior risco de sobreajuste. No modelo treinado, apenas os pontos sobre a margem ou do lado errado dela têm peso diferente de zero; esses são os vetores de suporte, e mover qualquer outro ponto sem cruzar a margem não altera a fronteira.
O truque do kernel#
Quando nenhum hiperplano separa as classes, mapear os dados para mais dimensões pode torná-las separáveis: dois anéis concêntricos em 2D tornam-se separáveis por um plano reto quando um terceiro atributo, x₁² + x₂², mede a distância de cada ponto ao centro. Na forma dual, o treinamento e a previsão das SVMs usam os dados apenas por meio de produtos escalares entre pares de pontos, de modo que uma função de kernel k(x, x′) pode retornar diretamente o produto escalar no espaço mapeado, sem nunca calcular as coordenadas mapeadas. Esse é o truque do kernel. Os kernels comuns são linear, polinomial e a função de base radial (RBF), exp(−γ‖x − x′‖²), em que γ define o alcance da influência de cada vetor de suporte. Este exemplo ajusta o SVC do scikit-learn com um kernel linear e um kernel RBF em dois anéis concêntricos:
from sklearn.datasets import make_circles
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
# Two concentric rings: no straight line separates the classes
X, y = make_circles(n_samples=500, factor=0.4, noise=0.1, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
for kernel in ("linear", "rbf"):
clf = SVC(kernel=kernel, C=1.0)
clf.fit(X_train, y_train)
print(f"{kernel}: test accuracy {clf.score(X_test, y_test):.2f}, support vectors {clf.n_support_.sum()}")O kernel linear obtém 0,43 nos pontos de teste, um resultado pior do que um palpite, e mantém 360 dos 375 pontos de treinamento como vetores de suporte. O kernel RBF separa os anéis perfeitamente (1,00) com apenas 42 vetores de suporte.
Como escolher um kernel e hiperparâmetros#
As distâncias e os produtos escalares dependem da escala dos atributos, por isso as entradas da SVM são primeiro padronizadas. O guia prático dos autores do LIBSVM, a biblioteca por trás do SVC do scikit-learn, recomenda escalar os atributos, começar com o kernel RBF e escolher C e γ por busca em grade com validação cruzada. Quando há muito mais atributos do que amostras, como em textos, um kernel linear tem desempenho semelhante e treina muito mais rápido. O tempo de treinamento das SVMs com kernel cresce pelo menos quadraticamente com o número de amostras; por isso, acima de dezenas de milhares de amostras, SVMs lineares ou atributos de kernel aproximados substituem o modelo de kernel exato.
SVMs em visão computacional#
A visão computacional clássica combinava atributos projetados manualmente com SVMs lineares. O detector de pedestres de Dalal e Triggs, de 2005, pontuava histogramas de gradientes orientados (HOG) com uma SVM linear, e o detector de objetos R-CNN de 2014 classificava atributos CNN de cada proposta de região com uma SVM linear por classe, até que o Fast R-CNN as substituiu em 2015 por uma camada softmax treinada junto com a rede. Os detectores modernos aprendem os atributos e o classificador em conjunto, e as SVMs continuam sendo usadas como classificadores rápidos em atributos fixos. Uma SVM linear treinada com os vetores retornados por YOLO26 de model.embed(), um embedding por imagem, é uma sonda linear que adiciona uma nova categoria de imagem sem retreinar a rede.
Aplicações#
- Classificação de texto: Vetores de contagem de palavras têm dezenas de milhares de dimensões esparsas, nas quais SVMs lineares separam tópicos, spam e sentimento com precisão, uma vantagem demonstrada por Thorsten Joachims na categorização de texto em 1998.
- Bioinformática: Estudos de expressão gênica classificam tumores a partir de milhares de genes medidos e apenas dezenas ou centenas de pacientes, uma situação em que a margem limita o sobreajuste; kernels de strings comparam sequências de proteínas diretamente.
- Detecção de anomalias: Uma SVM de uma classe aprende uma fronteira apenas em torno dos dados normais e sinaliza pontos fora dela, o que é adequado para fraudes e monitoramento de máquinas, nos quais as falhas são raras demais para serem rotuladas.
- Regressão: A regressão por vetores de suporte ajusta uma função dentro de um tubo de largura ε, ignora erros menores que ε e mantém como vetores de suporte apenas os pontos dentro ou fora do tubo.
SVM vs. algoritmos relacionados#
- K-vizinhos mais próximos (KNN): Armazena todo o conjunto de treinamento e compara cada novo ponto com seus vizinhos no momento da previsão, enquanto uma SVM mantém apenas os vetores de suporte.
- Árvores de decisão e florestas aleatórias: Dividem os dados considerando um atributo por vez, não precisam de escala dos atributos e lidam com colunas numéricas e categóricas mistas, enquanto as SVMs precisam de entradas numéricas e escaladas.
- Redes neurais: Aprendem o mapeamento de atributos a partir dos dados, em vez de fixá-lo com um kernel, o que permite escalar para milhões de imagens, onde as SVMs com kernel ficam lentas demais.
- Regressão logística: Também aprende uma fronteira linear, mas minimiza a perda logarítmica em todos os pontos de treinamento e produz probabilidades. Uma SVM produz distâncias com sinal em relação à fronteira, e o SVC do scikit-learn gera probabilidades apenas com
probability=True, que ajusta a escala de Platt por meio de uma validação cruzada interna de 5 partições.










