Máquina de vetores de suporte (SVM)
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.
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.
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.
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.
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.
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.
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.
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.
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 suporteUma 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:-
- Ajinkya Mahajan
- Aditya Bodhankar
- Riya Dhakalkar
- Diksha Prasad
- Shivani Mahajan