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: |
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
. 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?
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;
}