Weka nie jest tak naprawdę świetnym przykładem dokumentacji, ale wciąż można znaleźć cenne informacje na jej temat na swoich stronach. Powinieneś zacząć od Primer. Rozumiem, że chcesz klasyfikować pliki tekstowe, więc powinieneś również rzucić okiem na Text categorization with WEKA.
Wiersz poleceń opublikowany w pytaniu zawiera błąd. Wiem, skopiowałeś to z mojej odpowiedzi na inne pytanie, ale też to zauważyłem. Musisz pominąć -- -c last
, ponieważ filtr ReplaceMissingValue
go nie lubi.
W Primer mówi:
weka.filters.supervised
Ćwiczenia poniżej weka.filters.supervised w hierarchii klas są dla nadzorowane filtrowanie, czyli wykorzystując informacje o klasie. Klasa musi być przypisana przez -c, dla domyślnego zachowania WEKA zachowanie -c last
.
ale ReplaceMissingValue
jest bez nadzoru filtr, jak StringToWordVector
.
Wiele filtrów
dodawania wielu filtr jest również nie ma problemu, że jest to, co jest dla MultiFilter
. Jednak linia poleceń może być nieco zakłopotana: (Wybrałem tutaj RandomForest
, ponieważ jest o wiele szybszy niż 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 \
Making przewidywania
Oto co Primer mówi o uzyskanie prognozy:
Jednakże, jeśli bardziej szczegółowe informacje na temat przepowiedni klasyfikatora są niezbędne, -P # wyjść tylko przewidywania dla każdej instancji testowej, wraz z zakresem opartym na jednym identyfikatorze atrybutów (0 brak).
Jest to dobra konwencja umieścić te opcje ogólne jak -p 0
bezpośrednio po klasie ty dzwonisz, więc linia poleceń byłoby
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 \
Struktura klasyfikatorów WEKA/filtry
Ale jak widać, WEKA może się bardzo skomplikować, gdy wywołuje ją z wiersza poleceń. Wynika to ze struktury drzewa klasyfikatorów i filtrów WEKA. Chociaż można uruchomić tylko jeden klasyfikator/filtr na linię komend, może on być tak złożony, jak tylko chcesz. W przypadku powyższego polecenia struktura wygląda następująco:
Filtrowanie zainicjuje filtr w zestawie danych treningowych, odfiltruje dane treningowe i testowe, a następnie przetrenuje model na danych treningowych i klasyfikuje podane dane testowe.
FilteredClassifier
|
+ Filter
|
+ Classifier
Jeśli chcemy kilka filtrów, używamy MultiFilter, który jest tylko jeden filtr, ale to wymaga wielu innych w kolejności, w jakiej zostały podane.
FilteredClassifier
|
+ MultiFilter
| |
| + StringToWordVector
| |
| + Standardize
|
+ RandomForest
Najtrudniejsze prowadzenia coś takiego z linii poleceń jest przypisanie żądane opcje do odpowiednich klas, ponieważ często nazwy opcji są takie same. Na przykład opcja -F
jest używana również dla FilteredClassifier
i MultiFilter
, więc musiałem użyć cudzysłowów, aby jasno określić, który -F należy do jakiego filtra.
W ostatnim wierszu, można zauważyć, że opcja -I 100
, która należy do RandomForest
, nie mogą być dołączane bezpośrednio, bo wtedy byłoby przypisane do FilteredClassifier
a dostaniesz Illegal options: -I 100
. W związku z tym musisz przed nim dodać --
.
Dodawanie przewidywania do plików danych
Adding the predicted class label jest również możliwe, ale jeszcze bardziej skomplikowana. AFAIK nie można tego zrobić w jednym kroku, ale najpierw musisz wyszkolić i zapisać model, a następnie użyć go do przewidywania i przypisywania nowych etykiet klas.
Szkolenie i zapisywania modelu:
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 \
To będzie szeregować model wyszkolonego FilteredClassifier
do pliku rf.model
. Ważną rzeczą tutaj jest to, że zainicjalizowany filtr będzie również serializowany, w przeciwnym razie zestaw testowy nie będzie kompatybilny po filtrowaniu.
Ładowanie modelu, dzięki czemu przewidywania i zapisywanie go:
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
Uwaga:
Chcę dodać, że przed napisaniem tej odpowiedzi tutaj, miałem żadnej wiedzy na temat tworzenia prognoz z polecenia w jakiejkolwiek linii. Przeanalizowałem Twoje problemy, a następnie doszedłem do tej odpowiedzi metodą prób i błędów;)
Jest to jeden z najbardziej pomocnych "przewodników", aby zacząć korzystać z WEKA do celów związanych z prognozowaniem - dziękuję! – SPi
Jesteś absolutnym świętym. Czy jest jakikolwiek sposób, aby dać ci więcej punktów niż oznaczanie? Zasługujesz na 1k punktów za to. – Gthoma2