2013-03-15 15 views
14

Jestem całkiem nowa dla Weki i jeszcze bardziej nowa dla Weka na linii poleceń. Uważam, że dokumentacja jest słaba i walczę, aby wymyślić kilka rzeczy do zrobienia. Na przykład, chcesz pobrać dwa pliki .arff, jeden do treningu, jeden do testowania i uzyskać wynik prognoz dla brakujących etykiet w danych testowych.Nauka Weka na linii poleceń

Jak mogę to zrobić?

Mam ten kod jako blok startowy

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 

Running ten kod daje mi „opcja Nielegalne -c trwać” i nie jestem pewien dlaczego. Nie zamierzam też używać MLP, ponieważ NN wydaje się być zbyt powolny, gdy mam kilka tysięcy cech z danych tekstowych. Wiem, jak zmienić go na inny klasyfikator (np. NB lub libSVM, więc to jest dobre).

Ale nie jestem pewien, jak dodać wiele filtrów w jednym wywołaniu, ponieważ muszę również dodać filtr StringToWordVector (i ewentualnie filtr Kolejność, aby klasa była ostatnia, zamiast pierwszego atrybutu).

A następnie w jaki sposób mogę uzyskać to, że wypisze mi etykiety przewidywania dla każdej klasy? A potem przechowujcie te w arff z początkowymi danymi.

Odpowiedz

34

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;)

+1

Jest to jeden z najbardziej pomocnych "przewodników", aby zacząć korzystać z WEKA do celów związanych z prognozowaniem - dziękuję! – SPi

+2

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

-1

Lepszy sposób, aby zrobić wszystko, co chcesz użyć Eksploratora GUI. Oto, jak zrobić wszystko, co chcesz:

1) Weź dwa oddzielne pliki do szkolenia i testowania.

Użyj opcji "Otwórz plik" w zakładce Przetwarzanie wstępne, aby wybrać plik szkoleniowy. Użyj opcji "Dostarczony zestaw testowy" na karcie Klasyfikacja, aby wybrać plik testowy.

2) Wyprowadza prognozy brakujących etykiet.

Użyj opcji "Więcej opcji" i wybierz "Prognozy wyników" na karcie Klasyfikacja, aby wyświetlić podpowiedzi.

3) użycie więcej niż jednego filtry

Użyj „Filtr” w zakładce Preprocesuj zastosować dowolną liczbę filtrów, jak chcesz przed klasyfikowania.

4) Marka Class ostatni atrybut

To jest rzeczywiście konieczne. Możesz wybrać dowolny atrybut jako swoją klasę. Klasa to dowolny atrybut, który chcesz przewidzieć przez klasyfikator. Użyj menu Nom (klasa) na karcie Klasyfikacja, aby wybrać, który atrybut jest Twoją klasą.

+0

Problem z twoją odpowiedzią dla (1) polega na tym, że kiedy to robię, pojawia się błąd, że nie są one kompatybilne. Dzieje się tak dlatego, że mają różne funkcje i nie pozwalają mi ich przetestować. Dlatego uważam, że muszę użyć linii poleceń, aby uzyskać te same funkcje. –

+0

@JoshWeissbock To jest problem, muszą one mieć te same funkcje. Możesz też filtrować je w taki sposób, aby miały te same funkcje. – Sentry