2013-03-15 17 views
14

Sono abbastanza nuovo per Weka e ancora più nuovo per Weka sulla riga di comando. Trovo che la documentazione sia scarsa e sto cercando di capire alcune cose da fare. Ad esempio, si desidera prendere due file .arff, uno per la formazione, uno per il test e ottenere un output di previsioni per le etichette mancanti nei dati del test.Imparare Weka sulla riga di comando

Come posso fare questo?

ho questo codice come un blocco di partenza

java -classpath weka.jar weka.classifiers.meta.FilteredClassifier 
-t "training_file_with_missing_values.arff" 
-T "test_file_with_missing_values.arff" 
-F weka.filters.unsupervised.attribute.ReplaceMissingValues -- -c last 
-W weka.classifiers.functions.MultilayerPerceptron -- -L 0.3 -M 0.2 -H a 

esecuzione che il codice mi dà "l'opzione non valida -c ultimo" e io non so perché. Anche io non userò MLP poiché NN tende ad essere troppo lento quando ho qualche migliaio di funzionalità dai dati di testo. So come cambiarlo in un altro classificatore (come NB o libSVM quindi è buono).

Ma non sono sicuro di come aggiungere più filtri in una chiamata poiché è necessario aggiungere anche il filtro StringToWordVector (e possibilmente il filtro Riordina per rendere la classe l'ultima anziché il primo attributo).

E quindi come faccio a ricevere le etichette di previsione di ogni classe? E poi memorizzare così quelli in un arff con i dati iniziali.

risposta

34

Weka non è davvero l'esempio brillante di documentazione, ma è ancora possibile trovare informazioni preziose su di esso sui loro siti. Dovresti iniziare con Primer. Capisco che tu voglia classificare i file di testo, quindi dovresti anche dare un'occhiata a Text categorization with WEKA.

La riga di comando che hai postato nella tua domanda contiene un errore. Lo so, l'hai copiato dalla mia risposta ad un'altra domanda, ma l'ho anche notato. Devi omettere lo -- -c last, perché al filtro ReplaceMissingValue non piace.

Nel Primer si dice:

weka.filters.supervised

Classi di sotto weka.filters.supervised nella gerarchia delle classi sono per supervisionato filtraggio, cioè sfruttando la informazioni di classe. Una classe deve essere assegnata tramite -c, poiché il comportamento predefinito WEKA utilizza -c last.

ma ReplaceMissingValue è un supervisionato filtro , come è StringToWordVector.

filtri multipli

Aggiunta di filtri multipli è anche un problema, questo è ciò che il MultiFilter è per. La riga di comando può essere un po 'confusa, però: (Ho scelto RandomForest qui, perché è molto più veloce di NN).

java -classpath weka.jar weka.classifiers.meta.FilteredClassifier \ 
    -t ~/weka-3-7-9/data/ReutersCorn-train.arff \ 
    -T ~/weka-3-7-9/data/ReutersCorn-test.arff \ 
-F "weka.filters.MultiFilter \ 
    -F weka.filters.unsupervised.attribute.StringToWordVector \ 
    -F weka.filters.unsupervised.attribute.Standardize" \ 
-W weka.classifiers.trees.RandomForest -- -I 100 \ 

fare previsioni

Ecco cosa dice il Primer su come ottenere la previsione:

Tuttavia, se le informazioni più dettagliate circa le previsioni del classificatore sono necessarie, # uscite -p solo le previsioni per ogni istanza di test, insieme a un intervallo di ID di attributo basati su uno (0 per nessuno).

Si tratta di una buona convenzione per mettere quelle opzioni generali come -p 0 direttamente dopo la classe che si sta chiamando, in modo che la riga di comando sarà

java -classpath weka.jar weka.classifiers.meta.FilteredClassifier \ 
    -t ~/weka-3-7-9/data/ReutersCorn-train.arff \ 
    -T ~/weka-3-7-9/data/ReutersCorn-test.arff \ 
    -p 0 \ 
-F "weka.filters.MultiFilter \ 
    -F weka.filters.unsupervised.attribute.StringToWordVector \ 
    -F weka.filters.unsupervised.attribute.Standardize" \ 
-W weka.classifiers.trees.RandomForest -- -I 100 \ 

Struttura di classificatori WEKA/filtri

Ma come puoi vedere, WEKA può diventare molto complicato quando lo si chiama dalla riga di comando. Ciò è dovuto alla struttura ad albero dei classificatori e dei filtri WEKA. Sebbene sia possibile eseguire solo un classificatore/filtro per riga di comando, può essere strutturato come desiderato. Per il comando precedente, la struttura appare così:

Il FilteredClassifier inizializzerà un filtro sul set di dati di addestramento, filtrerà sia i dati di addestramento che di test, quindi formerà un modello sui dati di allenamento e classificherà i dati di test forniti.

FilteredClassifier 
| 
+ Filter 
| 
+ Classifier 

Se vogliamo più filtri, si usa il Multifiltro, che è solo un filtro, ma si chiama più altri nell'ordine in cui sono stati dati.

FilteredClassifier 
| 
+ MultiFilter 
| | 
| + StringToWordVector 
| | 
| + Standardize 
| 
+ RandomForest 

La parte più difficile di eseguire qualcosa di simile dalla riga di comando è di assegnare le opzioni desiderate alle classi giuste, perché spesso i nomi delle opzioni sono le stesse. Ad esempio, l'opzione -F viene utilizzata per lo FilteredClassifier e lo MultiFilter, quindi ho dovuto usare le virgolette per chiarire quale -F appartiene al filtro.

Nell'ultima riga, si vede che l'opzione -I 100, che appartiene alla RandomForest, non può essere aggiunto direttamente, perché allora sarebbe essere assegnato a FilteredClassifier e otterrete Illegal options: -I 100. Quindi, devi aggiungere -- prima di esso.

Aggiunta di previsioni per i file di dati

Adding the predicted class label è anche possibile, ma ancora più complicata. AFAIK questo non può essere fatto in un solo passaggio, ma devi prima addestrare e salvare un modello, quindi usare questo per predire e assegnare nuove etichette di classe.

Formazione e salvare il modello:

java -classpath weka.jar weka.classifiers.meta.FilteredClassifier \ 
    -t ~/weka-3-7-9/data/ReutersCorn-train.arff \ 
    -d rf.model \ 
    -F "weka.filters.MultiFilter \ 
     -F weka.filters.unsupervised.attribute.StringToWordVector \ 
     -F weka.filters.unsupervised.attribute.Standardize" \ 
    -W weka.classifiers.trees.RandomForest -- -I 100 \ 

Questo sarà serializzare il modello del formato FilteredClassifier al file rf.model. La cosa importante qui è che il filtro inizializzato sarà anche serializzato, altrimenti il ​​set di test non sarebbe compatibile dopo il filtraggio.

Caricamento del modello, fare previsioni e salvandolo:

java -classpath weka.jar weka.filters.supervised.attribute.AddClassification \ 
    -serialized rf.model \ 
    -classification \ 
    -remove-old-class \ 
    -i ~/weka-3-7-9/data/ReutersCorn-test.arff \ 
    -o pred.arff \ 
    -c last 

Nota:

voglio aggiungere che prima di scrivere questa risposta qui, ho avuto conoscenza di fare predizioni dal comando linea qualunque. Ho cercato su google i tuoi problemi e poi sono arrivato a questa risposta per tentativi ed errori;)

+1

Questa è una delle "guide" più utili per iniziare a utilizzare WEKA a scopo di previsione - Grazie! – SPi

+2

Sei un vero santo. C'è un modo per darti più credito che segnare? Ti meriti 1k punti per questo. – Gthoma2

-1

Un modo migliore per eseguire tutto ciò che si desidera utilizzare nella GUI Explorer. Ecco come fare tutto quello che vuoi:

1) Prendere due file separati per l'allenamento e il test.

Utilizzare 'Apri file' nella scheda Preelaborazione per scegliere il file di allenamento. Utilizzare la radio "Set di test forniti" nella scheda Classificazione per scegliere il file di test.

2) Emettere le previsioni per le etichette mancanti.

Utilizzare "Altre opzioni" e selezionare "Predichi di output" nella scheda Classificazione per visualizzare le previsioni.

3) utilizzare più di un filtri

Usa 'filtro' nella scheda pre-elaborazione per applicare i filtri che si desidera prima di classificare.

4) Assicurarsi di classe l'ultimo attributo

Questo in realtà è inutile. Puoi scegliere qualsiasi attributo per essere la tua classe. Una classe è qualsiasi attributo che si desidera che il classificatore preveda. Utilizza il menu a discesa Nom (Class) nella scheda Classify per scegliere quale attributo è la tua classe.

+0

Il problema con la tua risposta per (1) è che quando lo faccio ottengo l'errore che non sono compatibili. Questo perché hanno caratteristiche diverse e non mi permetteranno di testarli. Ecco perché credo di aver bisogno di usare la riga di comando per far sì che abbiano le stesse caratteristiche. –

+0

@JoshWeissbock Questo è il problema, devono avere le stesse caratteristiche. O devi filtrarli in modo che abbiano le stesse caratteristiche. – Sentry

Problemi correlati