Data Science, Machine Learning

Algoritmo SVM (Máquina de Vetores de Suporte) a partir de exemplos e código (Python e R)

Índice

  1. O que é a máquina de vetores de suporte?
  2. Como funciona?
  3. Como implementar o SVM em Python e R?
  4. Como ajustar os parâmetros do SVM?
  5. Prós e contras associados ao SVM

O que é a Máquina de Vetores de Suporte?

“Support Vector Machine” (SVM) é um algoritmo de aprendizado de máquina supervisionado que pode ser usado para desafios de classificação ou regressão. No entanto, é usado principalmente em problemas de classificação. Nesse algoritmo, plotamos cada item de dados como um ponto no espaço n-dimensional (onde n é o número de recursos que você tem), com o valor de cada recurso sendo o valor de uma determinada coordenada. Então, nós executamos a classificação encontrando o hiperplano que diferencia muito bem as duas classes (veja a imagem abaixo).

 

SVM_1

Vetores de Suporte são simplesmente as coordenadas da observação individual. Support Vector Machine é uma fronteira que melhor segrega as duas classes (hiperplano / linha).

No link a seguir, poderá ver as máquinas de vetores de suporte e alguns exemplos de como funcionam.

Como funciona?

Acima, vimos o processo de segregar as duas classes com um hiperplano. Agora, a questão mais importante é “como podemos identificar o hiperplano certo?”. Não precisa se preocupar, não é tão difícil quanto deve está imaginando!

Vamos entender:

  • Identifique o melhor hiperplano (Cenário-1):  Aqui, temos três hiperplanos (A, B e C). Agora, identifique o melhor hiperplano para classificar estrela e círculo.
    SVM_2Você precisa se lembrar de uma regra para identificar o melhor hiperplano: “Selecione o hiperplano que separa melhor as duas classes”. Nesse cenário, o hiperplano “B” executou este trabalho de maneira excelente.

 

  • Identifique o melhor hiperplano (Cenário-2):  Aqui, temos três hiperplanos (A, B e C) e todos estão segregando bem as classes. Agora, como podemos identificar o melhor hiperplano?SVM_3Aqui, maximizar as distâncias entre o ponto de dados mais próximo (de qualquer classe) e o hiperplano nos ajudará a decidir o melhor hiperplano. Essa distância é chamada de Margem . Vejamos a imagem abaixo:SVM_4
    Acima, você pode ver que a margem para o hiperplano C é alta quando comparada a ambos, A e B. Assim, nomeamos o melhor hiperplano como C. Outro motivo de selecionar o melhor hiper-plano (de margem máxima) é robustez, se selecionarmos um hiperplano com margem baixa, haverá uma alta chance de falta de classificação.
  • Identifique o melhor hiperplano (Cenário-3): Dica:  Use as regras discutidas nas seções anteriores para identificar o melhor hiperplano

SVM_5Alguns de vocês podem ter selecionado o hiperplano B, já que ele tem uma margem maior em comparação a A. Mas, aqui está o problema, o SVM seleciona o hiperplano que classifica as classes com precisão antes de maximizar a margem. Aqui, o hiperplano B tem um erro de classificação e A classificou tudo corretamente. Portanto, o melhor hiperplano é o A.

  • Podemos classificar duas classes (Cenário-4) ?: Abaixo, não consigo separar as duas classes usando uma linha reta, pois uma das estrelas está no território de outra classe (circular) como um outlier (“ponto fora da curva”). 
    SVM_6
    Como eu já mencionei, uma estrela na outra extremidade é como um outlier para a classe Estrela. O SVM tem um recurso para ignorar valores discrepantes e encontrar o hiperplano que tem margem máxima. Portanto, podemos dizer que SVM é robusto para outliers.
    SVM_7
  • Encontre o hiperplano para segregar para classes (Cenário-5): No cenário abaixo, não podemos ter um hiperplano linear entre as duas classes, então como o SVM classifica essas duas classes? Até agora, só olhamos para o hiperplano linear. 
    SVM_8O SVM pode resolver esse problema. Facilmente! Ele resolve esse problema introduzindo um recurso adicional. Aqui, vamos adicionar um novo recurso z = x ^ 2 + y ^ 2. Agora, vamos plotar os pontos de dados no eixo x e z:
    SVM_9
    No gráfico acima, os pontos a serem considerados são:

    • Todos os valores para z seriam positivos sempre porque z é a soma quadrática de x e y
    • No gráfico original, os círculos vermelhos aparecem próximos da origem dos eixos x e y, levando a um valor menor de z e estrela relativamente longe do resultado da origem para um valor maior de z.

    No SVM, é fácil ter um hiperplano linear entre essas duas classes. Mas, outra pergunta urgente que surge é, devemos adicionar esse recurso manualmente para ter um hiperplano. Não, o SVM tem uma técnica chamada truque do kernel . Estas são funções que ocupam um espaço de entrada dimensional baixo e o transformam em um espaço dimensional mais alto, isto é, ele converte um problema não separável em um problema separável, essas funções são chamadas de núcleos (kernels). É principalmente útil no problema de separação não linear. Simplificando, ele faz algumas transformações de dados extremamente complexas e, em seguida, descobre o processo para separar os dados com base nos rótulos ou saídas que você definiu.

    Quando olhamos para o hiperplano no espaço de entrada original, parece um círculo:
    SVM_10

Agora, vamos examinar os métodos para aplicar o algoritmo SVM em um desafio de ciência de dados.

 

Como implementar o SVM em Python e R?

Em Python, o scikit-learn é uma biblioteca amplamente utilizada para implementar algoritmos de aprendizado de máquina, o SVM também está disponível na biblioteca scikit-learn e segue a mesma estrutura (biblioteca de importação, criação de objetos, modelo de montagem e predição). Vamos ver o código abaixo em Python:

#Import Library
from sklearn import svm
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create SVM classification object 
model = svm.svc(kernel='linear', c=1, gamma=1) 
# there is various option associated with it, like changing kernel, gamma and C value. Will discuss more # about it in next section.Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
#Predict Output
predicted= model.predict(x_test)

O pacote e1071 em R é usado para criar Support Vector Machines com facilidade. Tem funções auxiliares, bem como código para o Classificador Naive Bayes. A criação de uma máquina de vetores de suporte em R e Python segue abordagens semelhantes, vamos dar uma olhada agora no seguinte código em R:

#Import Library
require(e1071) #Contains the SVM 
Train <- read.csv(file.choose())
Test <- read.csv(file.choose())
# there are various options associated with SVM training; like changing kernel, gamma and C value.

# create model
model <- svm(Target~Predictor1+Predictor2+Predictor3,data=Train,kernel='linear',gamma=0.2,cost=100)

#Predict Output
preds <- predict(model,Test)
table(preds)

 

Como ajustar os parâmetros do SVM?

O valor dos parâmetros de ajuste para algoritmos de aprendizado de máquina efetivamente melhora o desempenho do modelo. Vamos ver a lista de parâmetros disponíveis no SVM.

sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma=0.0, coef0=0.0, 
shrinking=True, probability=False,tol=0.001, cache_size=200, 
class_weight=None, verbose=False, max_iter=-1, random_state=None)

Eu vou discutir sobre alguns parâmetros importantes tendo maior impacto no desempenho do modelo, “kernel”, “gamma” e “C”.

kernel : Nós já discutimos sobre isso. Aqui, temos várias opções disponíveis com o kernel, como “linear”, “rbf”, “poly” e outros (o valor padrão é “rbf”). Aqui, “rbf” e “poly” são úteis para o hiperplano não linear. Vejamos o exemplo, onde usamos o kernel linear em dois recursos do conjunto de dados da íris para classificar sua classe.

Exemplo:  Tenha um kernel linear

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
# import some data to play with
iris = datasets.load_iris()
X = iris.data[:, :2] # we only take the first two features. We could
 # avoid this ugly slicing by using a two-dim dataset
y = iris.target
# we create an instance of SVM and fit out data. We do not scale our
# data since we want to plot the support vectors
C = 1.0 # SVM regularization parameter
svc = svm.SVC(kernel='linear', C=1,gamma=0).fit(X, y)
# create a mesh to plot in
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min)/100
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
 np.arange(y_min, y_max, h))
plt.subplot(1, 1, 1)
Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')
plt.show()SVM_11

Exemplo:  Tenha o kernel do rbf

Altere o tipo de kernel para rbf abaixo da linha e observe o impacto.

svc = svm.SVC(kernel='rbf', C=1,gamma=0).fit(X, y)

SVM_12

Eu sugiro que você vá para o kernel linear se você tiver um grande número de recursos (> 1000), porque é mais provável que os dados sejam linearmente separáveis ​​no espaço de alta dimensão. Além disso, você pode RBF, mas não se esqueça de validar cruzado para seus parâmetros, a fim de evitar o excesso de ajuste.

gamma : Coeficiente de Kernel para ‘rbf’, ‘poly’ e ‘sigmoid’. Quanto maior o valor de gamma, tentará ajustar-se exatamente ao conjunto de dados de treinamento, isto é, erro de generalização e causar problemas de ajuste excessivo.

Exemplo: Vamos diferenciar se tivermos valores gamma diferentes como 0, 10 ou 100.

svc = svm.SVC(kernel='rbf', C=1,gamma=0).fit(X, y)
15

C:  Parâmetro de penalidade C do termo de erro. Ele também controla o trade off entre o limite de decisão suave e a classificação correta dos pontos de treinamento.

 

18

Devemos sempre olhar para a pontuação de validação cruzada para ter uma combinação eficaz desses parâmetros e evitar o ajuste excessivo.

Em R, os SVMs podem ser ajustados de maneira semelhante à do Python. A seguir mencionadas são os respectivos parâmetros para o pacote e1071:

  • O parâmetro do kernel pode ser ajustado para “Linear”, “Poly”, “rbf” etc.
  • O valor gamma pode ser ajustado definindo o parâmetro “Gamma”.
  • O valor C em Python é ajustado pelo parâmetro “Custo”(Cost) em R.

 

Prós, contras e links associados ao SVM

  • Prós:
    • Funciona muito bem com margem de separação clara
    • É eficaz em espaços dimensionais elevados.
    • É eficaz nos casos em que o número de dimensões é maior que o número de amostras.
    • Ele usa um subconjunto de pontos de treinamento na função de decisão (chamados de vetores de suporte), portanto, também é eficiente em termos de memória.
  • Contras:
    • Não funciona bem quando temos um grande conjunto de dados porque o tempo de treinamento necessário é maior
    • Também não funciona muito bem, quando o conjunto de dados tem mais ruído, ou seja, as classes de destino estão sobrepostas
    • O SVM não fornece estimativas de probabilidade diretamente, elas são calculadas usando uma valiosa validação cruzada de cinco vezes. É o método SVC relacionado da biblioteca scikit-learn do Python.
  • Links:

 

Originalmente escrito por SUNIL RAY (todos os direitos reservados ao autor)
Traduzido e adaptado ao PT-BR por Alex Souza

Um comentário sobre “Algoritmo SVM (Máquina de Vetores de Suporte) a partir de exemplos e código (Python e R)

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s