Weka Classifier mit gcj bauen


Einleitung

Wer sich schon länger über die Stabilität von Weka (bzw der java-vm) unter Linux aufregt, dem wird das hier helfen: Ich habe herausgefunden, die man Weka Classifier mit gcj baut. Das ist ein gcc-Frontend für java, das aus java-Sourcecode normalen Maschinencode macht, statt java Bytecode. Die so erstellten Classifier scheinen in ersten Tests vom RAM-Verbrach her und von der Geschwindigkeit ungefähr auf dem Niveau der java-Classifier zu liegen, aber Classifier, die vorher bei mir abstürzten, laufen jetzt ohne Probleme durch. Ein Paket mit ein paar vorkompilierten Classifiern gibt es hier: [WWW]http://www-i6.informatik.rwth-aachen.de/~weyand/classpack.tgz Wer mehr Classifier will, kann mir mailen oder folgender Anleitung folgen, um sie selbst zu bauen. Es ist verhältnismäßig einfach.

Kochrezept

Man nehme

Einen gcj, den man in jeder gut sortierten Distribution kriegt. Ist meistens einfach beim gcc dabei. Ich verwende gcj 3.3.5. Ein Weka Paket , zu finden hier: [WWW]http://prdownloads.sourceforge.net/weka/weka-3-4-4.zip Das sehr praktische gcj build system von Chris Marshall, zu finden hier: [WWW]http://www.hopelesscase.com:81/gcj/make_c_cpp_java.tgz

Zubereitung

Den gcj installieren, zB mit
USE=gcj emerge gcc
unter Gentoo.

Einen Ordner erstellen und die restlichen Zutaten dorthin kopieren und entpacken.

mkdir weka_gcj
cd weka_gcj
wget http://puzzle.dl.sourceforge.net/sourceforge/weka/weka-3-4-4.zip
wget http://www.hopelesscase.com:81/gcj/make_c_cpp_java.tgz
unzip weka-3-4-4.zip
tar xvzf make_c_cpp_java.tgz

Den Weka Quellcode entpacken:

cp weka-3-4-4/weka-src.jar .
jar xvf weka-src.jar

Jetzt muss das Buildsystem auf den Weka-Quellcode angepasst werden. Das passiert fast ausschließlich über kopieren von Dateien in diverse Ordner. Zunächst kommt das Projektmakefile und zwei Tools ins Stammverzeichnis. Dann muss noch eine leere depend-File erstellt werden:

cp make_c_cpp_java/java/Makefile make_c_cpp_java/java/make_dep1 make_c_cpp_java/java/make_dep2 .
touch deps

Den Ordner mit dem entpackten build system kann man jetzt entsorgen oder in einen anderen Ordner verschieben, der stört sonst den build-Prozess

rm -rf make_c_cpp_java

Damit das build system weiß, welche Dateien es benutzen soll, braucht es in jedem benötigten Ordner eine Makefile. Diese muss so aussehen:

proglist :
        true

clean :
        true

Dabei darauf achten, dass man in Makefiles mit Tab einrückt. Wenn sie erstellt ist, kopiert man diese Makefile in folgende Ordner:

cp dummy_Makefile weka/Makefile
cp dummy_Makefile weka/classifiers/Makefile
cp dummy_Makefile weka/clusterers/Makefile
cp dummy_Makefile weka/core/Makefile 
cp dummy_Makefile weka/estimators/Makefile
cp dummy_Makefile weka/filters/Makefile
cp dummy_Makefile weka/classifiers/bayes/Makefile
cp dummy_Makefile weka/classifiers/functions/Makefile
...(Alle classifier-Unterordner, die man haben will)...

Alle Dateien in den Ordnern, in denen eine solche Makefile liegt, werden nachher kompiliert (dh in .o-Dateien übersetzt, nicht gelinkt). Um die java-Files festzulegen, aus denen Programme gelinkt werden sollen, geht man in den entsprechenden Ordner und passt die Makefile an. Hier führe ich das mal am Naive Bayes Classifier vor.:

cd weka/classifiers/bayes/
vim Makefile
Jetzt die Makefile so ändern:
proglist :
        touch NaiveBayes.java.e

clean :
        rm -f NaiveBayes *.e

Mit den .e-Files signalisiert man dem build-System, dass es eine Datei linken soll. Wenn man weitere Classifier bauen will, fügt man einfach entsprechende Einträge im Makefile hinzu. Um zu bauen, geht man wieder in den Hauptordner und ruft make auf:

cd ../../..
make depend
make all
Bei make depend nicht von den warnings und errors irritieren lassen.

Danach liegt die frisch zubereitete Binary in weka/classifiers/bayes und heißt NaiveBayes. Man benutzt sie genau wie ihr java-Äquivalent, also z.b.

./NaiveBayes -x 10 -t dmc2005.arff

das macht 10x-Cross-Validation.

Da der gcj noch nicht fertig ist, lassen sich nicht alle Classifier kompilieren, ich hatte zB Probleme mit dem MultilayerPerceptron. Und die GUI ging natürlich erst recht nicht :-)

Dann guten Appetit! Tob


Offline DMC Log & Layout: Arnd Ißler, http://arndissler.net/