This is an old revision of the document!
Ziele
- Jede/r kennt was ein Regressions-/Klassifikationsproblem ist
- Jede/r kann eine lineare Regression in Python und mit SciKit durchführen.
- Jede/r kennt die Begriffe Residuen (residuals), residual sum of squares, feature space.
- Jede/r kennt die Begriffe Training- und Testdaten wie auch Evaluationsdaten (training set, evaluation set, test set)f]
- Jede/r kann eine Vorhersage auf Grund von Testdaten machen unter Verwendung von Trainings- und Evaluationsdaten.
- Jede/r kann $k$-nearest neighbour erklären und implementieren.
- Selbst implementieren oder mit
sklearn
implementieren - Das optimale $k$ feststellen.
KW 18
- Slides: Geschichte Machine Learning / AI.
- Padlet mit Fragen (A) und was als nächstes ansteht (B) Bitte hier
KW 17
Ziel
Jede:r startet sein eigenes Projekt.
Auftrag
- Lies den Beschrieb des Projekts durch
- Wähle aus, was du machen möchtest. Bei Interesse können auch weitere resp. andere Daten gewählt werden.
- Strukturiere dein Projekt in Teilziele
- Versuche die Struktur deines Projekts auch im Code abzubilden, das heisst, defiere Zwischenschritte, Funktionen, o.ä. welche deinen Code lesbar und übersichtlich machen.
- Definere bereits Funktionen ohne diese bereits Zeile für Zeile definier zu haben, das heisst, definiere, welche Argumente sie hat und was die Rückgabewerte sind
- Definiere wie du Zwischenschritte überprüfen kannst.
- Besprich die Punkte 3 und 4 mit Ks
Projekt
Jede:r «führt» eine Klassifikationproblem «durch». Dabei sollen folgende Punkte berücksichtigt werden:
- Trainingsdaten und Evaluationsdaten werden verwendet.
- Auf den Evaluationsdaten wird die Güte der Klassifikation wie auch die Konfusionsmatrix ausgewiesen.
- Hat der Klassifikationsalgorithmus einen Hyperparameter (oder Tuningparameter, wie Baumtiefe oder Anzahl Nachbarn) wird der optimale Hyperparameter ebenfalls auf dem Evaluationsset bestimmt.
- Es können bekannte Algorithmen ($k$ nearest neighbor, trees) oder eigene Algorithmen («averaging») verwendet werden.
- Es können die Daten der BU, die Bilddateien des Unterrichts o.ä. verwendet werden.
Abzugeben ist ein Markdown-Dokument mit
- kurzem Beschrieb, welches Problem gelöst worden ist.
- den wichtigsten Code-Zeilen in Markdown mit ggf. Erklärungen.
- einem sinnvollen Bild als Illustration.
- der Antwort auf die Frage «Was wäre ich froh gewesen, hätte ich schon vorm Projektende gewusst» («I wish I had known before»).
Das ganze ist in einer mit Code und Daten als lauffähiges Programm in https://github.com/monsieurknos/efmachinelearning in einem Ordner mit Bezeichnung Nachname
abzulegen.
Relevant für die Bewertung sind:
- Eigenleistung (eigene Implementation wird höher bewertet)
- Korrektheit des Codes
- Kommentare und Struktur des Codes
- Saubere Darstellung im Markdown-Dokument.
KW14
Jede:r implementiert $k$-nearest neighbors für ein $p$-dimensionales Problem. Die $p$ Dimensionen können
- die Features der Buchstaben aus der BU sein oder
- die Pixelfarben in Graufstufen des MNIST-Datensatzes
sein. Für beide Probleme ist es zentral, dass alle Features normiert werden, dass heisst, die Werte der Features werden so skaliert und verschoben, dass sie auf das Intervall $[-1,1]$ zu liegen kommen.
Hinweise Features BU
Der Datensatz kann aus der BU von git übernommen werden.
Hinweise MNIST Datensatz
Der MNIST-Ziffern-Datensatz ist ein «Standarddatensatz» in der Machinelearning-Community. Wir arbeiten deswegen auch mit diesem. Standardmässig sind die Ziffern als Bilddateien verfügbar. Zwischenschritte:
- ZIP-Code Problematik verstehen: ZIP-Code → Ziffer → 16×16 Bild → Liste mit 256 Graustufen-Werten → kNN in $\mathbb{R}^{256}$.
- Die Idee sollte sein, das Problem resp. Programm in zwei Teile zu strukturieren
- Einlesen der Bilddateien und generieren der Liste resp. CSV-Datei
- Verwenden von $k$ nearest neighbors wie gehabt auf Grund einer erstellten Liste resp. CSV-Datei.
- Einzelne Ziffern als Bilddateien als ZIP einlesen und als 256 Zahlwerte pro Bild als Liste speichern:
- Eine Funktion schreiben, die als Argument einen Dateinamen hat und als Rückgabewert eine Liste mit 256 Elementen.
- Diese Funktion auf alle Dateien anwenden (siehe unten) und die Ziffer aus dem Dateinamen in eine Liste von Liste mit 256+1 (Farbwerte+Ziffer) Elementen speichern.
Code Hinweise
- Konvertierung der Bild-Dateien zu Zahlwerten
- Bilder können in mit
skimage
mit imread eingelesen werden. Stelle sicher, dass du die Funktion resp. Dokumentation der Funktion verstehst. - Verzeichnisse können mit os.listdir() durchlaufen werden:
- listdir.py
import os for filename in os.listdir("C:/temp/"): print(filename)
- Mit
filename.split('_', 3)
kann der String “filename” aufgeteilt ("gesplitted") werden, die 3 steht dabei für das Dritte Element nach dem Split in der Liste und entspricht der Ziffer. - Die Graustufenwerte von 0 bis 255 sollten auf Werte zwischen -1 und 1 “umgelegt” werden.
- Ziel ist eine Liste mit 256 + 1 Einträgen pro Bilddatei. Diese Liste könnte dann wieder als CSV Datei gespeichert werden.
- Speicherung als CSV passiert am einfachsten über CSV schreiben:
- writecsv.py
import csv * outcsv = open("C:/temp/outfile.csv", 'a'); # CSV-writer konfigurieren. writer = csv.writer(outcsv, delimiter=',', lineterminator='\n') for item in datalist: #Jeden Eintrag der Datalist als Zeile ausgeben writer.writerow([item[0], item[1], item[2]]) # Wrtier schliessen outcsv.close()
Lösungen
KW13
Aufträge
Jede:r implementiert $k$-nearest neighbors für ein zwei-dimensionales Problem (s.u.) und dokumentiert den Algorithmus in Markdown mit diesen Daten.
Markdown
- Beispieldokument: Achtung, zuerst entzippen.
.md
ist die Markdown-Datei. - Pandoc (GPL Licence)
- Dillinger (MIT Licence)
$k$-nearest neighbours
Bei $k$ nearest neighbours (kNN) geht es darum, einem dazukommenden Punkt diese Klasse zuzuweisen, welche die nächsten $k$-Punkte mehrheitlich haben. Der Trainingsdatensatz sind damit alle Punkte, von welchem man die Klasse und Koordinaten kennt. Auf Grund dieser Klassen und Koordinaten wird einem neuen Datenpunkt einzig auf Grund der Koordinaten eine Klasse zugeordnet.
Ziel
Den $k$-nearest-neighbour Algorithmus in $\mathbb{R}^2$ implementieren.
Wichtige Zutaten: Basic Python
- Liste mit Klassen und Distanzen, i.e.
[[1,0.033131],[0,0.123131],[1,0.123124141],[0,1.2123141]]
- Sortieren dieser Liste um die $k$ nächsten Nachbarn resp. deren Klasse zu bestimmen:
- Sortieren von Listen kann mit Python mit sorted gelöst werden. Speziell für unseren Fall ist “Example 3” spannend.
- Auf Grund der sortierted Liste kann die Mehrheitsmeinung der $k$ nächsten Nachbarn bestimmt werden
Empfehlung: Mindestens zwei Funktionen definieren. Eine zur Berechnugn der Distanz-Klassen-Liste, eine zur Zuweisung der Klasse (0 oder 1).
Wichtige Zutaten: Numpy
Mit numpy
kann das ganze sehr effizient gelöst werden (siehe z.B. auch CheatSheet für «slicing», oben rechts: CheatSheet)
- Sind
a
undb
numpy-Vektoren, kann die Distanz (elementweise) als((a-x)**2+(b-y)**2)**0.5
berechnet werden.
Einen zweidimensionalen Array mit numpy
erstellen: Die Distanzen können vektoriell berechnet werden. Dann mit argsort den Array umbauen, um dann mit bincount die Mehrheitsmeinung festzustellen.
KW 10
Gradient Descent
Im Fall der linearen Regression lassen sich die Koeffizienten explizit berechnen. Dies ist allerdings nicht immer der Fall: Gelingt es nicht, das Maximum oder Minimum einer Funktion analytisch zu bestimmen, kann man immer versuchen, dieses numerisch zu bestimmen. Dazu verwendet man den sogenannten Gradienten.
Der Gradient einer Funktion, ist die der Vektor, welche die Ableitung in jede Richtung als Komponenten enthält. Ist $f:\mathbb{R}^p\rightarrow \mathbb{R}$, dann ist \[ \nabla f= [\frac{\partial f}{\partial x_1},\;\frac{\partial f}{\partial x_2},\cdots, \frac{\partial f}{\partial x_p}]^T. \] Der Gradient von $f$ hat die wichtige Eigenschaft, dass er immer die Richtung des grössten Zuwachses angibt. Diese Eigenschaft wird ausgenutzt, um dann eben die Richtung der Stärksten Abnahme, $-\nabla f$ zu bestimmen und in diese Richtung ein Minimum zu suchen.1)
Beispiel
Ist $f(x,y)=(x-2)^2+(y+1)^2$ so ist $\nabla f =[2x-4,\;2y+2]^T$. Damit ist z.B. die Richtung der stärksten Zunahme an der Stelle $[3,-3]^T$ $[2\cdot 3-4,\;2\cdot(-3)+2]^T=[2,-4]^T$.
Möchte man jetzt das Minimum numerisch finden, kann man vom Startpunkt $[3,-3]^T$ aus ein Vielfaches $\gamma$ des negativen Gradienten dazuzählen, um dem Minimum näher zu kommen:
- Wähle einen Startpunkt $v_0$, z.B. $v_0=[3,-3]^T$
- $v_{t+1}=v_t-\gamma \cdot \nabla f$, z.B. mit $\gamma=\frac 14$ und $v_1=v_0-\frac{1}{4}\cdot [2,-4]=[1.5,-3]$
Die Schlaufe kann fortgesetzt werden, bis sich der Wert von $f$ an der aktuellen Stelle nicht mehr zu stark ändert.
Aufgaben Gradient Descent
Nimm für die folgenden Aufgaben die Funktion $f(x,y)=2\cdot(x-3)^2+(y+2)^2$. Du kannst auch diese Geogebra-Datei als Hilfestellung oder als Link verwenden.
- Zeichne einen «contour plot» für $f$. Wähle mindestens drei verschiedene Niveaus für die Niveaulininien
- Contourplot können mit Geogebra (
Folge(f(x, y) = m, m, 1, 20, 2)
) erstellt werden. - Berechne einen Gradienten in einem Punkt, welcher auf einer gezeichneten Niveaulinie liegt. Zeichne den Gradienten als Vektor angehängt in diesem Punkt ein. Wähle einen anderen Punkt und mache dasselbe? Was fällt auf?
- Berechne zwei Schritte des «gradient descent»-Verfahren von Hand und trage diese im «contour plot» oben ein.
- Implementiere den Gradient «gradient descent» für die Funktion $f(x,y)=(x-2)^2+(y+1)^2$ in Python.
- Wähle ein Funktion mit mehr als einem Minimum und lasse den «gradient descent» Algorithmus das Minimum findet. Was passiert?
- Bestimme $\alpha$ und $\beta$ mit dem «gradient descent» Algorithmus. Wähle dabei ein Beispiel mit einer Variable $Y=\beta\cdot X+\alpha+\varepsilon$.
- Standardisiere2) die Beobachtungen zuerst, sonst kommt es zu numerischen Problemen.
- Verwende für das Beispiel zuerst nur z.B. 50 Datensätze und vergleiche die Lösung mit der scikit Lösung.
- Führe die Rechnung mit allen Datensätzen durch und vergleiche wiederum die Lösung mit der scikit Lösung.
KW 8
Ziele
- Jede:r hat funktionierenden Code für das einfache Regressionsproblem («welches ist die beste Variable um den Preis vorherzusagen?»)
- Jede:r bearbeitet ein weiteres Problemfeld von Regressionsproblem: Optimierung («gradient descent») oder multivariate lineare Regression.
Aufräge
- Eigenen, bisherigen, Code abschliessen.
- Theorie zu multivariater Regression oder Gradient Descent durcharbeiten und
Theorie multivariate lineare Regression
Wie bereits in der ersten Woche erläutert, ist das Modell $y_i=\alpha+\beta x_i+\epsilon_i$ häufig zu einfach. Man möchte mehrere Variablen verwenden, um Vorhersagen über den möglichen Wert $\hat y_i$ zu machen: Das Modell wird dann zu \[ Y=\alpha+\beta_1X_1+\beta_2X_2+\cdots +\beta_pX_p. \] Um die Parameter (resp. das Modell) zu bestimmen, betrachtet man wiederum die Summe der quadrierten Abstände und sucht $\alpha,\beta_1,\ldots,\beta_p$, so dass eben die Summe der quadrierten Abstände minimal ist.
Von der Überlegung her, suchen wir also wieder $\alpha,\beta_1,\ldots,\beta_p$ so, dass \[ \sum_{i=1}^n (y_i-\alpha-\beta_1 x_i^1-\cdots-\beta_px_i^p)^2 \] minimal ist. Dies kann – theoretisch – wieder via Ableiten und Nullsetzen passieren. 3)
Praktisch wird es aber häufig über Matrizenmultiplikation gelöst (orthogonale Projektion).
Für unsere Zwecke genügen die Resultate dieser Herleitung: Es ist \[ \mathbf{\beta} = \begin{bmatrix} \alpha \\ \beta_1 \\ \beta_2 \\ \vdots\\ \beta_p \end{bmatrix} = (\mathbf{X}^{T}\mathbf{X} )^{-1}\mathbf {X}^{T} \mathbf y \] wobei \[ X= \begin{bmatrix} 1& x_{1}^1 & x_{1}^2 & \cdots & x_{1}^j & \cdots & x_{1}^p\\ 1& x_{2}^1 & x_{2}^2 & \cdots & x_{2}^j & \cdots & x_{2}^p\\ \vdots & \vdots & \ddots & \vdots & \ddots & \vdots\\ 1&x_{i1} & x_{i}^2 & \cdots & x_{i}^j & \cdots & x_{i}^p\\ \vdots & \vdots & \ddots & \vdots & \ddots & \vdots\\ 1& x_{n}^1 & x_{n}^2 & \cdots & x_{n}^j & \cdots & x_{n}^p \end{bmatrix} \text{ und } y = \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_i \\ \vdots \\ y_n \end{bmatrix} \] mit $X$ einer $(n \times (p+1))$ Matrix, $y$ ein $n\times 1$ Vektor (Matrix).
Manuell
In NumPy können transpose und inverse verwendet werden: Transpose und Inverse. Matrizenmultiplikation erfolgt mit Matmul.
SciKit
Mit SciKit können mehrere Features (z.B. Alter und Kilometer) ebenfalls verwendet werden
- | scikit_regression.py
#relevante spalten auswählen x = np.asarray([data[:,6],data[:,8]]).transpose() y = data[:,7] reg = LinearRegression(fit_intercept=True).fit(x, y)
Aufgaben multivariate Regression
- Finde ein Modell mit drei oder mehr vorhersagenden Variablen, welche den Preis von diesen Autos am besten vorhersagen. Gehe dabei wie folgt vor:
- Suche eine Variable, welche den Preis am besten erklärt (bereits gemacht)
- Finde eine nächste Variable, welche zusammen mit der gefundenen Variable den Preis am besten erklärt.
Diese Method nennt man auch forward selection um eine optimale Teilmenge (best subset) zu finden.
KW 7
Ziele
Das Ziel dieser Sitzung ist es, ein eigenes Modell zu «trainieren». In diesem Kontext heisst trainieren, das richtige Feature ($x$; Prädiktor) resp. die richtigen Features auszuwählen, um eine Vorhersage für den Preis zu machen.
- Einen Datensatz in Trainings- und Evaluationsdaten zu unterteilen mit
numpy
- Die Modelvorhersagen zu berechnen wie auch die Vorhersagen aus dem sklearn
regression
-Objekt zu erhalten um dann die mittlere RSS zu berechnen.
Die abschliessende Vorhersage passiert auf den Testdaten, das heisst, Daten ohne das Attribut «Preis». Die Schritte dazu sind in den nachfolgenden Aufträgen festgehalten:
Aufträge
- Schreibe deinen Code so, dass du ein «evalaution set» und ein «training set» hast. Wähle die Daten als Teil deiner ursprünglichhen Daten, siehe Beispiel unten.
- Für
numpy
-Neulinge: Arbeite den Code unten durch und erkläre deinem/deiner Nachbar:in, was die Code-Zeilen bewirken. Lies dir das CheatSheet durch. - Die Variable
data
sind die Daten vom letzten Mal. Mit den unterschiedlichen Spalten, hast du unterschiedliche features, mit den unterschiedlichen Zeilen unterschiedliche Beobachtungen; eine Teilmenge der Beobachtungen bildet das trainings set, die verbleibenden Beobachtungen bilden das evaluation set.
- Vergleiche die mittleren Quadratische-Abweichungen deiner Modelle ($\frac 1n \sum_{i=1}^n (y_i-\hat y_i)^2)$. Verwende dazu das evaluation set.
- Bis jetzt sind deine Vorhersagen manuell auf Grund von $y=mx+q$ enstanden. Versuche die Methoden
predict
des Regression-Objekts vonsklearn
zu verwenden und vergleiche deine Forecasts $y=mx+q$ mit den Regression-Forecasts.
- Wähle dann dein bestes Modell (mit einem oder mehreren Prädiktoren aus dem feature space) und mache die Vorhersagen für die Testdaten.
Code Bits
- lehrkraefte/ks/efcomputergrafik2022.1651584323.txt.gz
- Last modified: 2022/05/03 15:25
- by Simon Knaus