SVM und Künstliche Neuronale Netzwerke mit Datenanalyse (Stefan Bosse) [7.2024]

Übung 6 - SVM und Künstliche Neuronale Netzwerke mit Datenanalyse

Übung 6 - SVM und Künstliche Neuronale Netzwerke mit Datenanalyse
Vorwort
Literatur
Daten
Bewertung eines Klassifikators
Accuracy
Precision
Recall
Specificity
F1 Score
Gesamtfehler
Konfusionsmatrix
Support Vector Machine
Beispiel
SVM mit Iris Datensatz
Klassifikation von ProMat Datensatz mit SVM
KNN (MLP)
Beispiel
Das EXOR Problem
Klassifikation von ProMat Datensatz mit KNN

Vorwort

Bitte folgenden Code ausführen um notwendige Bibliotheken zu laden. Nicht erforderlich bei nativer R Software (außer "entropy").

Es kann ein Hintergrundprozess gestartet werden (hier WebWorker). Dazu die folgende Zeile mit dem Worker Code auskommentieren.


R Set-up

 ▸ 
[]
 ✗ 
 ≡ 

Literatur

Daten

DATA: Variable dataIRIS Type: { length : number, width : number, petal.length : number, petal.width : number, species : string } [151]

DATA: Variable dataProMat Type: { Schichtdicke : number, Laserleistung : number, Scangeschwindigkeit : number, Hatchabstand : number, Aufbaurate : number, Dichte : number } [325]

Der Datensatz ist bereits im Notebook enthalten und wird als Datenrahmen (data.frame) data.iris zur Verfügung gestellt!

Alle nachfolgenden berechnungen sollen über den Punkt "." an den Namen des Datensatzes angehängt werden.


Zusammenfassung der Datensätze

 ▸ 
[]
 ✗ 
 ≡ 

Bewertung eines Klassifikators

Vertiefung: https://artemoppermann.com/de/accuracy-precision-recall-f1-score-und-specificity/

Ein diskreter Klassifikator kann mittels der Konfusionsmatrix bewertet werden. Die Konfusionmatrix besteht aus Spalten und Zeilen. Die Zeilen entsprechen dem Referenzwert einer Dateninstanz (also das Groundtruth Ergebnis der Zielvariable), die Spalten entsprechen dem tatsächlich klassifizierten Werte (Prädiktion).

Aus der Konfusionsmatrix (KM) lassen sich wichtige statistische Parameter ableiten:

True Positive
Der TP Vektor gibt für jede Klasse die richtig klassifizierten Werte an (absolut) und ist das jeweilige Diagonalelement in der KM
False Postive
Der FP Vektor gibt für jede Klasse i die falsch-positiven Antworten an, d.h., es sollte Klasse "setosa" klassifiziert werden, aber es wurde tatsächlich "Virginica" klassifiziert, d.h. FP["Virginica"]=1. Das ist gerade die Summe aller Werte in der i-ten Spalte ohne das Diagonalelement. (Typ I Fehler)
False Negative
Der FN Vektor gibt für jede Klasse i die falsh-negativen Antworten an. Das ist gerade die Summe aller Werte in der i-ten Zeile ohne Diagonalelement. (Typ II Fehler)
True Negative
Der TN Vektor ist die Summe aller Elemente aus allen Zeilen ohne i-te Zeile und ohne i-te Spalte

Richtig positive und richtig negative Werte bedeuten, dass der vorhergesagte Wert mit dem tatsächlichen Wert übereinstimmt. Ein Fehler vom Typ I tritt auf, wenn das Modell eine falsche Vorhersage macht, d.h., das für einen tatsächlichen negativen Wert ein positiver vorhergesagt wurde. Ein Typ-II-Fehler tritt auf, wenn das Modell einen tatsächlichen positiven Wert falsch als negativ vorhersagt.

Die Summer der obigen Vektoren kann zur Berechung von der Accuracy, Precision, dem Recall und F1-Score herangezogen werden:

Accuracy

Die Accuracy gibt den Anteil der korrekt gemachten Vorhersagen eines Modells an. Sinnvolle Masszahl wenn Klassen ausgewogen sind.

\[ \text{Acc}=\frac{{\text{TP}+\text{TN}}}{{\text{TP}+\text{TN}+\text{FP}+\text{FN}}} \]

Die Accuracy eines Klassifikationsmodells ist nicht immer aussagekräftig. Unausgewogene Datensätze ein sehr häufiges Problem im Bereich von Data Science und datengetriebener Modellierung.

Precision

Eine weitere sehr wichtige Bewertungsmetrik ist die Precision. Die Precision gibt das Verhältnis der wahren positiven Ergebnisse an, die vom Modell korrekt vorhergesagt wurden. Die Precision versucht, die folgende Frage zu beantworten: Wie viele der positiven Ergebnisse wurden von dem Modell richtig vorhergesagt? Wird als Bewertungsmetrik verwendet, wenn man sehr sicher sein will, dass die positive Vorhersage korrekt ist.

\[ \text{Prec}=\frac{\text{TP}}{{\text{TP}+\text{FP}}} \]

Recall

Der Recall, auch Sensitivität genannt, ist eine Metrik, die uns sagt, wie gut das Modell in der Lage ist positive Ergebnisse zu identifizieren. Man wird den Recall für die Leistungsbewertung eines Modells verwenden, wenn so viele positive Ergebnisse wie möglich identifizieren werden sollen.

\[ \text{Rec}=\frac{\text{TP}}{{\text{TP}+\text{FN}}} \]

Specificity

Die Spezifität ist eine Bewertungskennzahl, die als das Gegenteil von dem Recall betrachtet werden kann. Die Spezifität gibt das Verhältnis der korrekt identifizierten negativen Instanzen zu allen negativen Instanzen im Datensatz an.

\[ \text{Spec}=\frac{\text{TN}}{{\text{TN}+\text{FP}}} \]

F1 Score

Der F1-Score ist eine Bewertungsmetrik, die sowohl den Recall als auch die Precision eines Modells kombiniert. Genauer gesagt ist der F1-Score ein harmonisches Mittel aus beiden Metriken. Diese Metrik wurde eingeführt, um die Leistung eines Modells zu messen, ohne explizit Recall- und Precision anzugeben, sondern um sie in einer einzigen Metrik zu kombinieren.

\[ \text{F1}={2}\cdot\frac{{\text{Prec}\cdot\text{Rec}}}{{\text{Prec}+\text{Rec}}} \]

Gesamtfehler

Der Gesamtfehler gibt die Anzahl der falsch vorhergesagten Ergebnisse im verhältnis zu der Gesamtzahl aller Vorhersagen an. Der Gesamtfehler kann immer angegeben werden (auch bei Multiklassenproblemen) und bietet eine erste Beurteilung der Modellgenauigkeit.

\[ \text{error(M,D(x,y))}=\frac{{1}}{{N}}\sum_{{i}}{y}_{{i}}\ne{M}{\left({x}_{{i}}\right)} \]

Konfusionsmatrix

Bei der Vorhersage einer Klasse können die vorherigen Maßzahlen direkt berechnet werden. Bei Multiklassenproblemen wird die Berechnung vorheriger Maßzahlen komplizierter. Einen einfachen Überblick über die Modellqualität insbesondere bei Multiklassenproblemen bietet die Konfusionsmatrix bzw. Tabelle.


Konfusionamatrix und Klassifikationsanalyse: data=Ausgabe des Modells (Vorhewrsage), reference=Erwartungswerte.

 ▸ 
[]
 ✗ 
 ≡ 

Support Vector Machine

Die SVM kann wie folgt parametrisiert werden:

Hier kann direkt die Datentabelle mit kategorischen Zielvariablen verwendet werden. Die Labels können automatisch berechnet werden. Für jede Klasse (Wert der Zielvariable) wird eine eigene SVM erzeugt (Multiklassen SVM).

Der C-Hyperparameter teilt der SVM-Optimierung mit, inwieweit Sie eine Fehlklassifizierung jedes Trainingsbeispiels vermeiden soll. Bei großen Werten von C wählt die Optimierung eine Hyperebene mit kleinerem Rand, wenn diese Hyperebene besser alle Trainingspunkte korrekt klassifiziert. Umgekehrt führt ein sehr kleiner Wert von C dazu, dass der Optimierer nach einer trennenden Hyperebene mit größerem Rand sucht, selbst wenn diese Hyperebene mehr Punkte falsch klassifiziert. Für sehr kleine Werte von C wird man falsch klassifizierte Beispiele erhalten, oft auch wenn die Trainingsdaten linear trennbar sind.

Der Parameter tol ist eine Einstellung für die SVM-Toleranz bei der Optimierung

Die alpha Koeffizienten bestimmen, welche Stichproben aus dem Trainingssatz als Unterstützungsvektoren zu betrachten sind und so in das Inferenzverfahren einbezogen werden. Dieser Wert verwirft Unterstützungsvektoren mit einem Alpha, das zu klein ist, um erkennbar zu sein.

Der Parameter max.iter legt eine Obergrenze für die Anzahl der Iterationen fest, die der Algorithmus ausführen kann, um zu konvergieren, max.passes legt die maximale Anzahl von Runden fest, um über α zu iterieren, ohne (nennendswerte) Veränderung der Anpassung.

Schließlich kann auch der Kernel (die anzupassende Trennfunktion) gewählt werden:

Beispiel


SVM mit nichtlinearen Kernel

 ▸ 
[]
 ✗ 
 ≡ 

SVM mit Iris Datensatz

Bei einer Multiklassen SVM erhält man bei der Inferenz einer Datentabelle (value,score) zurück. Der Wert ist das Klassenlabel derjenigen SVM, die den größten Wert bei der Inferenz ausgab (kann auch negativ sein!).


SVM für das Iris Klassifikationsproblem

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe. Analysiere obige SVM für verschiedene Parameter (threshold, C, alpha.tol, max.passes, max.iterastions). Trage die Ergebnisse zusammen. Erstelle tabelleraisch eine Konfusionmatrix. Ist eine Binarisierung (threshold=0 z.B.) sinnvoll?

Aufgabe. Verändere den Kernel (z.B. polynomial). Was ändert sich bei der Genauigkeit/Fehler (mit und ohne Binarisierung via threshold)?

Aufgabe. Teile die Datentablle in Trainings- und Testdaten und wiederhole das obige Experiment mit geeigneten Parametern. Erweitere obiges Beispiel mit Trennung von Trainings- und Testdaten (d.h. Training mit data.iris.train, Test mit data.iris.test. Trage unten die Ergebnisse der Klassifikationsanalyse ein.


SVM für das Iris Klassifikationsproblem

 ▸ 
[]
 ✗ 
 ≡ 

Klassifikation von ProMat Datensatz mit SVM

Es soll die Dichte des Materials anhand der Prozessparemeter vorhergesagt werden. Um es auf ein Klassifikationsproblem zu reduzieren soll zunächst der Datensatz in Instanzen "High Quality" (Dichte > 95%) und "Low Quality" (Dichte < 85%), und "Mid Quality" dazwischen unterteilt werden.

Die Intervalldiskretisierung der Zielvariable Dichte wird hier mit einer custom Funktion discretize aus dem encode Paket durchgeführt.


ProMat SVM

 ▸ 
[]
 ✗ 
 ≡ 

Hier wird zunächst aufgrund des kleinen Datensatzes die gesamte Datentabelle für Training und Test verwendet.

Aufgabe. Werte das Ergebnis für die gesamte Datentabelle aus (Konfusionmatrix und Gesamtfehler). Verändere die Modellparameter und den Kernel.

Aufgabe. Teile die Datentablle in Trainings- und Testdaten und wiederhole das obige Experiment mit geeigneten Parametern. Erweitere obiges Beispiel mit Trennung von Trainings- und Testdaten (d.h. Training mit data.iris.train, Test mit data.iris.test. Trage unten die Ergebnisse der Klassifikationsanalyse ein.


SVM für das ProMat Klassifikationsproblem mit getrennten Trainings- und Testdaten

 ▸ 
[]
 ✗ 
 ≡ 

KNN (MLP)

Es wird die Implementierung von Joon-Ku Kang verwendet mit einfacher (nicht parametrisierter) Δ Anapssung der Gewichte und der Bias Werte der Neuronen. Der gesamte Trainingsalgorithmus besteht aus weniger als 100 Zeilen Programmkode und gehört zu den einfachsten Implementierungen. Es werden nur Matrizen mit der gesamten Trainingsdatentabelle berechnet, die iterativ Korrekturwerte für Gewichte und Bias liefern. Es gibt keine Lernrate (Einfluß des Fehlers auf Anpassung der Modellparamater).

Quellen:

https://github.com/junku901/machine_learning

Der MLP Algorithmus ist sehr sensitiv auf nicht normierte Eingabedaten (Bereich 0-1), d.h., er konvergiert u.U. nicht!

In R steht das neuralnet Paket für KNN zur Verfügung.

Anders als bei der SVM und Entscheidungsbäumen ist hier die Modellerstellung und das Training getrennet. Das Training kann iterativ wiederholt werden und verändert das Modell.

Beispiel


KNN mit zwei Eingangsneuronen, zwei verdeckten, und zwei Ausgangsneuronen

 ▸ 
[]
 ✗ 
 ≡ 

Optional können die zu erwartetenden Werte der Zielvariable (labels) angegeben werden. Diese können ganz einfach mut der unique(x) Funktion berechnet werden (liefert einen Vektor mit den unterscheidbaren Werte von x).

Das EXOR Problem


Löse das XOR Problem!

 ▸ 
[]
 ✗ 
 ≡ 

Frage. Wie viele Epochen (Anpassungsiterationen) werden hier mindestens benötigt damit der Trainer eine brauchbare Lösung findet?

Klassifikation von ProMat Datensatz mit KNN

Es soll die Dichte des Materials anhand der Prozessparemeter vorhergesagt werden. Um es auf ein Klassifikationsproblem zu reduzieren soll zunächst der Datensatz in Instanzen "High Quality" (Dichte > 95%) und "Low Quality" (Dicht < 96%) unterteilt werden. Da der MLP Trainer sehr einfach und nicht adpativ ist (wie z.B. bei dem adam Optimierer), müssen die Eingabedaten auf den Wertebereich 0-1 (ungefähr) normalisiert werden.


ProMat KNN

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe. Werte das Ergebnis für die gesamte Datentabelle aus (Konfusionmatrix usw.). Vergleiche das Ergebnis mit der nicht normierten Datentabelle (setze dazu data.promat.scaled=data.promat). Verändere die Anzahl der inneren Neuronen (es können auch Layer hinzugefügt werden), finde eine geeignet Anzahl von Epochen. Notiere die Ergebnisse. Trainiere aber zuerst das Modell mit dem nicht normierten Datensatz. Ergebnis (schlecht)?

Aufgabe. Führe die Normierung automtaisch durch. Die obigen Skalierungswerte waren nur grob geschätzt worden. Es reicht die Bestimmung des Maximums einer jeweiligen Datenvariable, also z.B. Schichtdicke.max=max(data.promat$data.promat). Ersetze die zahlen in der Skalierungsfunktion mit den auotmatisch bestimmten Maximalwerten und führe Training/Test noch einmal durch.

Aufgabe. Teile die Datentablle in Trainings- und Testdaten und wiederhole das obige Experiment mit geeigneten Parametern. Erweitere obiges Beispiel mit Trennung von Trainings- und Testdaten (d.h. Training mit data.promat.train, Test mit data.promat.test. Trage unten die Ergebnisse der Klassifikationsanalyse ein.


SVM für das ProMat Klassifikationsproblemmit Trainings- und Testdaten

 ▸ 
[]
 ✗ 
 ≡ 



Hilfe



Einreichung (Assignment #01-89790 )



Prüfen



Bewerten (Lehrer)




Created by the NoteBook Compiler Ver. 1.27.2 (c) Dr. Stefan Bosse (Tue Jul 16 2024 13:23:08 GMT+0200 (Central European Summer Time))