Macchina vettoriale di supporto (SVM)
introduzione
Support Vector Machine è uno degli algoritmi di apprendimento automatico più popolari. Non è usato solo per la classificazione, ma anche per problemi di regressione. Ma soprattutto, il suo utilizzo è stato osservato nei problemi di classificazione nell'area dell'apprendimento automatico. Molte persone preferiscono la macchina vettoriale di supporto perché offre una notevole precisione mentre utilizza meno potenza di elaborazione. La Support Vector Machine segrega i dati attraverso un iperpiano e il nuovo punto dati viene inserito nella categoria più adatta. Questo è l'obiettivo fondamentale di Support Vector Machine. Questo iperpiano è anche indicato come confine decisionale di Support Vector Machine. Esiste una varietà di diversi iperpiani che potrebbero essere usati per dividere le due classi di punti dati. Trovare un piano con il margine maggiore, ovvero
Esempio
Se vogliamo un modello in grado di distinguere correttamente tra un gatto e un cane, diciamo che osserviamo un gatto insolito che assomiglia anche a un cane. Possiamo costruire un tale modello utilizzando l'algoritmo SVM. Prima di testarlo con questo strano animale, addestreremo il nostro modello con diverse fotografie di cani e gatti in modo che possa familiarizzare con i vari attributi di cani e gatti. Quando un risultato, i casi estremi di cani e gatti saranno visti dal vettore di supporto in quanto traccia un confine di giudizio tra questi due insiemi di dati (gatto e cane). I vettori di supporto verranno utilizzati per classificarlo come un gatto.
Tipi di SVM
SVM lineare : il termine "dati linearmente separabili" si riferisce a dati che possono essere divisi in due gruppi utilizzando una sola linea retta. SVM lineare viene utilizzato per classificare tali dati e il classificatore utilizzato è noto come classificatore SVM lineare.
SVM non lineare: SVM non lineare viene utilizzato per dati separati in modo non lineare, il che significa che se un set di dati non può essere classificato utilizzando una linea retta, tali dati vengono definiti dati non lineari e il classificatore utilizzato viene denominato Non classificatore SVM -lineare.
Lavorando
SVM classifica i punti dati anche quando non sono altrimenti separabili linearmente mappando i dati in uno spazio di caratteristiche ad alta dimensione. Una volta identificato un separatore tra le categorie, i dati vengono convertiti per abilitare la rappresentazione dell'iperpiano del separatore. Il gruppo a cui dovrebbe appartenere un nuovo record può quindi essere previsto utilizzando le caratteristiche dei nuovi dati.
Funzione di costo e aggiornamenti del gradiente
L'obiettivo del metodo SVM è aumentare la distanza tra i punti dati e l'iperpiano. La perdita incernierata è la funzione di perdita che aiuta a massimizzare il margine.
Se il valore previsto e il valore effettivo hanno lo stesso segno, non vi è alcun costo. In caso contrario, determiniamo successivamente il valore della perdita. Anche la funzione di costo riceve da noi un parametro di regolarizzazione. L'obiettivo del parametro di regolarizzazione è trovare un equilibrio tra la massimizzazione del margine e la perdita. Le funzioni di costo appaiono come segue dopo l'aggiunta del parametro di regolarizzazione.
Ora che abbiamo la funzione di perdita, possiamo trovare i gradienti prendendo le derivate parziali rispetto ai pesi. Possiamo modificare i nostri pesi usando i gradienti.
Abbiamo solo bisogno di aggiornare il gradiente dal parametro di regolarizzazione quando non ci sono errori di classificazione, vale a dire quando il nostro modello prevede correttamente la classe del nostro punto dati.
Per eseguire un aggiornamento del gradiente in caso di errore di classificazione o quando il nostro modello prevede in modo errato la classe di un punto dati, includiamo la perdita insieme al parametro di regolarizzazione.
Esempio di frammento di programma
Importazione di librerie
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 finale:[0.34494241 0.1443094 ]
Bias finale:-0.0128999999999999977
Visualizzazione
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
Rilevamento volto: SVMc classifica parti dell'immagine come volto e non volto e crea un contorno quadrato attorno al volto.
Categorizzazione di testo e ipertesto: le SVM supportano modelli sia induttivi che trasduttivi per la classificazione di testo e ipertesto. Per classificare gli articoli in gruppi distinti, richiedono dati di addestramento. Classifica in base al punteggio ottenuto e quindi contrasta con il valore soglia.
Classificazione delle immagini: gli SVM migliorano la precisione della ricerca per la classificazione delle immagini. Rispetto alle tradizionali strategie di ricerca basate su query, offre una maggiore precisione.
La classificazione delle proteine e la classificazione del cancro sono due esempi di bioinformatica. SVM viene utilizzato per classificare i geni, i pazienti in base ai loro geni e altri problemi biologici.
Applicare algoritmi SVM per il rilevamento dell'omologia remota delle proteine e il rilevamento del ripiegamento delle proteine.
Conclusione
Support Vector Machine è un potente algoritmo per la classificazione in Machine learning. Sebbene possa essere utilizzato anche per problemi di regressione, suggeriamo di utilizzarlo principalmente per scopi di classificazione. Può essere utilizzato per dati lineari o non lineari e funziona perfettamente. Tuttavia, è un algoritmo di apprendimento supervisionato, quindi necessita di dati etichettati. Funziona meglio su set di dati più piccoli piuttosto che su quelli complessi.
Riferimenti
Supporta la macchina vettorialeA Home Assignment for Statistical Inference (SI) di studenti di Intelligenza Artificiale e Data Science (AI&DS), Vishwakarma Institute of Technology, Pune.
Preparato da:-
- Ajinkya Mahajan
- Aditya Bodhankar
- Riya Dhakalkar
- Diksha Prassad
- Shivani Mahjan