• Keine Ergebnisse gefunden

Sequential Floating Forward Search

Hinter der Idee des Sequential Floating Forward Search Algorithmus (SFFS) steckt der Versuch, die Vorw¨artssuche derart zu modifizieren, daß auch Merkmalskombi-nationen auftreten k¨onnen, die in zweitgenanntem Verfahren nicht erreicht werden.

Dies verhindert den Effekt, daß zuerst optimal erscheinende Merkmale das Ergeb-nis im sp¨ateren Verlauf wieder verschlechtern, d.h. in Kombination keine geeignete Auswahl darstellen. Man bezeichnet diesen Effekt als

”Nesting“. Bei gew¨ohnlichen Vorw¨artssuchverfahren f¨uhrt dies dazu, daß der Klassifikationsfehler auf subopti-malem Niveau stagniert, da hier einmal gew¨ahlte Merkmale nicht mehr zur¨ uckge-nommen werden k¨onnen.

Der SFFS Algorithmus soll dies verhindern, indem R¨uckw¨artschritte eingef¨uhrt wer-den, die daf¨ur verantwortlich sind, daß Merkmale, die das Ergebnis verschlechtern, wieder aus der Auswahl entfernt werden.

Hierbei wird nach jeder Merkmalshinzunahme auf m¨ogliche R¨uckw¨artsschritte ge-testet. Hierzu wird das Ergebnis der Merkmalsauswahl mit dem der reduzierten Auswahl verglichen. Ist das Ergebnis der reduzierten Auswahl besser, so wird die Reduktion durchgef¨uhrt und das Ergebnis wiederum mit dem einer nochmal re-duzierten Auswahl verglichen. Dieser Vorgang wird solange wiederholt, bis keine Verbesserung des Ergebnisses durch Reduktion mehr erzielt wird. Nach Durchlau-fen der R¨uckw¨artsschritte wird wieder ein Merkmal hinzugef¨ugt, und der Ablauf beginnt erneut. Dies geschieht solange, bis die optimale Merkmalskombination ge-funden wurde, d.h. keine Verbesserung des Ergebnisses durch Hinzunehmen oder Wegnehmen eines Merkmals mehr auftritt. Der schematische Ablauf der Kernfunk-tion der SFFS-Klasse wird aus Abbildung 3.4 ersichtlich. Eine Beschreibung des Algorithmus in Pseudocode liefert Abb. 3.5.

Aufgrund der nicht statisch festgelegten Anzahl der R¨uckw¨artsschritte z¨ahlt der Algorithmus zu den Floating-Search-Verfahren. Es bedarf keiner Parametereinstel-lungen vor dem Start, bis auf die maximal Menge der gew¨unschten Merkmale. Bei der Implementierung ist darauf zu achten, daß Endlosschleifen vermieden werden, was speziell dann passiert, wenn ein soeben hinzugef¨ugtes Merkmal sofort wieder entfernt wird. Allgemein l¨aßt sich feststellen, daß keine Selektionszust¨ande erreicht werden d¨urfen, in denen man sich vorher schon einmal befand.

Dies ist umsetzbar, indem alle Merkmalsmengen gespeichert und beim Bilden einer neuen mit dieser verglichen werden. Bei einer ¨Ubereinstimmung wird nach einer neuen - noch nicht vorhandenen - Merkmalsmenge gesucht.

Die Funktionalit¨at wurde dahingehend erweitert, als daß nach jedem Durchlauf die Fehlerwerte verglichen werden. Falls sich keine Verbesserung einstellt, die einen ein-stellbaren Wert (m delta) ¨ubersteigt, wird der Algorithmus beendet. Dies soll dazu f¨uhren, daß unverh¨altnism¨aßig lange Laufzeiten vermieden werden. Eine Verbesse-rung im Hunderstel- oder Tausendstelbereich der Fehlerrate ist nicht wirklich von Belang, wenn die Laufzeit daf¨ur massiv ansteigt.

Der Algorithmus gilt nach [Kudo & Sklansky, 1999] als pr¨adestiniert f¨ur Klassifi-kationsprobleme kleinerer bis mittlerer Art. Bei hochkomplexen Problemen wird er durch genetische Algorithmen ausgestochen, die jedoch eine wesentlich l¨angere Laufzeit ben¨otigten.

3.7.1 Testfunktion

Die Testfunktion dient dazu, f¨ur eine ¨ubergebene Menge an Klassifikationsattributen eine Fehlerklassifikationsrate festzustellen und diese zur¨uckzugeben. In [Picard, 2001]

wurde als Testfunktion eink-NN Algorithmus verwendet. Im Rahmen dieser Arbeit

Abbildung 3.4: Ablauf: Sequential Floating Forward Search

wurde im Gegensatz dazu der Schwerpunkt auf Bayes’sche Netze gelegt, da diese auch im Rahmen des Sensorboards genutzt werden. Zur besseren Vergleichsm¨oglich-keit wurde die Testfunktion so implementiert, daß verschiedene Klassifikationsal-gorithmen genutzt werden k¨onnen. Hierzu wurden folgende Funktionen aus dem Weka-Packet benutzt:

• Naive Bayes

• Bayes Network

• J48

Bei Aufruf der Funktion wird die eingestellte Klassifizierungsfunktion aufgerufen und der durchschnittliche absolute Fehler (engl. mean absolute error) ausgelesen und an die SFFS-Routine zur¨uckgegeben.

Analog zu [Picard, 2001] besteht jedoch die M¨oglichkeit, die vom SFFS vorselek-tierten Daten in die Fisherprojektion zu geben. Dadurch ergibt sich ein hybride Funktion aus SFFS und Fisherprojektion (vgl. 3.8).

SFFS Algorithmus

Eingabe: Y ={yj |j= 1, . . . , D}, ∆ϕ

Ausgabe: Xk={xj | j= 1, . . . , k; xj∈Y}, k= 0,1, . . . , D Initialisierung: X0:=∅; k:= 0

Terminierung: Ende, wennkder gew¨unschten Anzahl Attribute entspricht oder die Verbesserung des Klassifikationsfehlers ∆ϕ unter-schreitet.

Schritt 1(Inklusion) x+:= argmin

x∈Y −XkT est(Xk+x) Xk+1 :=Xk+x+; k:=k+ 1 Schritt 2(Exklusion)

x:= argmin

x∈XkT est(Xk−x)

if T est(Xk− {x})> T est(Xk1)then Xk1:=Xk−x; k:=k−1

gehe zuSchritt 2 else

gehe zuSchritt 1

Abbildung 3.5: Eine Darstellung des Sequential Floating Forward Search Algorith-mus in Pseudocode

Testfunktion des SFFS Algorithmus Eingabe: Xk={xj | j= 1, . . . , k}

Ausgabe: ϕ(Xk)

Schritt 1

switchcaseKlassif ikationsalgorithmus starte Kreuzvalidierung

Schritt 2

ϕ(Xk) :=ϕ(Klassif ikationsalgorithmus)

Abbildung 3.6: Die Testfunktion des SFFS-Algorithmus in Pseudocodenotation

3.7.2 Programmierung

Die Umsetzung des Algorithmus erfolgte in der Klasse sffs. Beim Anlegen eines neuen Objektes sind im Konstruktor bereits die zu verwendenden Attribute sowie die Anzahl der maximal gew¨unschten Attribute zu ¨ubergeben. F¨ur einen Datensatz mit 12 Attributen, bei dem das erste ignoriert werden soll, die Attribute 9,11 und 12 Klassenattribute sind sowie maximal 4 Attribute selektiert werden sollen, sieht der Aufruf wie folgt aus:

sffs mySFFS = new sffs("2,3,4,5,6,7,8,10","9,11,12",4);

Der Klassifikationsalgorithmus, welcher von der Testfunktion verwendet werden soll, kann einfach ¨uber die FunktionsetClassifier festgelegt werden. Hierbei sind Werte von 0 bis 2 zul¨assig, welche die einzelnen Klassifikatoren Naive Bayes, Bayes Net undJ48 aktivieren.

mySFFS.setClassifier(0);

Der zu verwendende Datensatz wird als Weka-Instanz ¨ubergeben. Zus¨atzlich dazu ist der Funktion setInstance noch die Zahl der gew¨unschten Folds mitzugeben, da diese f¨ur die Kreuzvalidierung der Daten ben¨otigt wird. Im Rahmen der Arbeit wurde mit einer 6-Fold Kreuzvalidierung gearbeitet.

Instances data = new Instances(...

...

mySFFS.setInstance(data, 6);

Vor dem Durchlaufen des eigentlichen SFFS-Algorithmus, m¨ussen noch verschiedene Parameter eingestellt werden. Dazu z¨ahlt das Setzen des aktuellen Klassenattributes durch die Funktion setClassAttribute, das Aufrufen der FunktioninitRun und die Einstellung der maximal gew¨unschten Attribute via setMaxAttributes.

Im Anschluß kann der Algorithmus mitrunSFFS gestartet werden.

mySFFS.setClassAttribute(7);

mySFFS.initRun();

mySFFS.setMaxAttributes(14);

mySFFS.runSFFS(); // starte SFFS

Die Funktion ben¨otigt je nach gew¨ahltem Klassifikator, Anzahl der Attribute und Gr¨oße der Datenmenge einige Zeit bis zu ihrer Beendigung. Danach k¨onnen die Fehlerrate sowie die selektierten Attribute ausgelesen werden. Zus¨atzlich stehen die Prozents¨atze der korrekt bzw. inkorrekt klassifizierten Daten zur Verf¨ugung.

double fehlerwert = mySFFS.getError();

String attribute = mySFFS.getSelectedAttributes();

double correct = mySFFS.getCorrectly();

double incorrect = mySFFS.getIncorrectly();

Intern unterteilt sich die Funktionalit¨at der Klasse in die FunktionrunSFFS, welche den eigentlichen Algorithmus enth¨alt, und in die TestfunktionTest, die den jeweils gew¨unschten Klassifikationsalgorithmus auf die Daten anwendet und den entspre-chenden Fehlerwert zur¨uckgibt. Daneben existieren einige Hilfsfunktionen, die der Anwendung von Wekafiltern dienen, Mengenoperationen auf Strings durchf¨uhren (union, m) sowie verschiedene andere Zusatzfunktionen erledigen. Die Methode

argmin findet aus einer Liste ¨ubergebener Attribute durch Anwendung der Test-funktion das heraus, welches den besten Klassifikationswert besitzt.

Eine beispielhafte Nutzung der Klasse sffs ist in der Klasse framework implemen-tiert (s. 4.2). Der Quelltext ist im Anhang der Arbeit zu finden (B.2).