Giornata Tecnica da Piave Servizi, 11 aprile 2024 | CADEI Giovanni
Classification and genetic algorithms
1. Wilt Data Classification
Algoritmi Genetici per problemi di classificazione
Autore: Zoia Alessandro
Introduzione
Il concetto da apprendere è rappresentato dalla classificazione di un albero come malato oppure no
in base ai dati forniti dal satellite Quickbird. QuickBird è il satellite secondo migliore al mondo ad
alta risoluzione. Lanciato in orbita dalla DigitalGlobe il 18 ottobre 2001 dalla base Vandenberg Air
Force CA, fino al 2007 ha offerto alle industrie leader del settore un risoluzione delle immagini
multispettrale pancromatica e a 4 bande (i.e. blue, green, red and near-infrared) .
I dati che costituiscono l'insieme di training e di testing, sono caratterizzati dai seguenti attributi :
GLCM_Pan Mean_G Mean_R Mean_NIR SD_Pan
GLCM mean
texture (Pan
band)
Mean green value Mean red value Mean NIR value Standard
deviation
(Pan band)
Tabella attributi
Mentre l'attributo di classificazione è indicato con class è può assumere il valore w se l'albero
è classificato malato oppure n se non lo è.
Immagine dal sito https://apollomapping.com
2. Rappresentazione dei dati
Gli attributi che definiscono i dati sono a valori continui, e più precisamente, in questo caso numeri
reali positivi. Seguendo l'approccio sugli attributi a valori continui di Tom Mitchell (Machine
Learning capitolo 3 par. 3.7.2), definiamo per ciascun attributo A un nuovo attributo booleano Ac
che assumerà il valore true se Ac < c, false altrimenti. Con c indichiamo un valore di soglia da
determinare. Procedendo in questo modo definiamo per ogni attributo il suo equivalente booleano
GLCM_Pan_b Mean_G_b Mean_R_b Mean_NIR_b SD_Pan_b
true/false true/false true/false true/false true/false
Per ciascun attributo i valori di soglia vengono determinati attraverso le seguenti fasi:
• I dati di training vengono ordinati in modo crescente sull'attributo considerato.
• Si individuano i punti adiacenti in corrispondenza dei quali il target value cambia di valore
da una classe all'altra ( w → n oppure n → w).
• Se indichiamo con w=1 e n=0 i due possibili valori booleani che il target value può
assumere, il valore di soglia si calcola come ( V1(A)+V0(A) ) / 2. Dove V1(A) è il valore che
assume l'attributo sul taining sample con target value 1 e V0(A) è il valore che assume
l'attributo sul training sample con target value 0.
• Dall'insieme dei valori cosi ottenuti , vogliamo selezionare quello che massimizza
l'information gain. Calcoliamo quindi per ciascun valore di soglia T il suo gain:
gain(S,T) = ( Entropy(S) - [ (|T+| / |S| ) * Entropy(T+) + (|T-|/ |S| ) * Entropy(T-) ] )
Dove S è l'insieme dei dati di training,T+ il sottoinsieme di S rappresentato dagli elementi
che assumono un valore al di sotto della soglia T sull'attributo considerato, mentre T-
rappresenta il sottoinsieme di S degli elementi al di sopra della soglia T, sempre
sull'attributo considerato.
• Selezioniamo per l'attributo la soglia T che massimizza il gain. Tutti i valori dell'attributo al
di sotto di questa soglia avranno ,nel nuovo attributo discreto associato, valore true, false
altrimenti.
Si costruisce cosi un nuovo insieme di dati di training dove ciascun attributo è sostituito dal suo
equivalente booleano in base alle soglie individuate.
3. Spazio delle ipotesi
Con la rappresentazione dei dati definita, lo spazio delle ipotesi può essere rappresentato attraverso
congiunzioni di vincoli sugli attributi del seguente tipo:
1) Valore true , il vincolo impone all''attributo che il suo valore sia al di sotto della sua soglia
2) Valore false, il vincolo impone all'attributo che il suo valore sia al di sopra della sua soglia
3) Valore indifferente true o false, nessuna imposizione sul valore dell'attributo. Indichiamo
questo caso con il simbolo *.
Un esempio di ipotesi è la seguente:
H = < * , true, false, *, true>
1° 2° 3° 4° 5°
In questo caso tutti i dati di training per i quali il valore del secondo attributo è al di sotto della
soglia, quello del terzo al di sopra della soglia e l'ultimo al di sotto della soglia ,soddisferanno
l'ipotesi e saranno classificati dalla stessa come positivi (albero malato).
Per la rappresentazione dell'ipotesi come stringa di bit , si è scelto di utilizzare 2 bit per ciascun
attributo codificando nel seguente modo i valori true,false,indifferente :
a) Coppia di bit 01 true
b) Coppia di bit 00 false
c) Coppia di bit 11 indifferente
d) Coppia di bit 10 indifferente
Con questa rappresentazione l'ipotesi H = < * , true, false, *, true> si codifica con uno dei
seguenti cromosomi:
1) 11 01 00 11 01
2) 11 01 00 10 01
3) 10 01 00 11 01
4) 10 01 00 10 01
Nell'algoritmo la popolazione sarà costituita da sequenze binarie di questo tipo.
4. Genetic Algorithm
Decidiamo di affrontare il problema di classificazione partendo dall'algoritmo genetico cosi come
presentato da Russell/Norvig ( Artificial Intelligence a Modern approach, capitolo 4 par 4.1.4). In
questa versione l'algoritmo è descritto dalla seguente funzione scritta in pseudo codice:
function GENETIC-ALGORITHM ( population , FITNESS-FN ) return an individual
inputs: population, a set of individuals
FITNESS-FN, a function that measures the fitness of an individual
repeat
new_population ← empty set
for i:=1 to SIZE(population) do
x ← RANDOM-SELECTION(population,FITNESS-FN)
y ← RANDOM-SELECTION(population,FITNESS-FN)
child ← REPRODUCE(x,y)
if( small random probability ) then child ← MUTATE(child)
add child to new_population
population ← new_population
until some individual is fit enough, o enough time has elapsed
return the best individual in population, according to FITNESS-FN
La selezione degli individui avviene in modo random, mentre il tipo di cross over scelto per
l'implementazione è il classico single point. In questa versione dell'algoritmo la riproduzione da
vita ad un singolo figlio e la popolazione viene mantenuta costante. L'implementazione fornita in
questo progetto varia questo aspetto producendo due figli. Mantenendo fissa la politica di cross
over, sono state realizzate, all'interno del codice, altre due varianti di algoritmi genetici. La prima
modifica l'algoritmo di Russell Norvig sostituendo alla funzione RANDOM-SELECTION una
funzione RANK-SELECTION che seleziona di volta in volta, per la riproduzione, le due ipotesi con
il miglior valore di fitness. La seconda variante implementa invece l'algoritmo di GABIL ( Machine
Learning par. 9.2 capitolo 9). In questa implementazione un'ipotesi viene selezionata con una
probabilità pari a :
P(Hi) = FitnessFN(Hi) / ∑ FitnessFN ( H j)
Dove FitnessFN(Hi) indica il valore di fitness dell'ipotesi Hi . La funzione di fitness è definita
come la percentuale di dati di training classificati correttamente da un'ipotesi(individuo della
popolazione). Nel nostro caso la definiamo come:
F(h) = ( correctW(x) + correctN(x) ) / 2
5. dove correctW(x) restituisce la percentuale di dati di training classificati correttamente come tipo W
e correctN(x) la percentuale di dati di training classificati correttamente di tipo N.
Genetic Algorithm, implementazione in Java
Partendo dalla soluzione descritta da Russel/Norvig, definiamo un insieme di classi che realizzano il
template generale dell'algoritmo e che lo specializzano al caso dei dati Wilt:
Classe astratta GA Template dell'algoritmo
Classe astratta GAHypothesis Modella un'ipotesi come stringa di bit
Classe WiltGA Specializza GA al caso Wilt
Classe WiltGAHypothesis Specializza GAHypothesis al caso Wilt
Classi TrainingSet e TestingSet Classi per il caricamento dei dati
Classe Main Classe principale per il lancio del programma
Classe Plotter Classe per il plotting dei dati
La classe GAHypothesis modella la struttura generale di un ipotesi per un problema di
classificazione booleano con valori booleani sugli attributi. La struttura per rappresentare la stringa
di bit del cromosoma dell'ipotesi, è rappresentata da un oggetto della classe BitSet adatta a
rappresentare sequenze di bit. La classe mantiene inoltre come variabili di istanza il suo fitness
value e la lunghezza della stringa del cromosoma. La classe presenta il metodo astratto
satisfy(boolean[] values) che lascia alla sottoclasse il compito di specializzare il come un'ipotesi è
soddisfatta dai dati in input.
GA è la classe che, attraverso il pattern Template, realizza la struttura generica dell'algoritmo
genetico visto precedentemente. Mantiene come variabili di istanza la popolazione corrente, la sua
dimensione, la percentuale di soglia da raggiungere sulla classificazione dei corretta dei dati , che
fa quindi terminare l'algoritmo, ed infine la probabilità di mutazione di un child dopo la
riproduzione da due ipotesi genitore. Richiede l'implementazione dei seguenti metodi astratti:
protected abstract void generatePopulation();
protected abstract GAHypothesis reproduce(GAHypothesis h1,GAHypothesis h2);
protected abstract void mutate(GAHypothesis h);
protected abstract void computeFitnessValue(GAHypothesis h);
Per la generazione della popolazione iniziale, la riproduzione di due ipotesi, la mutazione del
singolo bit di un'ipotesi, il calcolo del valore di fitness di un'ipotesi. WiltGA si occupa di estendere
GA implementando questi metodi. WiltGAHypothesis estende GAHypothesis implementando il
metodo satisfy() ed aggiungendo i metodi classify() e getWiltRepresentation() per,rispettivamente,
classificare un dato ed ottenere una stampa informativa dell'ipotesi nel seguente formato:
6. Wilt Hypothesis : [ <value> GLCM_pan Threshold=126.83133 ]
[ <value> Mean_Green Threshold=233.90659 ]
[ <value> Mean_Red Threshold=117.292435 ]
[ <value> Mean_NIR Threshold=534.1047 ]
[ <value> SD_pan Threshold=24.924597 ]
dove si indicano i nomi degli attributi, il valore di soglia di un attributo e il parametro <value> che
può essere una delle seguenti stringhe: Up, Down, *. Con Up diciamo che l'ipotesi impone il
vincolo maggiore del valore di soglia, con Down minore del valore di soglia, con * indifferente.
Come il nome suggerisce le classi TrainingSet e TestingSet permettono di caricare i dati presenti
nei file training.csv e testing.csv, fornendo metodi di accesso ai dati caricati.La classe Main lancia
permette di lanciare l'algoritmo per mostrare i risultati ottenuti.
Test e analisi dell'algoritmo
Le pagine che seguono illustrano diversi lanci dell'algoritmo nelle diverse implementazioni. I
risultati ottenuti evidenziano una mancanza di stabilità nel fornire la soluzione migliore da parte
dell'algoritmo con selezione random. Questo risultato dipende probabilmente dal fatto che non
vengono propagate in avanti le soluzioni più promettenti, affidando di volta in volta ad una
selezione casuale la costruzione della generazione successiva. Con la modalità rank e roulette wheel
selection si ottengono risultati migliori, queste implementazioni tendono stabilmente a fornire la
migliore soluzione che si attesta intorno al 83% e 79% circa di accuratezza nella
classificazione,rispettivamente, di dati di training e di test.
7. Genetic Algorithm random selection
Test A
75.0% testing accuracy
81.34216% training accuracy
GA string:0001001010
Mutazione con probabilità del 5%
8. Genetic Algorithm random selection
Test B
55.0% testing accuracy
78.52397% training accuracy
GA string:1001110101
Mutazione con probabilità del 5%
9. Genetic Algorithm rank selection
Test A
78.4% testing accuracy
82.56456% training accuracy
GA string:1001001111
Mutazione con probabilità del 5%
10. Genetic Algorithm rank selection
78.4% testing accuracy
82.56456% training accuracy
GA string:1001001011
Mutazione con probabilità del 5%
11. Genetic Algorithm roulette wheel selection
Test A
78.4% testing accuracy
82.56456% training accuracy
GA string:1101001111
Elementi della popolazione che sopravvivono 20/100
Mutation rate del 5%
12. Genetic Algorithm roulette wheel selection
Test B
78.4% testing accuracy
82.56456% training accuracy
GA string:1101001111
Elementi della popolazione che sopravvivono 30/100
Mutation rate del 10%