• Tidak ada hasil yang ditemukan

Caso di classi non separabili

Dalam dokumen DellOmodarme esercitazioni R (Halaman 192-196)

9.5 Support vector machines

9.5.1 Caso di classi non separabili

Nel caso generale le due classi non saranno perfettamente separabili con un iperpiano in Rp. Per risolvere questo problema si consente ad alcuni punti di giacere dal lato sbagliato dell’iperpiano, rilassando le condizioni di Eq. 9.8 e Eq. 9.9, introducendo della variabili ξi:

w · xi+ b ≥ +1 − ξi per yi= +1 (9.15)

w · xi+ b ≤ −1 − ξi per yi= −1 (9.16)

ξi ≥ 0 ∀i

Un modo naturale di tener conto delle variabili ξi `e quello di definire la funzione obiettivo da mini-mizzare da ||w||2/2 a ||w||2/2 + CP

iξi, con C parametro scelto dall’utente. Un alto valore di C corrisponde dunque a una grande penalit`a per un errore. In questo caso il lagrangiano duale LD da massimizzare coincide con quello precedente in Eq. 9.14, con le condizioni:

0 ≤ αi ≤ C ∀i ,

n

X

i=1

αixi= 0.

9.5 Support vector machines 185

Si verifica facilmente che la soluzione per w coincide con quella di Eq. 9.12.

In R le funzioni per utilizzare la tecnica di classificazione SVM sono implementate nella libreria aggiuntiva e1071, scaricabile dal sito della distribuzione.

Esempio

Si consideri nuovamente il dataset iris, oggetto di analisi nei paragrafi precedenti. Per illustrare anche graficamente il funzionamento della tecnica SVM si fa uso soltanto di una sua parte, relativa alle specie Iris setosa e Iris versicolor (le prime 100 linee del dataset) e alle variabili Sepal.Length e Sepal.W idth (le prime due colonne):

> iris3 <- iris[1:100,c(1,2,5)]

> iris3$Species <- factor(iris3$Species) # ricodifico i 2 livelli residui

La seconda linea serve a eliminare dalla codifica il livello virginica del fattore Species, che non fa pi`u parte del dataset. Le due classi originali sarebbero separabili in fase di analisi, quindi per complicare un po’ le cose si perturba uno dei dati in modo da eliminare la separabilit`a perfetta:

> iris3[1,1] <- 6.5

La classificazione SVM si effettua mediante la chiamata della funzione svm:

> model <- svm(Species ~ . , data=iris3, kernel="linear", cost=1)

Oltre alla formula relativa al modello da fittare, la funzione accetta altri parametri che ne determinano il comportamento. L’opzione cost permette di specificare il valore della costante C di cui sopra, mentre l’opzione kernel consente di trattare modelli SVM non lineari (si veda [9] per una loro trattazione).

In questo caso si sceglie un modello lineare con C = 1. Il risultato del fit `e:

> model Call:

svm(formula = Species ~ ., data = iris3, kernel = "linear", cost = 1) Parameters:

SVM-Type: C-classification SVM-Kernel: linear

cost: 1 gamma: 0.5

Number of Support Vectors: 12

da cui si vede solamente che sono necessari 12 support vector per trattare il problema. Per visualizzare i valori di αi (in realt`a di αiyi) si usa la chiamata:

> model$coefs [,1]

[1,] 1.0000000 [2,] 0.8499092 [3,] 0.7543446 [4,] 1.0000000 [5,] 1.0000000 [6,] 1.0000000 [7,] -0.6042538 [8,] -1.0000000 [9,] -1.0000000 [10,] -1.0000000 [11,] -1.0000000 [12,] -1.0000000

da cui si conclude che sono stati usati 6 punti per il gruppo y = +1 (i primi 6) e 6 per il gruppo y = −1. Per sapere quali punti sono stati utilizzati si usa la chiamata:

> model$index

[1] 1 2 21 26 32 42 58 60 67 85 86 89

che stampa in output il numero di riga del dataset di ognuno dei soggetti utilizzati come support vector.

Il valore di b si ottiene con la chiamata:

> b <- -model$rho

> b

[1] -0.2302362

mentre quello di w va costruito a partire dalle coordinate dei vettori di supporto, ottenibili con la chiamata:

> model$SV

Sepal.Length Sepal.Width 1 1.5645337 0.8376174 2 -0.9017263 -0.2067933 21 -0.1310201 0.6287352 26 -0.7475851 -0.2067933 32 -0.1310201 0.6287352 42 -1.5182913 -1.6689683 58 -0.9017263 -1.4600862 60 -0.4393026 -0.8334397 67 0.1772624 -0.2067933 85 -0.1310201 -0.2067933 86 0.7938274 0.6287352 89 0.1772624 -0.2067933

Si osservi che tali valori non coincidono con i valori delle variabili nel datatset originario, dato che per motivi di stabilit`a numerica i dati vengono automaticamente standardizzati dalla funzione svm prima dell’analisi. Le coordinate del vettore w si ottengono quindi con la chiamata:

> w <- t(model$SV) %*% model$coefs

> w

[,1]

Sepal.Length -1.730741 Sepal.Width 1.596466

La classificazione del modello, confrontata con quella reale pu`o essere ottenuta nel modo seguente:

> table(iris3$Species, predict(model)) setosa versicolor

setosa 48 2

versicolor 0 50

Come di consueto la valutazione dell’error rate di classificazione sul dataset originario pu`o essere eccessivamente ottimistica. Si pu`o ottenere una stima pi`u realistica ricorrendo a un procedimento di auto rivalidazione. Ad esempio una stima dell’error rate tramite processo 10-fold cross-validation si ottiene mediante l’opzione cross = 10 della funzione svm:

> set.seed(100)

> model.cv <- svm(Species ~ . , data=iris3, kernel="linear", cost=1, cross=10)

> summary(model.cv)

9.5 Support vector machines 187

x

x oo

o o

o o

o o

o

o o

o

o o

o o

o

o x

o

o o

o

x o

o o

oo x

o o

oo o

o

o oo

x o

o o

o

o

o o o o

o o

o o

o o

x o

x o

o oo

o o

x o o

o

o o o

o o

o o o

o

o o o

o o

x x o o

o o x o o

o

o oo o

o o

2.0 2.5 3.0 3.5 4.0

4.55.05.56.06.57.0

iris3$Sepal.Width

iris3$Sepal.Length

x

o oo

o o

o o

o o

o

o o

o

o o

o o

o

o o

o

o o

o

x o

o o

oo o

o o

oo o

o

o oo

x o

o o

o

o

o o o o

o o

o o

o o

x o

x o

o oo

o o

o o o

o

o o o

o o

o o o

o

o o o

o o

x x o o

o o o o o

o

o oo o

o o

2.0 2.5 3.0 3.5 4.0

4.55.05.56.06.57.0

iris3$Sepal.Width

iris3$Sepal.Length

Figura 9.6: Retta di separazione nel caso di due classi (di colori differenti) e due variabili (Sepal.Length e Sepal.W idth). I support vector sono indicati con una crocetta. A sinistra si ha C = 1, a destra il costo dell’errore `e molto pi`u penalizzato dal valore C = 100. Nel grafico di sinistra due punti sono mal classificati. Nel grafico di destra la retta tratteggiata che segna il confine tra le classi tende a spostarsi in modo da classificare correttamente uno dei due punti (quello in basso a sinistra).

[...]

10-fold cross-validation on training data:

Total Accuracy: 98 Single Accuracies:

100 90 100 90 100 100 100 100 100 100

Si conclude che, per quanto riguarda il processo di rivalidazione, l’accuratezza del classificatore SVM

`e del 98%.

Dato che si hanno solo due gruppi e due variabili `e interessante rappresentare graficamente la situazione. Nel grafico di Fig. 9.6 vi sono i dati originari, distinti per colore nelle due classi. Le crocette identificano i support vector mentre la retta tratteggiata `e il confine di separazione, identificato dalla tecnica SVM, di equazione:

w · x + b = 0

con x vettore di due componenti: Sepal.Length e Sepal.W idth. Per rappresentare graficamente tale retta `e necessario tener conto del fatto che, come detto sopra, le variabili vengono internamente standardizzate. I parametri della standardizzazione si ricavano con la chiamata:

> model$x.scale

$"scaled:center"

Sepal.Length Sepal.Width

5.485 3.099

$"scaled:scale"

Sepal.Length Sepal.Width 0.6487556 0.4787389

Si definiscono due vettori in cui memorizzare queste informazioni:

> media <- model$x.scale[[1]]

> varianza <- model$x.scale[[2]]

Scelto arbitrariamente x1= Sepal.Length e x2= Sepal.W idth si procede ricercando i valori di x1 in funzione di x2 per cui sia soddisfatta l’equazione della retta di separazione:

x1=−b − w2x2

w1

Si definisce quindi un range appropriato per x2:

> x2 <- seq(2, 5, by=0.1)

e si calcolano i corrispondenti valori di x1, tenendo conto della standardizzazione:

> x1 <- ((-b - w[2]*(x2-media[2])/varianza[2])/w[1])*varianza[1] + media[1]

A questo punto il grafico di Fig. 9.6 si realizza con le chiamate seguenti:

> plot(iris3$Sepal.Width, iris3$Sepal.Length, col=as.numeric(iris3$Species), + pch=c("o","x")[1:100 %in% model$index +1])

> lines(x2, x1, lty=2)

Le opzioni passate alla funzione plot servono ad attribuire un colore diverso ai punti delle due classi e a rappresentare con una crocetta solo i punti corrispondenti ai support vector.

Per confronto, in Fig. 9.6 a destra viene presentato anche il modello con penalizzazione degli errori molto pi`u alta (C = 100). Questo modello classifica in maniera scorretta solamente un caso.

Dalam dokumen DellOmodarme esercitazioni R (Halaman 192-196)