Machine Learning – Grundlagen und Supervised Learning

Fach: Data Science & Artificial Intelligence
Schulstufe: 12. Schulstufe – HTL Informatik
Voraussetzungen: Python, C, JavaScript, HTML/CSS
Autor: HTL Pinkafeld – IF/IT



1. Was ist Machine Learning?

Machine Learning (ML) ist ein Teilgebiet der Künstlichen Intelligenz (KI). Anstatt einem Computer explizite Regeln zu programmieren, lernt er aus Daten, Muster zu erkennen und Entscheidungen zu treffen.

Klassische Programmierung vs. Machine Learning

Klassische Programmierung Machine Learning
Regeln + Daten → Ergebnis Daten + Ergebnisse → Regeln
Entwickler schreibt Logik Algorithmus lernt Logik
Starr, muss manuell angepasst werden Adaptiv, verbessert sich mit mehr Daten

Anwendungsbeispiele im Alltag

💡 Kernidee: Machine Learning ist kein Zauberei – es ist Statistik und Optimierung auf großen Datenmengen.


2. Arten des Maschinellen Lernens

Es gibt drei grundlegende Lernparadigmen:

2.1 Supervised Learning (Überwachtes Lernen)

Das Modell lernt aus gelabelten Daten – jedes Trainingsbeispiel hat eine bekannte Antwort (Label).

Eingabe (Feature):  Wohnfläche, Zimmeranzahl, Lage
Ausgabe (Label):    Preis der Wohnung

→ Das Modell lernt die Abbildung f(X) → y

Typische Aufgaben:

2.2 Unsupervised Learning (Unüberwachtes Lernen)

Es gibt keine Labels. Das Modell sucht selbstständig nach Strukturen und Mustern in den Daten.

Typische Aufgaben:

2.3 Reinforcement Learning (Bestärkendes Lernen)

Ein Agent lernt durch Versuch und Irrtum in einer Umgebung. Er erhält Belohnungen für gute Aktionen.

Beispiele: Schach-KI (AlphaZero), autonomes Fahren, Robotersteuerung


3. Der ML-Workflow

Jedes ML-Projekt folgt einem typischen Ablauf:

1. Problem definieren
        ↓
2. Daten sammeln & verstehen
        ↓
3. Daten aufbereiten (Preprocessing)
        ↓
4. Modell wählen & trainieren
        ↓
5. Modell evaluieren
        ↓
6. Modell optimieren (Hyperparameter-Tuning)
        ↓
7. Modell deployen & überwachen

Wichtige Bibliotheken in Python

Bibliothek Zweck
pandas Daten laden, aufbereiten, analysieren
numpy Mathematische Operationen auf Arrays
matplotlib / seaborn Visualisierungen
scikit-learn ML-Algorithmen, Evaluation
tensorflow / pytorch Deep Learning

4. Daten – das Herzstück des ML

4.1 Begriffe

4.2 Daten aufteilen

Damit wir beurteilen können, wie gut unser Modell auf unbekannte Daten reagiert, teilen wir den Datensatz auf:

Menge Anteil Verwendung
Trainingsdaten 70–80 % Modell lernt daraus
Testdaten 20–30 % Bewertung des fertigen Modells

In scikit-learn:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

⚠️ Wichtig: Testdaten dürfen das Modell niemals während des Trainings sehen!

4.3 Preprocessing – Daten vorbereiten

Rohdaten sind selten perfekt. Typische Probleme:

import pandas as pd
from sklearn.preprocessing import StandardScaler

df = pd.read_csv('daten.csv')

# Fehlende Werte auffüllen mit Mittelwert
df['alter'].fillna(df['alter'].mean(), inplace=True)

# Normalisierung (Mittelwert 0, Standardabweichung 1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

5. Supervised Learning – Grundkonzepte

5.1 Klassifikation vs. Regression

Klassifikation:  "Welche Kategorie?"
  Eingabe → diskrete Klasse (0/1, Spam/kein Spam, Tier A/B/C)

Regression:      "Welcher Wert?"
  Eingabe → kontinuierlicher Wert (€, °C, kg)

5.2 Lernprozess

Beim Supervised Learning minimiert das Modell eine Verlustfunktion (Loss Function), die misst, wie groß der Fehler zwischen Vorhersage und tatsächlichem Label ist.


6. Algorithmus: k-Nearest Neighbors (kNN)

6.1 Grundidee

„Sage mir, wer deine Nachbarn sind, und ich sage dir, wer du bist."

kNN klassifiziert einen neuen Datenpunkt anhand der k ähnlichsten Trainingsbeispiele. Die Klasse der Mehrheit der k Nachbarn wird als Vorhersage verwendet.

6.2 Distanzmaße

Die „Ähnlichkeit" wird durch eine Distanz gemessen. Am häufigsten: Euklidische Distanz:

d(A, B) = √( (x₁-x₂)² + (y₁-y₂)² )

6.3 Wahl von k

k klein (z.B. k=1) k groß (z.B. k=15)
Sehr empfindlich auf Ausreißer Glattere Entscheidungsgrenze
Hohe Varianz Niedrigere Varianz, mehr Bias
Overfitting-Gefahr Underfitting-Gefahr

Faustregel: k = √n (wobei n = Anzahl Trainingsbeispiele), gerade Zahlen vermeiden bei binärer Klassifikation.

6.4 Praktisches Beispiel: Iris-Datensatz

Der Iris-Datensatz enthält 150 Blüten von 3 Schwertlilien-Arten mit je 4 Merkmalen (Kelch-/Kronblattlänge und -breite).

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 1. Daten laden
iris = load_iris()
X, y = iris.data, iris.target

# 2. Aufteilen
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 3. Modell erstellen und trainieren
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train, y_train)

# 4. Vorhersagen
y_pred = model.predict(X_test)

# 5. Bewerten
print(f"Accuracy: {accuracy_score(y_test, y_pred):.2%}")

6.5 Stärken und Schwächen

✅ Stärken ❌ Schwächen
Einfach zu verstehen Langsam bei großen Datenmengen
Kein Training nötig Empfindlich auf irrelevante Features
Funktioniert gut bei kleinen Datensätzen Skalierung der Features notwendig
Keine Annahmen über Datenverteilung Hoher Speicherbedarf

7. Algorithmus: Decision Tree

7.1 Grundidee

Ein Entscheidungsbaum teilt die Daten rekursiv anhand von Bedingungen (Splits) auf, bis eindeutige Klassen entstehen. Jeder innere Knoten ist eine Frage, jedes Blatt eine Vorhersage.

Beispiel: Werde ich Tennis spielen?

        Wetter?
       /       \
   sonnig     Regen
     |           |
  Luftfeuchtigkeit?   NEIN
    /        \
  <70%      ≥70%
   JA        NEIN

7.2 Splitting-Kriterien

Wie wählt der Algorithmus den besten Split?

Gini(t) = 1 - Σ p(i|t)²

7.3 Praktisches Beispiel

from sklearn.tree import DecisionTreeClassifier, export_text
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.2, random_state=42
)

# Modell erstellen (max_depth begrenzt die Tiefe → verhindert Overfitting)
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(X_train, y_train)

# Baum als Text ausgeben
print(export_text(dt, feature_names=iris.feature_names))

print(f"Accuracy: {dt.score(X_test, y_test):.2%}")

7.4 Feature Importance

Ein großer Vorteil von Decision Trees: Interpretierbarkeit. Man sieht, welche Features wichtig sind.

import pandas as pd

importance = pd.Series(
    dt.feature_importances_,
    index=iris.feature_names
).sort_values(ascending=False)

print(importance)

7.5 Stärken und Schwächen

✅ Stärken ❌ Schwächen
Sehr gut interpretierbar Neigt stark zu Overfitting
Keine Skalierung nötig Instabil (kleine Datenänderung → anderer Baum)
Funktioniert mit numerischen & kategorischen Daten Nicht optimal für lineare Zusammenhänge
Schnell Einzelne Bäume oft schwach

💡 Hinweis: In der Praxis verwendet man oft Random Forests – viele Bäume kombiniert, die gemeinsam bessere Ergebnisse liefern.


8. Algorithmus: Lineare Regression

8.1 Grundidee

Lineare Regression modelliert den Zusammenhang zwischen einem oder mehreren Features und einer kontinuierlichen Zielvariable durch eine Gerade (oder Hyperebene).

Einfache lineare Regression (1 Feature):

ŷ = w₀ + w₁ · x

Multiple lineare Regression (mehrere Features):

ŷ = w₀ + w₁·x₁ + w₂·x₂ + ... + wₙ·xₙ

Die Parameter w (Gewichte/Koeffizienten) werden so gelernt, dass der mittlere quadratische Fehler (MSE) minimiert wird:

MSE = (1/n) · Σ (yᵢ - ŷᵢ)²

8.2 Praktisches Beispiel: Wohnungspreise

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# Synthetische Daten: Wohnfläche (m²) → Preis (€1000)
np.random.seed(42)
flaeche = np.random.uniform(40, 150, 100).reshape(-1, 1)
preis = 1.5 * flaeche.flatten() + np.random.normal(0, 15, 100) + 50

# Modell trainieren
model = LinearRegression()
model.fit(flaeche, preis)

# Koeffizienten
print(f"Steigung (w₁): {model.coef_[0]:.2f}")
print(f"y-Achsenabschnitt (w₀): {model.intercept_:.2f}")
print(f"R²-Score: {r2_score(preis, model.predict(flaeche)):.3f}")

# Visualisierung
plt.scatter(flaeche, preis, alpha=0.5, label='Datenpunkte')
plt.plot(flaeche, model.predict(flaeche), color='red', label='Regressionsgerade')
plt.xlabel('Wohnfläche (m²)')
plt.ylabel('Preis (€1000)')
plt.legend()
plt.title('Lineare Regression: Wohnungspreise')
plt.show()

8.3 Der R²-Score

Der R²-Score (Bestimmtheitsmaß) gibt an, wie viel Varianz der Daten durch das Modell erklärt wird:

8.4 Stärken und Schwächen

✅ Stärken ❌ Schwächen
Einfach und interpretierbar Nur lineare Zusammenhänge
Schnell zu trainieren Empfindlich auf Ausreißer
Koeffizienten direkt interpretierbar Annahmen über Fehlerverteilung
Gut als Baseline Multikollinearität problematisch

9. Algorithmus: Logistische Regression

9.1 Grundidee

Trotz des Namens ist die logistische Regression ein Klassifikationsalgorithmus. Sie sagt die Wahrscheinlichkeit voraus, dass ein Datenpunkt einer Klasse angehört.

Die Ausgabe der linearen Regression (ein beliebiger Wert) wird durch die Sigmoid-Funktion auf den Bereich [0, 1] abgebildet:

σ(z) = 1 / (1 + e⁻ᶻ)

Ab einem Schwellenwert (meist 0.5) wird klassifiziert:

9.2 Praktisches Beispiel: Titanic-Datensatz

import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

# Vereinfachter Titanic-Datensatz
data = {
    'alter': [22, 38, 26, 35, 28, 54, 2, 27, 14, 4],
    'klasse': [3, 1, 3, 1, 3, 1, 3, 3, 2, 3],
    'geschlecht': [0, 1, 1, 1, 0, 0, 0, 1, 1, 1],  # 0=männlich, 1=weiblich
    'ueberlebt': [0, 1, 1, 1, 0, 0, 0, 0, 1, 1]
}
df = pd.DataFrame(data)

X = df[['alter', 'klasse', 'geschlecht']]
y = df['ueberlebt']

# Auf wenige Daten: kein train/test-split für dieses Beispiel
model = LogisticRegression()
model.fit(X, y)

# Vorhersage für eine neue Person
neue_person = [[30, 2, 1]]  # 30 Jahre, 2. Klasse, weiblich
prob = model.predict_proba(neue_person)[0]
print(f"Überlebenswahrscheinlichkeit: {prob[1]:.1%}")

9.3 Entscheidungsgrenze

Die logistische Regression lernt eine lineare Entscheidungsgrenze im Feature-Raum. Datenpunkte auf einer Seite werden als Klasse 0, auf der anderen als Klasse 1 klassifiziert.

9.4 Stärken und Schwächen

✅ Stärken ❌ Schwächen
Liefert Wahrscheinlichkeiten Nur lineare Entscheidungsgrenze
Schnell und interpretierbar Bei stark nichtlinearen Daten schwach
Gut bei binärer Klassifikation Feature-Engineering nötig
Wenig Hyperparameter Ausreißer beeinflussen das Modell

10. Modellbewertung und Metriken

10.1 Klassifikationsmetriken

Confusion Matrix

Vorhergesagt: Positiv Vorhergesagt: Negativ
Tatsächlich: Positiv TP (True Positive) FN (False Negative)
Tatsächlich: Negativ FP (False Positive) TN (True Negative)

Wichtige Metriken

Accuracy  = (TP + TN) / (TP + TN + FP + FN)
Precision = TP / (TP + FP)
Recall    = TP / (TP + FN)
F1-Score  = 2 · (Precision · Recall) / (Precision + Recall)

Wann welche Metrik?

from sklearn.metrics import classification_report, confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

# Nach dem Predict...
print(classification_report(y_test, y_pred, target_names=iris.target_names))

# Confusion Matrix visualisieren
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
            xticklabels=iris.target_names,
            yticklabels=iris.target_names)
plt.title('Confusion Matrix')
plt.show()

10.2 Regressionsmetriken

Metrik Formel Bedeutung
MAE mean(|y - ŷ|) Durchschnittlicher absoluter Fehler
MSE mean((y - ŷ)²) Bestraft große Fehler stärker
RMSE √MSE Gleiche Einheit wie y
R² 1 - SS_res/SS_tot Erklärte Varianz (0–1)

10.3 Cross-Validation

Um das Modell robuster zu evaluieren, verwendet man k-fold Cross-Validation: Die Daten werden in k Teile geteilt, das Modell k-mal trainiert und evaluiert.

from sklearn.model_selection import cross_val_score

scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
print(f"CV Accuracy: {scores.mean():.2%} ± {scores.std():.2%}")

11. Overfitting und Underfitting

11.1 Das Bias-Variance-Tradeoff

Ein zentrales Problem im Machine Learning:

Underfitting:           Gutes Modell:          Overfitting:
Zu einfach              Ausgewogen             Zu komplex

Training: schlecht      Training: gut          Training: perfekt
Test:     schlecht      Test:     gut          Test:     schlecht

Hoher Bias              Balance                Hohe Varianz

11.2 Ursachen und Lösungen

Problem Ursache Lösung
Underfitting Modell zu einfach Komplexeres Modell, mehr Features
Overfitting Modell zu komplex, zu wenig Daten Regularisierung, mehr Daten, Pruning

11.3 Regularisierung

Regularisierung bestraft komplexe Modelle, um Overfitting zu reduzieren:

from sklearn.linear_model import Ridge, Lasso

ridge = Ridge(alpha=1.0)  # alpha = Regularisierungsstärke
lasso = Lasso(alpha=0.1)

11.4 Lernkurven

Lernkurven zeigen, ob ein Modell unter- oder überangepasst ist:

from sklearn.model_selection import learning_curve
import numpy as np
import matplotlib.pyplot as plt

train_sizes, train_scores, val_scores = learning_curve(
    model, X, y, cv=5, train_sizes=np.linspace(0.1, 1.0, 10)
)

plt.plot(train_sizes, train_scores.mean(axis=1), label='Training')
plt.plot(train_sizes, val_scores.mean(axis=1), label='Validierung')
plt.xlabel('Trainingsgröße')
plt.ylabel('Accuracy')
plt.legend()
plt.title('Lernkurven')
plt.show()

12. Zusammenfassung und Ausblick

Überblick der behandelten Algorithmen

Algorithmus Typ Kernidee Geeignet für
kNN Klassifikation Mehrheit der k Nachbarn Kleine Datensätze, nicht-lineare Grenzen
Decision Tree Klassifikation/Regression Rekursive Datenteilung Interpretierbare Modelle
Lineare Regression Regression Gerade durch Datenpunkte Kontinuierliche Vorhersagen
Logistische Regression Klassifikation Wahrscheinlichkeit via Sigmoid Binäre Klassifikation

Wahl des richtigen Algorithmus

Ist das Zielmerkmal kontinuierlich?
    → JA: Regression (Lineare Regression, ...)
    → NEIN: Klassifikation

Wie viele Daten sind vorhanden?
    → Wenig Daten: kNN, Logistische Regression
    → Viele Daten: Decision Trees, Random Forest, Neural Networks

Muss das Modell interpretierbar sein?
    → JA: Decision Tree, Lineare/Logistische Regression
    → NEIN: Alle Algorithmen möglich

Ausblick: Nächste Themen


Anhang: Schnellreferenz scikit-learn

# Einheitliches API-Muster für alle scikit-learn Modelle:
from sklearn.XXX import YYYModel

model = YYYModel(hyperparameter1=wert1)   # 1. Erstellen
model.fit(X_train, y_train)               # 2. Trainieren
y_pred = model.predict(X_test)            # 3. Vorhersagen
score = model.score(X_test, y_test)       # 4. Bewerten

Wichtige Importe

# Daten
from sklearn.datasets import load_iris, load_diabetes, make_classification
from sklearn.model_selection import train_test_split, cross_val_score

# Preprocessing
from sklearn.preprocessing import StandardScaler, MinMaxScaler, LabelEncoder
from sklearn.impute import SimpleImputer

# Algorithmen
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.linear_model import LinearRegression, LogisticRegression, Ridge, Lasso

# Metriken
from sklearn.metrics import (
    accuracy_score, precision_score, recall_score, f1_score,
    confusion_matrix, classification_report,
    mean_squared_error, mean_absolute_error, r2_score
)

HTL Pinkafeld – IF/IT | Data Science & AI | 12. Schulstufe

Start der ReiheKein vorheriges Thema Nächstes ThemaEnsemble-Methoden