Modelos de Predição | SVM

Aprenda a criar seu primeiro algoritmo de classificação com SVM.

Bernardo Coutinho
Turing Talks
8 min readJul 28, 2019

--

Escrito por Bernardo Coutinho.

Bem vindos de volta ao Turing Talks! No post dessa semana vamos falar de SVM (Support Vector Machine), um algoritmo de aprendizado supervisionado muito utilizado quando se quer classificar dados em grupos diferentes — mas que também pode ser utilizado para regressão.

Entretanto, para adentrarmos esse assunto, é preciso um pouco de conhecimento prévio de Python e de algumas bibliotecas de Data Science. Se você ainda não está muito confiante nessas áreas, dê uma olhada nos nossos Turing Talks anteriores sobre Python (parte 1 e parte 2) e sobre bibliotecas importantes.

O que é o SVM?

O SVM é um algoritmo que busca uma linha de separação entre duas classes distintas analisando os dois pontos, um de cada grupo, mais próximos da outra classe. Isto é, o SVM escolhe a reta — também chamada de hiperplano em maiores dimensões— entre dois grupos que se distancia mais de cada um (no caso abaixo, a reta vermelha).

A reta ótima (H3) é a mais distante dos dois grupos, considerando apenas os pontos de cada grupo mais próximos à reta (como indicado pelas linhas cinzas. Fonte: Wikimedia Commons.

Após descoberta essa reta, o programa conseguirá predizer a qual classe pertence um novo dado ao checar de qual lado da reta ele está.

SVM multiclasse

Quando temos que classificar nossos dados em mais de duas classes, precisamos de algum modo de simplificar o nosso trabalho. A maneira mais simples e comum é dividir nosso problema multiclasse em várias classificações binárias, que podem ser one vs one ou one vs all (também chamada de one vs rest).

A divisão em one vs one consiste em separar nossa situação em classificações binárias de cada par diferente. Ou seja, se tivermos as três classes A, B e C, faremos as comparações (A, B), (A, C) e (B, C), e a classe mais votada será a escolhida. Por exemplo, se o SVM escolheu A em (A, B), C em (A, C) e C em (B ,C), nosso resultado será (A, C, C) e a classe escolhida será a C.

A divisão em one vs all consiste em comparar cada classe com todo o resto. Ou seja, se tivermos as mesmas três classes A, B e C, dividiremos nosso problema nas comparações (A, B+C), (B, A+C) e (C, A+B), e a classe que ganhar do resto será escolhida. Utilizando o mesmo dado do exemplo passado, o resultado das nossas comparações seriam (B+C, A+C, C), e novamente a classe escolhida será a C.

SVM não linear

SVM não linear. Fonte: Ruben Ruiz-Gonzalez et al. (adaptado)

No entanto, existem grupos que não podem ser separados somente por hiperplanos, como os da imagem ao lado. Nesses casos, utilizamos o SVM não linear para delimitar as duas classes, que traçará uma ou mais linhas retas ou curvas para separar as classes da melhor forma possível.

Para separar esses tipos de exemplos, o algoritmo primeiro faz uma transformação não-linear do espaço para depois poder separar os grupos com um SVM linear. Dessa forma, apesar da separação ser um hiperplano no espaço das features (como chamamos o espaço depois da transformação), no espaço das entradas (como chamamos o espaço inicial) a separação é não-linear.

Transformação não linear entre o espaço das entradas (à esquerda) e o espaço das features (à direita). Fonte: Wikimedia Commons.

Regressão por SVM

Apesar de ser mais comumente utilizado para classificação, o SVM também pode ser utilizado para regressão, ou seja, para prever valores contínuos com base nos dados em vez de prever as classes às quais os dados pertencem.

Nesse caso, nosso objetivo é achar o hiperplano que mais se aproxime dos dados. Novamente, o SVM considera apenas um subconjunto dos dados. Se na classificação ele considera apenas os pontos mais próximos ao hiperplano, na regressão, ele considera apenas os pontos mais distantes. Isso quer dizer que, dada uma tolerância épsilon (Ɛ), o SVM considera apenas os pontos que estão a uma distância maior que épsilon do hiperplano. O objetivo é, então, encontrar o hiperplano mais próximo desses pontos. Para casos não lineares, podemos também usar a mesma técnica de transformação do SVM não-linear para fazer uma regressão não-linear.

Regressão por SVM. Fonte: Tania Kleynhans et al.

Vantagens e Desvantagens do SVM

Assim como todos os outros modelos de predição, o SVM tem suas vantagens e suas desvantagens.

Esse tipo de modelo se destaca na classificação de dados espalhados de maneira não regular, já que a separação não precisa ser linear e nem a mesma para todos os dados. Esse algoritmo é muito interessante para iniciantes também porque não é necessário tanto conhecimento da base de dados para conseguir uma predição com boa acurácia. Além disso, o SVM funciona bem em espaços com muitas dimensões (muitas features) e é garantido a convergir para o melhor hiperplano possível, visto que seu algoritmo não se perde em mínimos locais como acontece com redes neurais (que veremos mais adiante).

Contudo, o resultado do SVM é dificilmente interpretável (mas possível) e, conforme o tamanho do dataset vai aumentando, o tempo necessário para fazer os cálculos cresce muito rapidamente e a interpretabilidade cai mais rápido ainda.

Comparado à regressão linear, qual devo usar?

Ao contrário da regressão linear, o SVM é mais capaz de trabalhar com dados não separáveis linearmente, então é a melhor escolha para datasets mais complexos. Além disso, o SVM sempre conseguirá achar o melhor hiperplano possível para separar duas classes, mas não confunda “melhor possível” com perfeito, às vezes o melhor hiperplano não consegue separar tão bem os dados.

Entretanto, por ser um modelo mais simples, a regressão linear consegue resultados bem mais rápidos conforme a quantidade de dados aumenta, quando comparada ao SVM não-linear.

Como acontecem os cálculos do SVM linear?

Antes de aprofundar essa parte de SVM, é importante esclarecer que entender a matemática desses algoritmos não é necessário para poder aplicá-los. No entanto, esse estudo pode ajudar a conhecer melhor suas limitações e seus usos ideais. Não se preocupe se você se perder nesses cálculos, se essa seção não te interessar recomendamos pular para a aplicação na próxima parte.

Primeiramente, cada dado é representado por um vetor (xᵢ, yᵢ), em que xᵢ é um vetor das coordenadas (features) de cada dado e yᵢ é a classe a qual o dado pertence (1 ou −1).

Fonte: Medium (@swastiknayak76)

Assim como uma reta é representada por “y = ax + b”, um hiperplano é representado por “w·x + b = 0”, em que o w é um vetor normal ao hiperplano, que determina sua direção, b é responsável por deslocar linearmente o hiperplano no espaço, sem alterar sua direção, e o conjunto de pontos pertencentes ao hiperplano são todos aqueles pontos x que satisfazem à equação apresentada.

Mas por que “w·x + b = 0” forma um hiperplano? Bem, “w·x” é o produto escalar do vetor w com o vetor x (distância da origem até x), que será igual a zero quando w e x forem ortogonais. Dessa forma, os pontos x que satisfazem “w·x = 0” formarão um hiperplano que passa pela origem. Ao adicionar o b à equação, criaremos novos hiperplanos de mesma direção porém deslocados pra fora da origem.

E, como nosso alvo é achar o hiperplano que melhor separe as duas classes, isso significa que, matematicamente, precisamos encontrar o w e o b ideais.

Agora, para determinar o hiperplano ideal de separação entre duas classes, primeiro é necessário encontrar os hiperplanos que estão no limite de cada grupo (as margens). Para tal, utilizaremos os support vectors os pontos de cada classe mais próximos do hiperplano de separação—por onde as margens devem passar. As representações destes são “w·x + b = 1” e “w·x + b = −1” para suas respectivas classes, como mostrado na imagem abaixo.

O hiperplano de separação está em vermelho, as margens em linhas tracejadas, e os support vectors são os 3 pontos que estão em cima das margens. Fonte: Wikimedia Commons.

Assim, todos os dados da classe 1 satisfazem a inequação “w·x + b ≥ 1” e todos os dados da classe −1 satisfazem a inequação “w·x + b ≤ −1”. Juntando essas duas inequações temos que “yᵢ · (w·xᵢ + b) ≥ 1”.

Como a distância de um hiperplano até a origem é dada por b/|w|, a distância entre nossos dois hiperplanos será “(1 − b)/|w| − (−1 − b)/|w|”, cujo resultado é “2/|w|”. Já que o hiperplano ideal é aquele cuja distância a cada grupo é a maior possível, nosso w ideal é aquele valor para o qual “2/|w|” seja máximo.

Portanto, o w do nosso hiperplano ideal será o menor w que satisfaça a inequação “yᵢ · (w·xᵢ + b) ≥ 1” para todos os pontos i. A partir disso, utilizamos algum algoritmo de otimização como gradient descent (explicado no Turing Talks passado) ou Multiplicadores de Lagrange para encontrar o w e o b do melhor hiperplano.

Como programar uma classificação por SVM?

Antes de qualquer coisa, lembre-se de importar as bibliotecas que iremos utilizar para aplicar o SVM. As principais são pandas, numpy, matplotlib e scikit-learn.

Para exemplificar essa forma de classificação, usaremos a base de dados “Iris”, que contém dados sobre 150 flores de 3 espécies diferentes.

A princípio, é recomendável usar alguns comandos simples para entender melhor sua base de dados.

Depois que entendemos o nosso dataset, já podemos testar a acurácia do nosso modelo, para saber se ele conseguirá predizer a realidade com uma boa precisão.

Finalmente! Testamos o nosso modelo e vimos que ele conseguiu uma acurácia de 98%! Agora, podemos começar a predizer dados cuja classe não sabemos.

Pronto. De acordo com nosso modelo, podemos afirmar que essa flor é da espécie 2!

Visualização da classificação com SVM no Iris

Primeiro, o algoritmo recebe os dados das flores em um formato similar ao do gráfico abaixo (só que em mais dimensões).

Scatter plot das flores da base de dados ( sepal length x petal width)

Depois, para encontrar as delineações e separar as classes, ele transforma não linearmente a entrada para depois separá-la por um hiperplano. Assim, as delimitações no espaço das entradas, mostrado na imagem abaixo, são não lineares, como visto anteriormente.

Separação da base de dados por SVM

Por fim, ele consegue predizer a qual grupo pertencerá um novo dado com base na área na qual ele se encontra.

Notebook com todo o código utilizado:

Conclusão

Com as informações desse post você já consegue criar seu primeiro modelo de classificação! Se ainda tiver alguma dúvida, dê uma olhada no notebook de SVM disponibilizado no final dessa publicação, ou mande uma mensagem pro nosso Facebook, que com certeza estaremos dispostos a te ajudar.

Mas se o SVM não atender suas necessidades, dê uma olhada no nosso Turing Talks de semana passada sobre Regressão Linear, e nos siga no Facebook e aqui no Medium porque nas próximas semanas vamos postar sobre vários outros modelos de predição!

--

--

Bernardo Coutinho
Turing Talks

Computer Engineering undergraduate at Poli-USP. Interested in Machine Learning and Robotics. https://github.com/Berbardo