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 <-- classified as 50 0 0 | a = Iris-setosa 0 50 0 | b = Iris-versicolor 0 4 46 | c = Iris-virginica Correctly Classified Instances Incorrectly Classified Instances Kappa statistic Mean absolute error Root mean squared error Relative absolute error Root relative squared error Total Number of Instances 05.01.09 Precision? 146 97.3333 % 4 2.6667 % 0.96 0.0363 0.1146 8.1683 % 24.3129 % 150 Recall? Accuracy? F1-Measure? 16 Evaluation Jedes (Standard-)Fehlermaß hat eigene Methoden: ● fMeasure(int classIndex) ● recall(int classIndex) ● … ● auch: ● numTrueNegatives(int classIndex) ● numTruePositives(int classIndex) ● 05.01.09 17 Alternativen zu WEKA? MinorThird ● http://minorthird.sourceforge.net/ ●Java Machine Learning Library ● (mit Anbindung an WEKA) ● http://java-ml.sourceforge.net/ ● Sogar eine JSR: ● JSR 73: Data Mining API ● http://jcp.org/en/jsr/detail?id=73 ● ● 05.01.09 18