Informatik

Rückblick

Du hast deinen ersten KI-Klassifikator gebaut, Trainings- und Testdaten aufgeteilt und die Trefferquote gemessen.

Das kann ich jetzt

  • Ich kann erklären, warum man Daten in Trainings- und Testdaten aufteilt. (2.1)
  • Ich kann die Funktionsweise von k-NN beschreiben. (2.2)
  • Ich kann k-NN in Java implementieren. (2.2)
  • Ich kann die Trefferquote berechnen und interpretieren. (2.3)
  • Ich kann einschätzen, wie die Wahl von k das Ergebnis beeinflusst. (2.3)

Das Wichtigste auf einen Blick

Begriff Bedeutung
Trainingsdaten Daten mit Labels, an denen das System lernt
Testdaten Ungesehene Daten, mit denen die Qualität geprüft wird
k-NN Klassifiziert nach den k nächsten Nachbarn (Mehrheitsentscheidung)
Trefferquote Anteil der korrekt klassifizierten Testdaten in Prozent
Lazy learning Training = Speichern; Arbeit passiert erst bei der Klassifizierung
Distanz Euklidische Distanz: ( x 2 x 1 ) 2 + ( y 2 y 1 ) 2 \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}

k-NN ist ein konkretes Verfahren zur Klassifizierung beim überwachten Lernen. Es ist diskriminativ (ordnet ein), überwacht (braucht Labels) und faul (speichert nur). Die Wahl von k und die Qualität der Trainingsdaten bestimmen die Trefferquote.

Gemischte Aufgaben

Aufgabe 1: k-NN auf dem Papier

Gegeben sind diese Trainingsdaten:

Punkt Label
(1, 1) A
(2, 2) A
(1, 3) A
(4, 3) B
(8, 6) B
(8, 8) B
(9, 7) B

Klassifiziert werden soll der Punkt (3, 3). Sein wahres Label ist A.

a) Berechne die Distanz von (3, 3) zu allen sieben Trainingspunkten und ordne sie der Größe nach.

b) Welches Label liefert k-NN für k = 1, k = 3 und k = 5?

c) Bei genau einem dieser k-Werte liegt der Klassifikator falsch. Bei welchem, und warum gerade dort?

Tipp 1: Rechenweg

d = ( x 2 x 1 ) 2 + ( y 2 y 1 ) 2 d = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2} . Du darfst die Wurzeln stehen lassen — zum Sortieren genügt es, die Werte unter der Wurzel zu vergleichen.

Tipp 2: zu c)

Schau dir an, welcher Punkt der allernächste ist und welches Label er trägt. Passt er zu seiner Umgebung?

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Aufgabe 2: Das beste k automatisch finden

Bisher hast du k von Hand verändert und die Trefferquote abgelesen. Das soll das Programm selbst erledigen.

Schreibe eine Methode

int besteK(Datenpunkt[] pTraining, Datenpunkt[] pTest, int pMaxK)

die alle ungeraden Werte von k zwischen 1 und pMaxK durchprobiert, für jedes die Trefferquote auf den Testdaten berechnet, jede Quote ausgibt und am Ende das k mit der höchsten Trefferquote zurückgibt.

a) Schreibe die Methode und probiere sie mit den Daten aus Lektion 2.3 aus.

b) Warum werden nur ungerade k-Werte geprüft?

c) Das gefundene k ist auf den Testdaten das beste. Warum darf man daraus nicht schließen, dass das Modell mit diesem k genau so gut auf ganz neue Daten sein wird?

Tipp 1: Aufbau

Du brauchst zwei ineinanderliegende Schleifen: außen über k, innen über die Testdaten. Die innere Schleife steht schon fertig in der main von Lektion 2.3 — verschiebe sie in eine eigene Methode.

Tipp 2: Gerüst
int besteK(Datenpunkt[] pTraining, Datenpunkt[] pTest, int pMaxK) {
    KNNKlassifikator knn = new KNNKlassifikator(pTraining);
    int bestesK = 1;
    int besteAnzahl = -1;
    for (int k = 1; k <= pMaxK; k = k + 2) {
        int richtig = 0;
        // ... Testdaten durchgehen und zaehlen ...
        IO.println("k = " + k + ": " + richtig + "/" + pTest.length);
        if (richtig > besteAnzahl) {
            besteAnzahl = richtig;
            bestesK = k;
        }
    }
    return bestesK;
}
Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Selbsttest

Rückblick

Teilbare URL erstellen

Abschnitte auswählen