SVM Kernel

SVM Kernel – soluzioni di problemi non lineari

Dopo aver parlato della classificazione a massimo margine con le macchine a vettori di supporto, addentriamoci nel mondo delle SVM Kernel – izzate, le quali vengono utilizzate in maniera ottimale per risolvere i problemi di classificazione non lineare.

Capiamo meglio l’aspetto di un problema di classificazione non lineare definendo e creando un dataset di campioni. Quest’ultimo ha l’aspetto di uno XOR-gate generato grazie alla funzione NumPy logical_xor” dove a 100 campioni assegneremo classe positiva 1, mentre ad altri 100 classe negativa -1.

Per capire meglio il tutto, implementiamo le righe di codice Python che ci permettono di visualizzare, grazie alla costruzione di un grafico, l’aspetto del nostro dataset:

				
					import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)
X_xor = np.random.randn(200, 2)
y_xor = np.logical_xor(X_xor[:, 0] > 0,
                       X_xor[:, 1] > 0)
y_xor = np.where(y_xor, 1, -1)

plt.scatter(X_xor[y_xor == 1, 0],
            X_xor[y_xor == 1, 1],
            c='b', marker='x',
            label='1')
plt.scatter(X_xor[y_xor == -1, 0],
            X_xor[y_xor == -1, 1],
            c='r',
            marker='s',
            label='-1')

plt.xlim([-3, 3])
plt.ylim([-3, 3])
plt.legend(loc='best')
plt.tight_layout()

plt.show()
				
			
SVM Kernel

Come vediamo dalla figura del dataset, non siamo in grado di separare i campioni della classe 1 da quella -1 utilizzando un iperpiano lineare come confine decisionale o i modelli a regressione logistica o, addirittura, SVM lineare.

Per questo motivo entrano in gioco le SVM Kernel – izzate infatti, l’idea del Kernel, utile a gestire dati non separabili linearmente, consiste nel creare combinazioni non lineari delle caratteristiche originali per proiettarle in uno spazio con maggiori dimensioni tramite una funzione di mappaggio Ø(·) dove tali diventano separabili linearmente.

La figura ci mostra come sia possibile trasformare un dataset bidimensionale in un nuovo spazio di caratteristiche a tre dimensioni dove le classi sono separabili tramite la proiezione:

SVM Kernel

In questo modo separiamo le due classi tramite un iperpiano lineare, il quale diventa il nostro confine dicisionale non lineare se eseguiamo la proiezione sullo spazio originario delle caratteristiche.

Trovare iperpiani di separazione in uno spazio di maggiori dimensioni tramite utilizzo del kernel.

Per risolvere un problema non lineare utilizzando SVM, trasformiamo i dati di addestramento proiettandoli su uno spazio di caratteristiche con dimensioni più elevate tramite funzione di mappaggio Ø(·) e addestriamo un SVM lineare utile a classificare i dati in questo nuovo spazio di caratteristiche. Successivamente possiamo sfruttare la stessa funzione di mappaggio per trasformare nuovi dati inutilizzati classificandoli con un modello SVM lineare.

Le SVM Kernel vengono utilizzate perchè la costruzione delle nuove caratteristiche è molto costosa dal punto di vista computazionale per quanto riguarda l’approccio al mappaggio. Mettendo in pratica quanto abbiamo detto, dobbiamo sostituire il prodotto:

SVM Kernel

A questo punto possiamo definire la funzione Kernel, utile a risparmiare risorse computazioni a causa del costo molto alto derivante dal prodotto fra due punti:

Radial Basis Function - RBF o Kernel Gaussiana

Una delle tecniche più utilizzate con le SVM Kernel è la Radial Basis Function o RBF, definita con la seguente formula:

SVM Kernel

Vediamo ora come poter addesstrare una SVM Kernel in grado di tracciare un confine dicisionale non lineare che separi i dati XOR.

Utilizzando la classe SVC e sostituendo a “kernel = rbf” a “linear” otteniamo:

				
					from sklearn.svm import SVC
svm = SVC(kernel='rbf', random_state=0, gamma=0.10, C=10.0)
svm.fit(X_xor, y_xor)
plot_decision_regions(X_xor, y_xor,
                      classifier=svm)

plt.legend(loc='upper left')
plt.tight_layout()

plt.show()
				
			
SVM Kernel

Il parametro gamma lo consideriamo come parametro cut-off per la sfera gaussiana. Se lo incrementassimo, di conseguenza aumenterebbe anche l‘influenza o l’ampiezza dei campioni di addestramento e la coseguenza sarebbe un confine decisionale più morbido.

SVM Kernel RBF con dataset Iris

				
					from sklearn.svm import SVC

svm = SVC(kernel='rbf', random_state=0, gamma=0.2, C=1.0)
svm.fit(X_train_std, y_train)

plot_decision_regions(X_combined_std, y_combined,
                      classifier=svm, test_idx=range(105, 150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()

plt.show()
				
			

L’utilizzo di un valore molto basso di gamma farà sì che il modello si comporti come un SVM lineare, mentre un grande valore di γ renderà il modello fortemente influenzato dagli esempi dei vettori di supporto.

SVM Kernel

Se provassimo ad incrementare gamma fino a portarla a valore 100

SVM Kernel

Il confine decisionale attorno a 0 e 1 è molto stretto. Questo è causato dall’utilizzo di un valore di gamma molto alto. Come possiamo vedere, il modello si adatta molto bene ad dataset di addestramento ma un classificatore di questo tipo ha un alto errore di generalizzazione sui dati in arrivo.

Condividi il post

Condividi su facebook
Condividi su google
Condividi su twitter
Condividi su email
Condividi su whatsapp