In ricerca biomedica quantitativa il vincolo non è quasi mai l’algoritmo di classificazione: è il protocollo con cui se ne misura la performance. WEKA — Waikato Environment for Knowledge Analysis — è lo strumento Open Source che rende quel protocollo riproducibile anche a chi non ha una formazione informatica. Per questo, più che per il suo catalogo di classificatori, compare con frequenza crescente nella letteratura su dati clinici e di espressione genica.
Contesto
WEKA nasce dal gruppo di Ian H. Witten ed Eibe Frank all’Università di Waikato, in Nuova Zelanda. Il progetto parte a metà anni Novanta in Tcl/Tk, viene poi riscritto in Java, e dall’aprile 2000 il codice è ospitato su SourceForge. La distribuzione è sotto GNU General Public License. La linea stabile attuale è la 3.2.x; accanto corre la linea di sviluppo 3.3.x, dove confluiscono i classificatori e le interfacce nuove. Il testo di accompagnamento è Data Mining: Practical Machine Learning Tools and Techniques with Java Implementations di Witten e Frank (Morgan Kaufmann, 2000), che documenta gli algoritmi implementati e ne fornisce l’impianto didattico.
Lo strumento ha quattro interfacce. L’Explorer è per l’esplorazione interattiva di un dataset: vista tabulare, istogrammi per attributo, scatter plot, albero di decisione disegnato. L’Experimenter è per gli esperimenti comparativi, con cross-validation e test statistici. La riga di comando automatizza. L’API Java incorpora le classi nelle proprie applicazioni. Il formato di input è ARFF (Attribute-Relation File Format): un file di testo con un header che dichiara nome della relazione e tipi degli attributi (@relation, @attribute, @data) e una sezione dati in stile CSV. Un formato che esplicita i tipi è ciò che rende replicabile lo scambio di un dataset fra gruppi diversi.
Problema
Il caso d’uso che ha portato WEKA nella letteratura clinica è la classificazione di campioni a partire da molte variabili e pochi soggetti. L’esempio canonico è il dataset di leucemia di Golub et al., pubblicato su Science nel 1999 (vol. 286, pp. 531–537): 72 campioni di tessuto, 7129 valori di espressione genica da chip Affymetrix, etichetta binaria fra leucemia mieloide acuta (AML) e leucemia linfoblastica acuta (ALL). Migliaia di attributi e poche decine di osservazioni: la geometria opposta a quella per cui è tarata la maggior parte dei metodi statistici classici.
Su dati di questa forma il rischio dominante è l’ottimismo della stima. Con 7129 geni si trova quasi sempre un sottoinsieme che separa alla perfezione 72 campioni, anche quando l’etichetta è puro rumore. Dudoit, Fridlyand e Speed (Journal of the American Statistical Association, 2002) hanno confrontato sistematicamente diversi metodi di discriminazione proprio su Golub e su altri due dataset di microarray: la stima di accuratezza cambia a seconda che la selezione delle variabili avvenga dentro o fuori il ciclo di cross-validation. Si scelgono i geni guardando l’intero dataset, poi si valida con cross-validation, e i numeri vengono sistematicamente troppo ottimistici.
Architettura
WEKA raccoglie un catalogo di classificatori organizzato per famiglie: alberi di decisione con J48 (l’implementazione Java di C4.5 di Ross Quinlan), Id3 e REPTree; classificatori bayesiani con NaiveBayes e BayesNet; metodi a istanze con IBk (k-nearest neighbors); funzioni con SMO — l’algoritmo di Sequential Minimal Optimization di John Platt (Microsoft Research, 1998) per addestrare Support Vector Machine — e Logistic; reti neurali shallow con MultilayerPerceptron; meta-classificatori come Bagging, AdaBoostM1 e Stacking; metodi di selezione degli attributi (InfoGainAttributeEval, CfsSubsetEval, approcci wrapper). Per ciascuno si ottengono il modello addestrato, le probabilità per classe dove ha senso, e le metriche con cross-validation stratificata configurabile.
Per la pratica clinica non conta la lunghezza di questa lista. Conta la classe FilteredClassifier e il modo in cui l’Experimenter incatena pre-processing e classificazione: un filtro di selezione degli attributi avvolto attorno al classificatore viene ri-addestrato a ogni fold della cross-validation, sui soli dati di training di quel fold. Per costruzione, l’informazione del test set non filtra nella scelta delle feature. Lo stesso schema, scritto a mano in MATLAB o in R, è una sorgente ricorrente di errore; in WEKA è il comportamento di default quando si compone il filtro con il classificatore, invece di filtrare il dataset una volta sola.
Il flusso di lavoro tipico in un laboratorio biomedico è quindi questo: pre-processing nello strumento specialistico (R/Bioconductor per i microarray, MATLAB per i segnali fisiologici, estrazione di feature da ROI per le immagini), export in ARFF, e infine confronto dei classificatori in WEKA sotto un unico protocollo di validazione condiviso da tutti.
Punto critico
Con l’Experimenter si definisce un insieme di dataset e un insieme di classificatori con i loro iperparametri, si eseguono N ripetizioni di cross-validation con gli stessi split casuali per ogni metodo, e si applica un test statistico (un paired t-test corretto) per decidere se una differenza di accuratezza fra due classificatori è significativa oppure rumore. Su 72 campioni la varianza fold-a-fold è grande, e uno scarto di due o tre punti di accuratezza fra J48 e SMO cade quasi sempre dentro l’intervallo in cui il test non rifiuta l’ipotesi nulla.
Il contributo che conta più di qualunque algoritmo è proprio questo: rendere normale, e a costo quasi nullo, riportare se una differenza misurata si distingue dal rumore di campionamento. Su dataset clinici piccoli e ad alta dimensionalità è quello che separa un risultato che regge a una replica indipendente da uno che non regge.
Implicazioni
Per un gruppo di ricerca clinica senza un informatico dedicato, WEKA abbassa la soglia per fare confronti corretti: la cross-validation stratificata, la selezione delle feature avvolta nel ciclo di validazione e i test di significatività si fanno dalla GUI, senza scrivere il codice del protocollo. Il formato ARFF lega WEKA agli strumenti di pre-processing, e l’API Java permette di incorporare un modello addestrato in un’applicazione: serve sia per l’esplorazione sia per l’integrazione in un sistema più ampio. Diversi progetti di ricerca costruiscono piccole interfacce sopra l’API di WEKA, specializzate per una singola patologia.
Limiti
L’implementazione Java, pensata per la chiarezza didattica, non regge dataset da milioni di record; SMO e MultilayerPerceptron rallentano sensibilmente al crescere della taglia. Le reti disponibili sono percettroni multistrato shallow con backpropagation classico. WEKA pretende che le feature siano già estratte: non fa apprendimento di rappresentazione, e tutta l’estrazione da segnali o immagini resta a monte. Il cost-sensitive learning per classi sbilanciate — frequente in medicina, dove la condizione di interesse è minoritaria — c’è (CostSensitiveClassifier), ma va impostato a mano; e l’accuratezza globale resta una metrica fuorviante, da sostituire con AUC, precision e recall scelte caso per caso. Per dataset di scala moderata con feature ben progettate, la situazione più comune in ricerca clinica quantitativa, questi vincoli si aggirano curando il protocollo, non con la potenza di calcolo.
- https://www.cs.waikato.ac.nz/ml/weka/
- https://waikato.github.io/weka-wiki/formats_and_processing/arff/
- https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/
- https://www.noze.it/insights/weka-biomedical-research/
Immagine di copertina: Schermata della finestra di avvio “Weka GUI Chooser”: intestazione con nome e versione del software, una foto dell’uccello weka e… — schermata di University of Waikato, CC BY-SA 3.0 — https://commons.wikimedia.org/wiki/File:Weka_GUI_Chooser.png