• Tidak ada hasil yang ditemukan

Reti neurali

Dalam dokumen DellOmodarme esercitazioni R (Halaman 187-191)

Figura 9.4: Schema generale di una rete neurale feedforward (FFNN). Ogni cerchio rappresenta un neurone e i tre layer sono connessi da un sistema di pesi.

le funzioni di attivazione. Ripetendo il processo su tutte gli n soggetti si ha una matrice ykj con k = 1, . . . , q e j = 1, . . . , n delle probabilit`a di classificazione previste dalla rete neurale. La stima dei parametri W , We b si effettua con la cosidetta procedura di apprendimento (training o learning) in cui si minimizza, su un campione rappresentativo di soggetti, il quadrato degli scarti fra la classificazione reale e quella prevista. Algoritmicamente si tratta di trovare il minimo di una funzione non lineare dei parametri, problema che pu`o essere affrontato con una variet`a di tecniche.

Per il momento `e stata lasciata in sospeso una questione: come decidere il numero di neuroni che compongono l’hidden layer. Questa decisione `e lasciata allo sviluppatore della rete che deve cercare di bilanciare due effetti contrastanti. Un numero maggiore di neuroni permette di approssimare meglio sistemi di grande complessit`a; il problema `e che pi`u neuroni si introducono pi`u sono i parametri da stimare e maggiore il rischio di “overfitting” (ossia i dati del trining set vengono fittati molto bene, ma la rete `e difficilmente generalizzabile al di fuori di esso). D’altra parte un numero insufficiente di neuroni nell’hidden layer produce reti dalle scarse prestazioni. Per una trattazione dettagliata delle reti neurali si rimanda a [45, 5].

In R la funzione per fittare una rete neurale `e nnet, inserita nell’omonima libreria. Negli esempi che seguono sono illustrate alcune applicazioni e alcuni problemi che si possono manifestare nel suo utilizzo.

Esempio

Si riprendano i dati relativi alle tre specie di iris su cui si rilevano quattro misurazioni di dimensione.

L’adattamento di una rete neurale di tipo FFNN si pu`o realizzare molto semplicemente con le chiamate:

> library(nnet)

> nn1 <- nnet(Species ~ ., data=iris, size=2, maxit=600)

# weights: 19

initial value 190.465301 iter 10 value 69.655319 iter 20 value 69.318395 iter 30 value 69.314815 final value 69.314798 converged

l’opzione size = 2 specifica che nell’hidden layer devono essere presenti 2 neuroni, mentre maxit = 600 specifica il numero massimo di iterazioni prima dell’arresto del ciclo di ottimizzazione. L’output della

9.4 Reti neurali 181

funzione mostra il valore della funzione da minimizzare e, nell’ultima riga, segnala che il processo raggiunge la convergenza prima del numero massimo di ripetizioni specificate. Bisogna a questo punto accertarsi che il minimo trovato sia un “buon” minimo, ossia che l’algoritmo non abbia individuato un minimo locale e sia rimasta qui intrappolata. Per far ci`o `e possibile ripetere il fit pi`u volte, dato che ogni volta viene generato un set random di pesi con cui iniziare la ricerca del minimo. In effetti in questo caso la ripetizione del processo porta a trovare un risultato assai migliore:

> nn1 <- nnet(Species ~ ., data=iris, size=2, maxit=600)

# weights: 19

initial value 185.037723 iter 10 value 64.724960 iter 20 value 9.869698 iter 30 value 5.995920 iter 40 value 5.979222 iter 50 value 5.977537 [...]

iter 370 value 5.709308 final value 5.709290 converged

Per esaminare i parametri di questa rete si usa la chiamata:

> summary(nn1)

a 4-2-3 network with 19 weights options were - softmax modelling

b->h1 i1->h1 i2->h1 i3->h1 i4->h1 0.79 -77.36 7.42 37.57 133.61 b->h2 i1->h2 i2->h2 i3->h2 i4->h2

-1.94 -0.05 -0.23 0.35 0.67

b->o1 h1->o1 h2->o1 33.91 0.62 -117.70 b->o2 h1->o2 h2->o2 9.38 -16.85 4.17 b->o3 h1->o3 h2->o3 -43.17 15.87 112.35

I valori ottenuti si interpretano nel modo seguente: sulla prima riga si ha il bias del primo neurone dell’hidden layer e tutti i pesi che lo connettono con i neuroni di input; sulla seconda riga gli analoghi parametri per il secondo neurone dell’hidden layer; sulle ultime tre righe i parametri relativi alle connessioni dei tre neuroni di output con l’hidden layer.

Per verificare la bont`a della rete neurale `e possibile esaminare i valori fittati relativi alla classifi-cazione di ciascuna unit`a:

> nn1$fitted

setosa versicolor virginica 1 9.999993e-01 7.279985e-07 1.123193e-25 2 9.999974e-01 2.570835e-06 1.215706e-24 3 9.999988e-01 1.226702e-06 3.007681e-25 4 9.999966e-01 3.374830e-06 2.031968e-24 5 9.999994e-01 6.103881e-07 8.053718e-26 [...]

148 2.141261e-22 7.731672e-04 9.992268e-01 149 1.122273e-33 3.072375e-20 1.000000e+00 150 2.501119e-20 2.954116e-05 9.999705e-01

Ogni soggetto viene quindi assegnato alla classe il cui valore di output `e maggiore; quindi i primi 5 soggetti sono classificati come Iris setosa, gli ultimi tre come Iris virginica. Questo processo pu`o essere automatizzato usando la funzione predict nel modo seguente:

> predict(nn1, type="class")

[1] "setosa" "setosa" "setosa" "setosa" "setosa"

[6] "setosa" "setosa" "setosa" "setosa" "setosa"

[...]

[146] "virginica" "virginica" "virginica" "virginica" "virginica"

La classificazione comparata fra la situazione reale e quella ottenuta dalla rete neurale si ottiene, al solito, usando la funzione table:

> table(predict(nn1, type="class"), iris$Species) setosa versicolor virginica

setosa 50 0 0

versicolor 0 49 1

virginica 0 1 49

da cui si conclude che sul training set, con i parametri ottenuti dall’algoritmo di minimizzazione, solo 2 fiori su 150 sono classificati in modo errato, con un error rate del 1.3%.

Ovviamente, come gi`a detto in precedenza, anche per le reti neurali `e opportuno testare la validit`a del modello ottenuto su un campione indipendente di dati (test sample). In questo caso, data la dimensione del campione in esame, `e possibile utilizzare met`a dati per adattare la rete neurale e riservare l’altra parte per la procedura di validazione. Come primo passo `e necessario creare un vettore che contenga gli indici dei soggetti da usare nella procedura di fit. Se si sceglie di estrarre la met`a dei soggetti per la procedura di apprendimento della rete, lo si pu`o fare in modo bilanciato estraendo 25 fiori per ogni specie. Questo risultato si ottiene velocemente con il comando:

> training <- c(sample(1:50, 25), sample(51:100, 25), sample(101:150, 25)) A questo punto si adatta la rete neurale solo sul training set:

> nn1 <- nnet(Species ~ ., data=iris, sample=training, size=2, maxit=600)

# weights: 19

initial value 199.021850 iter 10 value 73.680598 iter 20 value 19.624933 iter 30 value 6.362878 iter 40 value 5.982060 iter 50 value 5.979595 iter 60 value 5.975253 iter 70 value 5.967165 iter 80 value 5.965253 iter 90 value 5.962355 iter 100 value 5.961253 iter 110 value 5.959566 iter 120 value 5.958422 iter 130 value 5.957413 final value 5.957380 converged

Come si pu`o vedere `e sufficiente specificare l’opzione sample per ottenere il risultato voluto. Le prestazioni di questa rete possono quindi essere valutate sul test sample nel modo seguente:

> table(predict(nn1, iris[-training,], type="class"), iris$Species[-training]) setosa versicolor virginica

setosa 25 0 0

versicolor 0 25 0

virginica 0 0 25

Dalam dokumen DellOmodarme esercitazioni R (Halaman 187-191)