In questo articolo analizzeremo il workbench Weka: una avanzata raccolta di algoritmi e tecniche di preprocessamento del machine learning. Weka è stato disegnato per testare su insiemi di dati diversi metodologie esistenti, velocemente e in modo flessibile; prevede infatti il supporto per tutto il processo sperimentativo del data mining: la preparazione dei dati di input, la valutazione statistica degli schemi di apprendimento, la visualizzazione grafica dei dati di input e del risultato dell‘apprendimento.
Esamineremo gli ambienti operativi che il framework Weka mette a disposizione e valuteremo un semplice caso di studio.
Che cosa è Weka?
Il Machine Learning (o “apprendimento automatico”) è il settore della Computer Science che studia gli algoritmi capaci di emulare le modalità di ragionare tipiche dell‘uomo: riconoscere, decidere, scegliere, ossia apprendere ed estrarre informazioni su un determinato problema esaminando una serie di esempi ad esso relativi.
Il crescente interesse per il data mining deriva dalla confluenza di tre grandi fenomeni tecnologici e scientifici:
- la diffusione di strumenti per la raccolta e organizzazione di grandi volumi di dati, anche via rete;
- lo sviluppo di algoritmi più robusti ed efficienti per l‘analisi dei dati;
- la disponibilità a basso costo della necessaria potenza di calcolo richiesta dai metodi di analisi dei dati.
L‘esperienza mostra che non c‘è un singolo schema di machine learning per tutti i problemi di data mining. La tecnica algoritmica di apprendimento universale è una fantasia idealistica: il data mining è una scienza sperimentale.
Nell‘ambito del machine learning, il workbench Weka [2] è una collezione di algoritmi e tecniche di preprocessamento allo stato dell‘arte. È stato disegnato per testare velocemente metodologie esistenti su insiemi di dati diversi, in modo flessibile; prevede infatti il supporto per tutto il processo sperimentativo del data mining: la preparazione dei dati di input, la valutazione statistica degli schemi di apprendimento, la visualizzazione grafica dei dati di input e del risultato dell‘apprendimento.
Weka è stato sviluppato dall‘Università Waikato in Nuova Zelanda, e il nome è l‘acronimo per Waikato Environment for Knowledge Analysis.
Installazione e uso di Weka
Weka [2] è scritto in Java, quindi si può utilizzare su qualunque sistema operativo dotato di un ambiente di esecuzione Java. Se il JRE (Java Runtime Environment) è già installato, basta scaricare il solo programma di installazione Weka ed eseguirlo. Altrimenti, la cosa più comoda da fare è scaricare il programma di installazione Weka + JRE che installa il framework e l‘ambiente di sviluppo in un‘unica installazione. Una volta lanciato Weka possiamo scegliere tra 4 diversi ambienti operativi.
SimpleCLI
È un ambiente a linea di comando, da usare per invocare direttamente le varie classi Java di cui Weka è composto. Tutto quello che si può fare dalla SimpleCLI è possibile farlo anche da un ambiente a linea di comando come il “prompt di DOS” di Windows o la shell di Unix.
Explorer
È l‘ambiente che utilizzeremo più spesso. Con esso si possono caricare degli insiemi di dati, visualizzare in modo grafico la disposizione degli attributi, effettuare una serie di operazioni preliminari di preparazione, ed eseguire algoritmi di classificazione, clustering, selezione di attributi e determinazione di regole associative.
Per gli attributi nominali abbiamo l‘elenco dei possibili valori e, per ognuno di essi, il numero di istanze con quel valore. Interessante anche il conteggio del numero di istanze in cui l‘attributo manca e del numero di valori che appaiono una sola volta.
Per gli attributi numerici, abbiamo le informazioni sul valore massimo, minimo, sulla media e sulle deviazioni standard, oltre alle solite informazioni su numero di valori diversi, numero di valori unici e numero di istanze con valore mancante.
Experimenter
È un ambiente che consente di impostare una serie di analisi, su vari insiemi di dati e con vari algoritmi, e di eseguirle alla fine tutte insieme. È possibile in questo modo confrontare vari tipi di algoritmi, e determinare qual è il più adatto a uno specifico insieme di dati.
KnowledgeFlow
È una variante dell‘explorer, in cui le operazioni da eseguire si esprimono in un ambiente grafico, disegnando un diagramma che esprime il “flusso della conoscenza”. È possibile selezionare varie componenti come sorgenti di dati, filtri, algoritmi di classificazione, e collegarle tra loro in un diagramma tipicamente detto “data-flow”.
Figura 4 – Knowledge Flow
Un semplice esempio
Weka concentra il suo interesse principalmente sugli algoritmi di classificazione e sui filtri per la pre-elaborazione dei dataset (entrambi presenti in gran numero), ma include anche l‘implementazione di un algoritmo per la scoperta di regole di associazione (l‘algoritmo Apriori, il più noto) e di qualche algoritmo per il clustering e per la regressione.
Tra i principali schemi (learner) figurano:
- Apriori
- C4.5 decision tree
- Cobweb and Classit clusterer
- Decision table majority classifier
- EM (estimation maximization) clusterer
- HyperPipe classifier
- K-nearest neighbour classifier
- K* classifier
- Id3 decision tree classifier
- Linear regression
- Locally-weighted regression
- Logistic regression
- Naive Bayes classifier
- Neural Network back propagation classifier
- PART decision list
- PRISM classifier
- 1R classifier
- Voting feature interval classifier
- Voted perceptron
Il package weka.filters offre un utile supporto alla pre-elaborazione dei dati (data preprocessing). Questo package contiene numerose classi Java in grado di operare trasformazioni sull‘insieme dei dati, come ad esempio la rimozione o l‘aggiunta di attributi, il rimescolamento del dataset, la rimozione di determinate tuple, e altro ancora.
I filtri possono suddividersi in supervisionati e non supervisionati: nel primo caso fanno uso dell‘informazione aggiuntiva dovuta al conoscere l‘attributo target, mentre nel secondo, trattano tutti gli attributi nello stesso modo. Un‘ulteriore suddivisione è in filtri d‘attributo e filtri di tupla: nel primo caso operano sugli attributi, mentre nel secondo operano sulle tuple. Weka inoltre contiene dei meta-learning schemes, ossia metodi che non implementano direttamente un algoritmo per data mining, ma consentono di migliorare le performance dei learner.
Supponiamo di avere alcuni dati da analizzare e di volerci costruire un sistema di inferenza. Prima di tutto abbiamo la necessità di preparare i dati da caricare tramite l‘Explorer, in seguito dobbiamo selezionare un metodo di costruzione del classificatore, ed infine interpretarne l‘output.
Preparare i dati
Il formato di analisi (nativo) di Weka è il formato ARFF (Attribute-Relation File Format): si tratta di un formato per un file testo, utilizzato per memorizzare dati in database.
Prepariamo il file dei dati seguendo questa semplice struttura:
Intestazione (definizione degli attributi)
@relation @attribute {, , ...,}
oppure
@attribute real
Dove l‘ultimo attributo indica la classe.
Dati
Questa parte è costituita dal tag @data seguito dalle descrizioni degli esempi, una su ogni riga (terminata da “a capo”)
Ogni esempio è descritto dalla lista dei valori per ciascun attributo, separati da virgole
Ogni valore corrisponde all‘attributo che si trova nella stessa posizione dell‘intestazione
Le dichiarazioni @relation, @attribute e @data sono case-insensitive.
Segue un‘istanza della struttura descritta:
@RELATION iris @ATTRIBUTE sepallength NUMERIC @ATTRIBUTE sepalwidth NUMERIC @ATTRIBUTE petallength NUMERIC @ATTRIBUTE petalwidth NUMERIC @ATTRIBUTE class {Iris-setosa,Iris-versicolor,Iris-virginica} @DATA 5.1,3.5,1.4,0.2,Iris-setosa 4.9,3.0,1.4,0.2,Iris-setosa 4.7,3.2,1.3,0.2,Iris-setosa 4.6,3.1,1.5,0.2,Iris-versicolor 5.0,3.6,1.4,0.2,Iris-versicolor 5.4,3.9,1.7,0.4,Iris-versicolor 4.6,3.4,1.4,0.3,Iris-virginica 5.0,3.4,1.5,0.2,Iris-virginica 4.4,2.9,1.4,0.2,Iris-virginica 4.9,3.1,1.5,0.1,Iris-virginica
Dall‘Explorer di Weka, tutte le operazioni di pre-elaborazioni si possono eseguire dalla scheda “Pre-process”.
Caricare i dati nell‘Explorer
Carichiamo i dati nell‘Explorer e analizziamoli con tecniche di machine learning: cliccando su “open file” carichiamo il file ARFF di esempio creato precedentemente (“iris.arff”). A questo punto l‘interfaccia mostra alcune informazioni fondamentali del dataset (figura 5): 10 istanze e 5 attributi. Un istogramma in basso a destra mostra la frequenza dei valori della classe (attributo class) corrispondentemente al valore dell‘attributo selezionato. Per gli attributi numerici, l‘explorer fornisce i valori di minimo, massimo, media e deviazione standard. È possibile ispezionare i dati caricati attraverso la funzionalità di editing (pulsante edit) al fine di cercare uno specifico valore per modificare/cancellare il suo corrispondente attributo o istanza.
Figura 5 – Explorer: dataset iris.arff
Costruire un classificatore
Analizziamo a titolo esemplificativo e del tutto generico un learner costituito da un albero di decisione: nello specifico Weka integra al suo interno l‘algoritmo J48.
Che cos‘è un albero di decisione? Tentiamo di dare una breve descrizione: gli alberi di decisione costituiscono il modo più semplice di classificare degli “oggetti” in un numero finito di classi. Essi vengono costruiti suddividendo ripetutamente i record in sottoinsiemi omogenei rispetto alla variabile risposta. La suddivisione produce una gerarchia ad albero, dove i sottoinsiemi (di record) vengono chiamati nodi e, quelli finali, foglie.
In particolare, i nodi sono etichettati con il nome degli attributi, gli archi (i rami dell‘albero) sono etichettati con i possibili valori dell‘attributo sovrastante, mentre le foglie dell‘albero sono etichettate con le differenti modalità dell‘attributo classe le quali descrivono le classi di appartenenza. Un oggetto è classificato seguendo un percorso lungo l‘albero che porti dalla radice a una foglia. I percorsi sono rappresentati dai rami dell‘albero che forniscono una serie di regole.
Anche se gli alberi di decisione forniscono la rappresentazione compatta di una procedura di classificazione, spesso risulta difficile spiegare, ad esempio a persone non esperte, una struttura del tipo di quella presentata in figura 6; quindi si preferisce utilizzare una rappresentazione equivalente, ma più intuitiva, con l‘ausilio di “regole di classificazione”, che possono essere ricavate facilmente dall‘albero e che, nel caso dell‘esempio in questione, potrebbero essere espresse nel modo seguente:
IF petallength > 1.4 then Iris-versicolor ELSE IF sepallength > 4.6 then Iris-setosa ELSE Iris-virginica
Cliccando sul tab “classify” è sufficiente selezionare il classificatore attraverso il pulsante “choose” (nella sezione trees troviamo l‘algoritmo J48). Cliccando sul bottone “start”, il classificatore lavorerà fintanto che il piccolo uccello in basso a destra si muove; produrrà infine l‘output che esamineremo nel prossimo paragrafo.
Esaminare l‘output
Esaminando l‘output generato da Weka per il dataset con il classificatore J48, nella parte iniziale troviamo un riassunto del dataset, e la metodologia con il quale il classificatore viene valutato (nel caso di default è la 10-fold-cross validation). Subito dopo troviamo l‘albero di decisione generato in formato testuale.
=== Run information === Scheme: weka.classifiers.trees.J48 -C 0.25 -M 2 Relation: iris Instances: 10 Attributes: 5 sepallength sepalwidth petallength petalwidth class Test mode: 10-fold cross-validation === Classifier model (full training set) ===
J48 pruned tree ------------------ petallength <= 1.4 | sepallength <= 4.6: Iris-virginica (2.0) | sepallength > 4.6: Iris-setosa (4.0/1.0) petallength > 1.4: Iris-versicolor (4.0/2.0) Number of Leaves : 3 Size of the tree : 5
L‘output fornisce, come risultato finale, uno strumento noto in letteratura come “matrice di confusione” che può essere molto interessante per misurare le potenzialità del modello generato. Associare una matrice di confusione a ogni modello permette di scegliere il modello migliore che non necessariamente coincide con quello avente il tasso di accuratezza maggiore.
Essa è una matrice di dimensione kxk, con k numero di classi nella quale sulle colonne si hanno il numero reale di record appartenenti a ciascuna classe e sulle righe il numero previsto di records appartenenti ad una data classe.
=== Confusion Matrix === a b c <-- classified as 2 0 0 | a = Iris-setosa 0 2 2 | b = Iris-versicolor 0 0 1 | c = Iris-virginica
In questo modo i valori presenti sulla diagonale principale sono quelli che rappresentano il numero di casi classificati correttamente dall‘algoritmo, mentre ogni valore fuori dalla diagonale principale rappresenta un errore di classificazione.
Conclusioni
In questo articolo abbiamo esaminato il framework Weka. Abbiamo analizzato preliminarmente l‘ambiente, per poi eseguire un semplice processo di classificazione e inferenza mediante un modello chiamato Albero di Decisione (nella fattispecie, l‘algoritmo J48). Abbiamo infine imparato a esaminare l‘output generato per capire e interpretare il livello di accuratezza del classificatore costruito.
Riferimenti
[1] I. Witten – E. Frank, “Data Mining: Practical Machine Learning Tools and Techniques with Java Implementation”, Morgan Kauffman 2005
[2] Weka Home Site
http://www.cs.waikato.ac.nz/ml/weka/
[3] Weka Sourceforge Site
http://sourceforge.net/projects/weka/