Machine Learning Tutorial a very fast WEKA Introduction
[email protected]
05.01.09
1
Hauptbestandteile von WEKA:
Instances ●Instance ●Attribute ●FastVector ●Classifier ●Evaluation ●(Filter) ●
http://weka.wiki.sourceforge.net/ 05.01.09
2
Instances (Dataset) besteht aus mehreren Instanzen (Instance, nächste Folie) ● verschiedene Instanzen können unterschiedliche Gewichte bekommen ● Instanzen sind geordnet (!!!) ● stratified tests (stratify(int numFolds)) ● cross validation experiments ●
●
trainCV(int numFolds, int foldNumber)
Zugriff auf Metadaten des Datensatzes ● median, mean, variance, min, max, etc. ● Ist initialisiert auf ein (geschlossenes) Set von Attributen ●
05.01.09
3
Instances (Dataset) ●
Erzeugen ● aus ARFF-Dateien java.io.Reader auf Datei an Konstruktor übergeben weka.core.converter.Loader verwenden ● aus Datenbanken ●
●
● ●
weka.core.converter.DatabaseLoader weka.experiment.InstanceQuery
mit Hilfe eigenen Quelltextes ● etc. ●
05.01.09
4
Instances (Dataset) ●
Speichern ●
weka.core.converter.Saver
verwenden
ARFF ● Datenbank ● CSV ● … ● … oder aber für ARFF einfach ●
FileWriter fw = new FileWriter(target); fw.write(instances.toString()); fw.close(); 05.01.09
5
Instances (Dataset)
●
Aber: ● kein direktes Zusammenführen oder Teilen von Instances-Objekten ● Hinzufügen von Attributen funktioniert nicht immer ● (pers. Erfahrung ohne Beispiel)
05.01.09
6
Instance (eine Instanz) Klasse Instance ● wird erzeugt nach einer gewissen Anzahl an Attributen, deren Semantik sich nicht direkt aus der Instanz erschließt. ● warum? ●
●
Instance.setDataSet(Instances inst)
optional! kann auch Fehler erzeugen (wenn z. B. Initialisierungsreihenfolge nicht eingehalten wird)! ● Methoden wie attribute(int index):Attribute schlagen fehl, wenn kein DS gesetzt ist, bzw. Instance noch keinem DS hinzugefügt wurde. ●
05.01.09
7
Attribute
(kurzer Einschub)
Eine Klasse für alle Variablentypen ● numeric ● nominal (fixed set of predefined values) ● string (growable set of values) ● date ● relational ● 12 Konstruktoren, die je nach Parameter einen der genannten Variablentypen erzeugen ● string-Typ in der Praxis problematisch ● alle Typen sind intern numerisch ● (nom. Attribute verweisen auf Indexposition des Sets) ●
05.01.09
8
FastVector
(auch ein kurzer Einschub)
Funktionsweise wie Vector aus dem Collections Framework ● aber: ● keine Synchronisation (-> schneller) ● nicht getypt (-> casting erforderlich) (auch nicht in V3.6) ● implementiert nicht java.util.Collection ●
● ●
wird u. A. benutzt, um ● nom. Attribute zu erzeugen ● Achtung: kein Hinzufügen von Werten möglich!!
05.01.09
9
Instance (eine Instanz) ●
inst.setValue(Attribute/int attr, String/double value)
setzt einen Wert ● String value -> nomineller Wert wird in index position (> double) aufgelöst ● Fehler, wenn String nicht in dem FastVector existiert, der für die Erzeugung des Attributs benutzt wurde ● double Wert wird an Indexposition des Attributs geschrieben ● setMissing(Attribute/int index) ●
05.01.09
10
Classifier
05.01.09
-> Cursor auf Classifier und F4 in Eclipse ...11
Classifier initialisiert einen Klassifikator für die gegebenen Instanzen (alle!) ● classifyInstance(Instance i) gibt double für predizierten Wert zurück ● index-Position für nominelles Attribut ● „echter“ numerischer Wert für num. Attribut ● vor Training: generisches Setzen von Parametern mittels ●
buildClassifier(Instances inst)
setOptions(String[] options) ●
05.01.09
12
Classifier (Beispiel Knn) weka.classifiers.lazy.IBk
05.01.09
13
Classifier (Beispiel Knn) Instances wekaInstances = null; Classifier classifier = new IBk(10); try { classifier.setOptions(new String[] {"-K", "3"}); classifier.buildClassifier(wekaInstances); } catch (Exception e) { }
05.01.09
14
Evaluation ●
z. B. für 10-fold cv ●
weka.classifiers.Evaluation
Instances wekaInstances = load "iris.arff"; Evaluation eval = new Evaluation(wekaInstances); Classifier classifier = new IBk(3); eval.crossValidateModel(classifier, wekaInstances, 10, new Random()); System.out.println(eval.toSummaryString());
05.01.09
15
Evaluation === Confusion Matrix === a b c