SVM und Künstliche Neuronale Netzwerke mit Datenanalyse (Stefan Bosse) [7.2024] |
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.
▸
[] |
✗
≡
|
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.
▸
[] |
✗
≡
|
data.iris
: species
data.promat
: Dichte
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:
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:
Die Accuracy gibt den Anteil der korrekt gemachten Vorhersagen eines Modells an. Sinnvolle Masszahl wenn Klassen ausgewogen sind.
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.
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.
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.
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.
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.
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.
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.
Die Zeilen der Tabelle bezeichnen die vorhergesagten Klassen (yp), die Spalten die erwarteten Klassen (y0). Die Annotation der Zeilen und Spalten können auch vertauscht sein.
Die Zellen der Tabelle enthalten die Anzahl der vorhergesagten Klassen (Experiment).
Bei einer Trefferquote von 100% dürfte nur die Diagonale besetzt sein!
Die Konfusionsmatrix bietet einen klassenspezifische Analyse des Modells - welche Klassen werden schlechter vorhergesagt?
▸
[] |
✗
≡
|
Die SVM kann wie folgt parametrisiert werden:
formula
legt Ein- und Ausgabevariablen in der Datentabelle festC
(1.0), kleinere Werte ergeben höhere Regularisierung beim Trainingtol
(1E-4), numerische Toleranz (sollte nicht verändert werden)alpha.tol
(1E-7), max.passes
(20),max.iterations
(10000),threshold
ist ein optionaler Parameter der zu einer Diskretisierung der Ausgabewerte (-1,1) führt. Wenn dieser Parameter nicht gesetzt ist, werden kontibuierliche Werte ausgegeben.labels
, optionaler Vektor von ZielvariablenwertenHier 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:
{type='linear'}
{type='polynomial',c=1,d=2}
mit d als Polynomexponent (2: quadratisch){type='rbf',sigma=0.5}
{type='gaussian',sigma=0.5}
▸
[] |
✗
≡
|
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!).
▸
[] |
✗
≡
|
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.
▸
[] |
✗
≡
|
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.
▸
[] |
✗
≡
|
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.
▸
[] |
✗
≡
|
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.
Das Modell wird erzeugt mit der mlp(layers=[i,j,k,..])
Funktion. Dabei sind i, j, usw. die Anzahl der Neuronen in der entsprechenden Schicht. Die Anzahl der Shichten kann variiert werden.
Das Training erfolgt in Epochen (Schritten). Die Gesamtzahl der Epochen muss angegeben werden.
▸
[] |
✗
≡
|
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).
▸
[] |
✗
≡
|
Frage. Wie viele Epochen (Anpassungsiterationen) werden hier mindestens benötigt damit der Trainer eine brauchbare Lösung findet?
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.
▸
[] |
✗
≡
|
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.
▸
[] |
✗
≡
|