Máquinas de Vetores de Suporte (SVM): Separando Classes de Forma Precisa
Combinando simplicidade e poder, as SVM oferecem uma solução elegante para muitos problemas de classificação
Olá!!
Estou muito animada em continuar nossa série “Top 8 Algoritmos de Machine Learning”, pois hoje chegou a vez de explorarmos SVM - Support Vector Machines, ou em português Máquinas de Vetores de Suporte! ✨
As Máquinas de Vetores de Suporte são uma das técnicas mais poderosas e versáteis no campo do aprendizado de máquina. Elas são amplamente utilizadas em tarefas de classificação e regressão devido à sua capacidade de lidar com problemas complexos, mesmo em espaços de alta dimensionalidade.
Neste artigo, exploraremos o que são as SVM, como funcionam e suas principais aplicações.
Acesse o Colab (Notebook) com o código: https://elisaterumi.substack.com/p/notebooks
O que são Máquinas de Vetores de Suporte?
As SVM são algoritmos supervisionados que buscam encontrar um hiperplano que melhor separa os dados em diferentes classes.
Um hiperplano é uma linha (em 2D), um plano (em 3D) ou uma estrutura de dimensões superiores que divide os dados de forma que os pontos de diferentes classes fiquem em lados opostos.
O objetivo principal do algoritmo é maximizar a margem, ou seja, a distância entre o hiperplano e os pontos de dados mais próximos de cada classe, chamados de vetores de suporte. Esses vetores de suporte são fundamentais para a construção do modelo SVM, pois eles definem a decisão de fronteira entre as classes.
Uma margem maior geralmente implica melhor generalização para novos dados.
Ou seja, o algoritmo SVM busca encontrar um hiperplano de separação que maximize essa margem, tornando-o um classificador de margem máxima.
A imagem acima ilustra o funcionamento básico de uma máquina de vetores de suporte em um problema de classificação binária (com duas classes).
Os pontos azuis e verdes representam os dados de treinamento pertencentes às duas classes diferentes, e a tarefa da SVM é separar essas duas classes de forma que cada uma fique de um lado distinto.
O hiperplano é a linha vermelha que separa as duas classes de forma ótima. Em um problema bidimensional (como mostrado aqui), o hiperplano é uma linha reta. Para dimensões superiores, ele pode ser um plano ou uma estrutura mais complexa.
A margem (região amarela) é a distância entre o hiperplano central e as linhas paralelas ao longo dos vetores de suporte (azul e verde). O objetivo da SVM é maximizar essa margem, garantindo uma separação mais robusta entre as classes.
As linhas paralelas (wx - b = 1 e wx - b = -1) são as fronteiras da margem, que passam pelos pontos de dados mais próximos do hiperplano de cada classe. Esses pontos são conhecidos como vetores de suporte.
Os vetores de suporte são os pontos que tocam as linhas paralelas (uma linha para cada classe) e determinam a posição e orientação do hiperplano. Apenas esses pontos são utilizados no cálculo do hiperplano, tornando o modelo eficiente.
A seta w indica o vetor normal ao hiperplano . Ele é perpendicular à linha de separação e define sua direção.
Como as SVM funcionam?
O funcionamento básico de uma SVM pode ser dividido em algumas etapas principais:
Seleção do Hiperplano:
O algoritmo identifica o hiperplano que separa os dados de maneira ótima. No caso de um conjunto de dados linearmente separável, o hiperplano é definido pela maior margem possível.
Vetores de Suporte:
Esses são os pontos de dados que estão mais próximos do hiperplano. Eles são fundamentais para definir a posição e orientação do hiperplano.
Kernel Trick:
Quando os dados não são linearmente separáveis, as SVM utilizam funções de kernel para mapear os dados para um espaço de maior dimensionalidade, onde um hiperplano linear pode ser encontrado. Exemplos de kernels incluem o linear, polinomial, gaussiano (RBF) e sigmoidal.
Regularização:
Um parâmetro de regularização (C) controla o equilíbrio entre maximizar a margem e minimizar o erro de classificação nos dados de treinamento. Valores altos de C dão maior importância à classificação correta dos dados, enquanto valores baixos priorizam uma margem maior.
Vantagens e Desvantagens das SVM
Vantagens:
Eficazes em espaços de alta dimensionalidade, capazes de lidar bem com situações onde o número de dimensões é maior que o número de amostras.
Utilizam uma abordagem robusta para dados não linearmente separáveis através de kernels, lidando com problemas complexos que não seriam possíveis de resolver usando apenas um hiperplano de separação linear.
Desvantagens:
Podem ser computacionalmente intensivas, especialmente com conjuntos de dados grandes.
Escolher o kernel e ajustar os parâmetros requer experimentação e pode ser desafiador.
Não são inerentemente probabilísticas, o que dificulta a interpretação direta das probabilidades associadas às classificações.
Aplicações das SVM
As Máquinas de Vetores de Suporte têm diversas aplicações práticas, como:
Reconhecimento de Padrões: Identificação de imagens, reconhecimento facial e classificação de texto.
Detecção de Anomalias: Análise de fraudes em transações financeiras e detecção de falhas em sistemas.
Bioinformática: Classificação de genes, previsão de doenças e análise de proteínas.
Sistemas de Recomendação: Segmentação de usuários e predição de preferências.
Exemplo prático em Python
Chegou a hora de colocar a mão na massa! Vamos codificar.
Abaixo temos um código que classifica e-mails em spam e não spam. Crie um jupyter notebook e cole o código:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import PCA
# Exemplo de e-mails (dados fictícios)
emails = [
"Compre já e ganhe 50% de desconto!",
"Sua fatura vence amanhã. Pague agora.",
"Você foi selecionado para ganhar um prêmio!",
"Reunião marcada para segunda-feira às 14h.",
"Clique aqui para resgatar sua recompensa exclusiva.",
"O relatório foi enviado para análise.",
"Última chance para participar da promoção!",
"Parabéns! Você ganhou um desconto exclusivo!",
"Oferta limitada! Compre agora e economize!",
"Aproveite a promoção, compre um e leve dois!",
"Sua conta está bloqueada, clique aqui para reativá-la.",
"Ganhe um prêmio de 500 reais! Clique para resgatar!",
"Não perca a chance de ganhar um iPhone!",
"Seu pagamento foi recebido com sucesso.",
"Novo produto em nosso site! Confira agora!",
"Seu saldo foi atualizado. Acesse sua conta.",
"Inscreva-se no nosso curso gratuito de marketing digital!",
"Sua assinatura foi renovada automaticamente.",
"Última oportunidade! Promoção de 70% de desconto!",
"Lembrete: A reunião será amanhã às 10h.",
"Seu pacote foi enviado. Acompanhe a entrega.",
"Atenção! Atualização importante sobre sua conta.",
"Clique aqui para obter mais informações sobre nossa promoção.",
"Fique por dentro das últimas novidades em nosso blog.",
"Seu pedido foi confirmado com sucesso!",
"Parabéns, você foi aprovado no sorteio!",
"Promoção imperdível para novos clientes. Aproveite!",
"Seu pagamento está pendente. Pague agora!",
"Não perca a chance de ganhar ingressos para o show!",
"Oferta exclusiva para membros VIP, acesse agora!"
]
# Rótulos (1 = spam, 0 = não spam)
labels = [1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1]
# Converter os e-mails em uma matriz de contagem de palavras
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(emails).toarray()
# Redução de dimensionalidade para 2 características usando PCA
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)
# Dividir os dados em conjunto de treinamento e teste
X_train, X_test, y_train, y_test = train_test_split(X_reduced, labels, test_size=0.3, random_state=42)
# Treinar o modelo SVM
svm = SVC(kernel='linear')
svm.fit(X_train, y_train)
# Visualização do hiperplano com as 2 principais componentes
x_min, x_max = X_reduced[:, 0].min() - 1, X_reduced[:, 0].max() + 1
y_min, y_max = X_reduced[:, 1].min() - 1, X_reduced[:, 1].max() + 1
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))
# Prever a classe de cada ponto na grade
Z = svm.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# Plotar os pontos de dados e o hiperplano
plt.contourf(xx, yy, Z, alpha=0.75, cmap=plt.cm.coolwarm)
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=labels, edgecolors='k', cmap=plt.cm.coolwarm, marker='o')
plt.title("SVM - Spam vs Não Spam (Com PCA)")
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()
Resultado:
Nosso código treina um modelo SVM para identificar e-mails como spam ou não. Primeiro, transformamos os e-mails em uma matriz numérica, onde cada palavra se torna uma variável que pode ser analisada pelo modelo. Esse processo é feito com o CountVectorizer
, que converte os e-mails em contagens de palavras.
Como essa matriz pode ter muitas colunas (uma para cada palavra), usamos PCA (Análise de Componentes Principais) para reduzir a dimensionalidade dos dados para duas variáveis principais, permitindo que a separação entre spam e não spam possa ser representada em um gráfico 2D.
Depois, os dados são divididos em 70% para treino e 30% para teste, treinamos o modelo e geramos um gráfico mostrando a separação entre spam (vermelho) e não spam (azul).
Acesse o Colab (Notebook) com o código: https://elisaterumi.substack.com/p/notebooks
Conclusão
As Máquinas de Vetores de Suporte são uma ferramenta poderosa no arsenal de aprendizado de máquina. Sua capacidade de lidar com problemas complexos e espaços de alta dimensionalidade as torna uma escolha popular para diversas aplicações.
Como qualquer técnica, porém, elas têm limitações e exigem ajustes cuidadosos para alcançar o melhor desempenho. Com a compreensão adequada dos fundamentos e o uso eficiente de kernels, as SVM podem ser uma solução eficaz para muitos problemas desafiadores.
No próximo post, vamos conhecer mais a fundo K-Nearest Neighbors (KNN)! ❤️