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.
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;)
Questa è una delle "guide" più utili per iniziare a utilizzare WEKA a scopo di previsione - Grazie! – SPi
Sei un vero santo. C'è un modo per darti più credito che segnare? Ti meriti 1k punti per questo. – Gthoma2