Máquina de vetores de suporte (SVM)

Nov 25 2022
Introdução O Support Vector Machine é um dos algoritmos de aprendizado de máquina mais populares. Não é usado apenas para classificação, mas também para problemas de regressão.
SVM (Ref. geospasialis.com)

Introdução

O Support Vector Machine é um dos algoritmos de aprendizado de máquina mais populares. Não é usado apenas para classificação, mas também para problemas de regressão. Mas principalmente, seu uso tem sido observado em problemas de classificação na área de aprendizado de máquina. Muitas pessoas preferem a máquina de vetores de suporte porque ela oferece uma precisão notável enquanto usa menos poder de processamento. A Support Vector Machine segrega os dados através de um hiperplano e o novo ponto de dados é colocado na categoria mais adequada. Este é o objetivo básico da Support Vector Machine. Este hiperplano também é referido como um limite de decisão da Support Vector Machine. Há uma variedade de hiperplanos diferentes que podem ser usados ​​para dividir as duas classes de pontos de dados. Encontrar um plano com a maior margem - ou seja,

Exemplo

Se quisermos um modelo que possa distinguir corretamente entre um gato e um cachorro, digamos que observamos um gato incomum que também se parece com um cachorro. Podemos construir tal modelo utilizando o algoritmo SVM. Antes de testá-lo com este estranho animal, vamos primeiro treinar nosso modelo com várias fotografias de cães e gatos para que ele possa se familiarizar com os vários atributos de cães e gatos. Quando um resultado, os casos extremos de gatos e cachorros serão vistos pelo vetor de suporte ao traçar uma fronteira de julgamento entre esses dois conjuntos de dados (gato e cachorro). Os vetores de suporte serão usados ​​para categorizá-lo como um gato.

Fig. Exemplo de SVM (ref: www.javatpoint.com )

Tipos de SVM

SVM linear : O termo “dados linearmente separáveis” refere-se a dados que podem ser divididos em dois grupos usando apenas uma única linha reta. O Linear SVM é usado para classificar esses dados, e o classificador utilizado é conhecido como classificador Linear SVM.

Fig. SVM linear (Ref. www.javatpoint.com)

N on-linear SVM : Non-Linear SVM é usado para dados separados não linearmente, o que significa que se um conjunto de dados não pode ser classificado usando uma linha reta, então tais dados são denominados como dados não lineares e o classificador usado é chamado de Não -classificador SVM linear.

Fig. SVM não linear (Ref. www.javatpoint.com)

Trabalhando

O SVM categoriza os pontos de dados mesmo quando eles não são linearmente separáveis, mapeando os dados para um espaço de recursos de alta dimensão. Uma vez identificado um separador entre as categorias, os dados são convertidos para permitir a representação em hiperplano do separador. O grupo ao qual um novo registro deve pertencer pode então ser previsto usando as características dos novos dados.

Função de custo e atualizações de gradiente

O objetivo do método SVM é aumentar a distância entre os pontos de dados e o hiperplano. A perda articulada é a função de perda que ajuda a maximizar a margem.

Fig. Função de perda de dobradiça (a função à esquerda pode ser representada como uma função à direita)

Se o valor projetado e o valor real tiverem o mesmo sinal, não há custo. Caso contrário, determinamos o valor da perda. A função de custo também recebe de nós um parâmetro de regularização. O objetivo do parâmetro de regularização é encontrar um equilíbrio entre maximização e perda de margem. As funções de custo aparecem da seguinte forma após a adição do parâmetro de regularização.

FIG. Função de perda para SVM

Agora que temos a função de perda, podemos encontrar os gradientes tomando derivadas parciais em relação aos pesos. Podemos modificar nossos pesos usando os gradientes.

Fig. Gradientes

Só precisamos atualizar o gradiente do parâmetro de regularização quando não houver erros de classificação, ou seja, quando nosso modelo prever corretamente a classe de nosso ponto de dados.

Fig. Atualização de gradiente - sem erros de classificação

Para realizar uma atualização de gradiente quando há uma classificação incorreta ou quando nosso modelo prevê incorretamente a classe de um ponto de dados, incluímos a perda junto com o parâmetro de regularização.

Fig. Atualização de gradiente - classificação incorreta

Exemplo de trecho de programa

Importando bibliotecas

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split

class SVM:
    def __init__(self, learning_rate=0.0001, lambda_param=0.001, n_iters=10000):
        self.weights = None
        self.bias =  None
        self.lr = learning_rate
        self.lambda_param = lambda_param
        self.n_iters = n_iters
    def fit(self,X,y):
        n_samples, n_features = X.shape
        
        y1 = np.where(y <= 0, -1, 1)
        
        self.weights = np.zeros(n_features)
        self.bias = 0
        for i in range(self.n_iters):
            for idx, x_i in enumerate(X):
                condition = y1[idx] * (np.dot(x_i, self.weights) - self.bias) >= 1
                if condition:
                    self.weights -= self.lr * (2 * self.lambda_param * self.weights)
                else:
                    self.weights -= self.lr * (2 * self.lambda_param * self.weights - np.dot(x_i, y1[idx]))
                    self.bias -= self.lr * y1[idx]
        
    def predict(self, X):
        approx = np.dot(X, self.weights) - self.bias
        return np.sign(approx)

def accuracy(y_true,y_pred):
    acc = np.sum(y_true == y_pred)/len(y_true)
    return acc
X, y =  datasets.make_blobs(n_samples=10, n_features=2, centers=2, cluster_std=1.05, random_state=40)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=42)
y = np.where(y == 0, -1, 1)
clf = SVM()
clf.fit(X_train,y_train)
predict = clf.predict(X_test)
svm_acc = accuracy(y_test,predict)
print('Accuracy:',svm_acc)
print(f'''
     Final Weight:{clf.weights}
     Final Bias:{clf.bias}
     ''')

Peso Final:[0,34494241 0,1443094]
Viés Final:-0,012899999999999977

Visualização

def visualize_svm():
    def get_hyperplane_value(x, w, b, offset):
        return (-w[0] * x + b + offset) / w[1]
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    plt.scatter(X[:,0], X[:,1], marker='x',c=y)

    x0_1 = np.amin(X[:,0])
    x0_2 = np.amax(X[:,0])

    x1_1 = get_hyperplane_value(x0_1, clf.weights, clf.bias, 0)
    x1_2 = get_hyperplane_value(x0_2, clf.weights, clf.bias, 0)

    x1_1_m = get_hyperplane_value(x0_1, clf.weights, clf.bias, -1)
    x1_2_m = get_hyperplane_value(x0_2, clf.weights, clf.bias, -1)

    x1_1_p = get_hyperplane_value(x0_1, clf.weights, clf.bias, 1)
    x1_2_p = get_hyperplane_value(x0_2, clf.weights, clf.bias, 1)

    ax.plot([x0_1, x0_2],[x1_1, x1_2], 'b--')
    ax.plot([x0_1, x0_2],[x1_1_m, x1_2_m], 'k')
    ax.plot([x0_1, x0_2],[x1_1_p, x1_2_p], 'k')

    x1_min = np.amin(X[:,1])
    x1_max = np.amax(X[:,1])
    ax.set_ylim([x1_min-3,x1_max+3])

    plt.show()

visualize_svm()

      
                
Fig. Output of SVM

Detecção de rosto — SVMc classifica partes da imagem como rosto e não rosto e cria um limite quadrado ao redor do rosto.

Categorização de texto e hipertexto — SVMs suportam modelos indutivos e transdutivos para classificação de texto e hipertexto. Para classificar artigos em grupos distintos, eles requerem dados de treinamento. Ele classifica com base na pontuação obtida e, em seguida, contrasta com o valor limite.
Classificação de imagens — SVMs melhoram a precisão da pesquisa para classificação de imagens. Em comparação com as estratégias de pesquisa convencionais baseadas em consultas, oferece maior precisão.
A classificação de proteínas e a classificação de câncer são dois exemplos de bioinformática. O SVM é usado para classificar genes, pacientes de acordo com seus genes e outras questões biológicas.
Aplique algoritmos SVM para detecção de homologia remota de proteínas e detecção de enovelamento de proteínas.

Conclusão

Support Vector Machine é um algoritmo poderoso para classificação em aprendizado de máquina. Embora também possa ser usado para problemas de regressão, sugerimos usá-lo principalmente para fins de classificação. Ele pode ser usado para dados lineares ou não lineares e funciona muito bem. No entanto, é um algoritmo de aprendizado supervisionado, portanto, precisa de dados rotulados. Funciona melhor em conjuntos de dados menores do que em conjuntos complexos.

Referências

Máquina de vetores de suporte

Uma Tarefa Doméstica para Inferência Estatística (SI) por estudantes de Inteligência Artificial e Ciência de Dados (AI&DS), Vishwakarma Institute of Technology, Pune.

Preparado por:-

  1. Ajinkya Mahajan
  2. Aditya Bodhankar
  3. Riya Dhakalkar
  4. Diksha Prasad
  5. Shivani Mahajan