Weiter zum Inhalt

Hyperparameter-Optimierung in Machine-Learning-Modellen

Dieses Tutorial erklärt, was Parameter und Hyperparameter in einem Machine-Learning-Modell sind – und warum ihr Tuning entscheidend für die Modellperformance ist.
Aktualisiert 18. Sept. 2026  · 15 Min. lesen

Mit KI erkunden

ChatGPTClaudePerplexity

Machine Learning bedeutet, Daten vorherzusagen und zu klassifizieren – dafür setzt du je nach Datensatz unterschiedliche Modelle ein. Machine-Learning-Modelle sind parametrisiert, damit sich ihr Verhalten für ein konkretes Problem anpassen lässt. Diese Modelle haben oft viele Parameter, und die beste Kombination zu finden, ist im Grunde eine Suchaufgabe. Der Begriff Parameter kann am Anfang ungewohnt klingen. Keine Sorge: Gleich zu Beginn erfährst du, was damit gemeint ist – und worin sich Parameter und Hyperparameter eines Machine-Learning-Modells unterscheiden. Dieser Blog ist in folgende Abschnitte gegliedert:

  • Was ist ein Parameter in einem Machine-Learning-Modell?
  • Was ist ein Hyperparameter in einem Machine-Learning-Modell?
  • Warum ist Hyperparameter-Optimierung/-Tuning entscheidend für die Performance deines Modells?
  • Zwei einfache Strategien zum Optimieren/Tunen von Hyperparametern
  • Eine kurze Fallstudie in Python mit beiden Strategien

Starten wir direkt mit dem ersten Abschnitt!

Was ist ein Parameter in einem Machine-Learning-Modell?

Ein Modellparameter ist eine interne Konfigurationsvariable des Modells, deren Wert aus den verfügbaren Daten geschätzt werden kann.

  • Sie werden vom Modell für Vorhersagen benötigt.
  • Ihre Werte bestimmen, wie gut das Modell dein Problem löst.
  • Sie werden aus Daten geschätzt bzw. gelernt.
  • Sie werden selten manuell festgelegt.
  • Sie werden häufig zusammen mit dem gelernten Modell gespeichert.

Die Quintessenz: Parameter sind zentral für Machine-Learning-Algorithmen. Es sind die Teile des Modells, die aus historischen Trainingsdaten gelernt werden. Stell dir dazu ganz allgemein Funktionsparameter beim Programmieren vor: Du übergibst einer Funktion ein Argument, das verschiedene Werte annehmen kann. Im Machine Learning ist das konkrete Modell die Funktion und benötigt Parameter, um Vorhersagen für neue Daten zu treffen. Ob ein Modell eine feste oder variable Anzahl an Parametern hat, entscheidet, ob es als „parametrisch“ oder „nichtparametrisch“ bezeichnet wird.

Beispiele für Modellparameter sind:

  • Die Gewichte in einem künstlichen neuronalen Netz.
  • Die Stützvektoren in einer Support-Vector-Machine.
  • Die Koeffizienten in einer linearen oder logistischen Regression.

Was ist ein Hyperparameter in einem Machine-Learning-Modell?

Ein Modellhyperparameter ist eine externe Konfiguration zum Modell, deren Wert nicht direkt aus den Daten geschätzt werden kann.

  • Sie steuern oft Prozesse, die beim Schätzen der Modellparameter helfen.
  • Sie werden häufig von dir als Anwenderin oder Anwender festgelegt.
  • Sie lassen sich oft mit Heuristiken wählen.
  • Sie werden typischerweise für ein konkretes Vorhersageproblem getunt.

Den besten Wert eines Hyperparameters für ein bestimmtes Problem kennst du nicht im Voraus. Du kannst Faustregeln nutzen, Werte aus ähnlichen Aufgaben übernehmen oder per Trial-and-Error nach guten Einstellungen suchen. Wenn du einen Algorithmus auf ein spezielles Problem zuschneidest, dann stimmst du im Kern die Hyperparameter so ab, dass das Modell möglichst treffsichere Vorhersagen liefert.

Ein vielzitiertes Buch, „Applied Predictive Modelling“, formuliert es so: „Viele Modelle haben wichtige Parameter, die nicht direkt aus den Daten geschätzt werden können. Beispiel: Beim K-Nearest-Neighbor-Klassifikationsmodell … Dieser Parametertyp wird als Tuning-Parameter bezeichnet, weil es keine analytische Formel zur Berechnung eines passenden Werts gibt.“

Hyperparameter werden oft ungenau auch „Parameter“ genannt, was für Verwirrung sorgt. Eine hilfreiche Faustregel: „Wenn du einen Modellparameter manuell festlegen musst, ist es sehr wahrscheinlich ein Hyperparameter.“ Beispiele für Hyperparameter:

  • Die Lernrate beim Training eines neuronalen Netzes.
  • Die Hyperparameter C und Sigma bei Support-Vector-Machines.
  • Das k bei k-nearest neighbors.

Im nächsten Abschnitt siehst du, warum die passende Wahl der Hyperparameter für die Performance eines Machine-Learning-Modells so wichtig ist.

Beliebte Machine-Learning-Kurse

Hyperparameter-Tuning in Python

BasicSkill Level
4 Std.
25.3K learners
Hier lernst du Methoden zur automatischen Hyperparameter-Optimierung in Python kennen, wie zum Beispiel Grid, Random und Informed Search.
See DetailsRight Arrow
Start Course

Warum die richtigen Hyperparameter-Werte entscheidend sind

Am besten denkst du über Hyperparameter wie über die „Einstellungen“ eines Algorithmus nach, die du zur Leistungsoptimierung verstellen kannst – ähnlich wie du an einem AM-Radio drehst, um einen klaren Empfang zu bekommen. Beim Erstellen eines Machine-Learning-Modells triffst du Architekturentscheidungen. Oft weißt du nicht sofort, welche Architektur optimal ist, und möchtest deshalb verschiedene Möglichkeiten ausloten. Im Sinne von Machine Learning lässt du diese Erkundung idealerweise die Maschine übernehmen und automatisch eine optimale Modellarchitektur auswählen.

In der Fallstudie wirst du sehen, wie sich die Wahl der Hyperparameter konkret auf die Modellleistung auswirkt. Die Auswahl der passenden Werte wird in der Regel als „Hyperparameter-Optimierung“ oder „Hyperparameter-Tuning“ bezeichnet.

Zwei einfache Strategien zum Optimieren/Tunen von Hyperparametern:

Modelle können viele Hyperparameter besitzen, und die beste Kombination zu finden ist eine Suchaufgabe.

Es gibt inzwischen viele Verfahren zum Hyperparameter-Tuning. Hier betrachten wir zwei einfache Strategien: 1. Grid Search und 2. Random Search.

Grid Search für Hyperparameter:

Grid Search baut und bewertet systematisch ein Modell für jede Kombination von Algorithmusparametern, die du in einem Gitter festgelegt hast.

Ein Beispiel:

Angenommen, ein Modell X hat die Hyperparameter a1, a2 und a3. Beim Grid Search definierst du zunächst für jeden Hyperparameter einen Wertebereich – praktisch ein Werte-Array. Die Grid-Search-Technik konstruiert dann viele Versionen von X mit allen möglichen Kombinationen der Hyperparameterwerte (a1, a2, a3), die du festgelegt hast. Dieser Wertebereich heißt Grid.

Beispiel-Grid:
a1 = [0,1,2,3,4,5]
a2 = [10,20,30,40,5,60]
a3 = [105,105,110,115,120,125]

Achte darauf, dass die Wertelisten gültig sind. Du kannst z. B. keine Gleitkommazahlen angeben, wenn der Hyperparameter nur ganze Zahlen akzeptiert.

Nun beginnt die Grid Search, mit deinem Grid viele Modellvarianten von X zu konstruieren.

Sie startet etwa mit der Kombination [0,10,105] und endet bei [5,60,125] – inklusive aller Zwischenkombinationen. Das macht Grid Search rechnerisch sehr aufwendig.

Schauen wir uns als Nächstes die Random-Search-Technik an:

Random Search für Hyperparameter:

Die Idee der zufälligen Suche nach Hyperparametern stammt von James Bergstra & Yoshua Bengio. Das Originalpaper findest du hier.

Random Search unterscheidet sich von Grid Search: Du gibst keine diskreten Wertemengen für jeden Hyperparameter vor, sondern eine statistische Verteilung, aus der Werte zufällig gezogen werden.

Bevor wir weitergehen, ein kurzer Blick auf Verteilungen und Sampling:

In der Statistik meint Verteilung die Anordnung der Werte einer Variablen und wie häufig sie beobachtet werden (oder theoretisch auftreten).

Sampling bezeichnet das Ziehen einer repräsentativen Stichprobe aus einer Grundgesamtheit, um Rückschlüsse auf das Ganze zu ziehen.

Zurück zur zufälligen Suche:

Du definierst für jeden Hyperparameter eine Stichprobenverteilung. Außerdem legst du fest, wie viele Iterationen du ausprobieren möchtest. In jeder Iteration werden die Hyperparameterwerte des Modells durch Ziehen aus den definierten Verteilungen gesetzt. Ein zentrales theoretisches Argument für Random Search statt Grid Search: In den meisten Fällen sind nicht alle Hyperparameter gleich wichtig. Laut Originalpaper:

„…für die meisten Datensätze sind nur wenige Hyperparameter wirklich entscheidend, aber je nach Datensatz sind es verschiedene. Dieses Phänomen macht Grid Search ungeeignet, um Algorithmen für neue Datensätze zu konfigurieren.“

In der folgenden Abbildung durchsuchen wir einen Hyperparameterraum, in dem ein Hyperparameter den Modellerfolg stark dominiert – die Verteilungen auf den Achsen zeigen den Modellscore. In beiden Fällen bewerten wir neun Modelle. Grid Search verfehlt das Optimum deutlich und verschwendet Zeit auf den unwichtigen Parameter. Bei Grid Search wurde jeder Hyperparameter isoliert betrachtet, während die anderen konstant gehalten wurden. Wenn der betrachtete Hyperparameter wenig Einfluss hat, führt das zu unnötigem Aufwand. Random Search hingegen exploriert besser und fokussiert sich eher auf den kritischen Hyperparameter.

hyperparameters
Quelle: Random Search for Hyper-Parameter Optimization

In den nächsten Abschnitten siehst du Grid Search und Random Search in Python im Einsatz und kannst Effektivität und Effizienz vergleichen.

Fallstudie in Python

Hyperparameter-Tuning ist der letzte Schritt im angewandten Machine Learning, bevor du Ergebnisse präsentierst.

Wir verwenden den Pima-Indians-Diabetes-Datensatz. Es handelt sich um ein Klassifikationsproblem: Anhand von 8 Merkmalen soll vorhergesagt werden, ob eine Person Diabetes hat. Die vollständige Beschreibung findest du hier.

Der Datensatz umfasst 768 Beobachtungen. Zuerst lädst du die Daten, vorher importieren wir die benötigten Abhängigkeiten.

# Dependencies

import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression

Jetzt laden wir den Pima-Indians-Datensatz mit Pandas in ein DataFrame.

data = pd.read_csv("diabetes.csv") # Make sure the .csv file and the notebook are residing on the same directory otherwise supply an absolute path of the .csv file

Die Daten liegen im DataFrame data. Werfen wir einen Blick darauf.

data.head()
results

Es gibt 8 Merkmale, und das Ziel ist 1 oder 0, wobei 1 für Diabetes steht und 0 für kein Diabetes. Der Datensatz enthält fehlende Werte. Manche Spalten haben fehlende Beobachtungen, die als 0 markiert sind. Das ist anhand der Spaltendefinitionen und der Fachlogik erkennbar: Ein Wert von 0 für BMI oder Blutdruck ist ungültig.

(Fehlende Werte sind problematisch beim Modellbau. In diesem Beispiel nutzen wir einen Logistic-Regression-Klassifikator. Logistic Regression kann fehlende Werte nicht verarbeiten.)

(Wenn du eine Auffrischung zu Logistic Regression brauchst, findest du sie hier.)

Lass uns mit describe() einige Statistiken abrufen.

data.describe()
results

Das ist hilfreich.

Wir sehen Spalten mit einem Minimum von 0. In einigen Spalten ist 0 unsinnig und bedeutet fehlend/ungültig.

Konkret sind folgende Spalten mit 0 als Minimum ungültig:

  • Plasmaglukose-Konzentration
  • Diastolischer Blutdruck
  • Trizeps-Hautfalten­dicke
  • 2-Stunden-Seruminsulin
  • Body-Mass-Index

Nun markieren wir diese Werte als fehlend. Zur Bestätigung schauen wir uns die ersten 20 Zeilen an.

data.head(20)
results

Du siehst mehrere 0-Werte, richtig?

Wir zählen nun die Anzahl der Nullwerte in diesen Spalten. Dazu markieren wir in einem Spalten-Subset 0-Werte als True und zählen pro Spalte die True-Werte. Dafür laden wir die Daten ohne Spaltennamen neu.

data = pd.read_csv("https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv",header=None)
print((data[[1,2,3,4,5]] == 0).sum())
1      5
2     35
3    227
4    374
5     11
dtype: int64

Die Spalten 1, 2 und 5 haben nur wenige Nullen, Spalten 3 und 4 deutlich mehr – nahezu die Hälfte der Zeilen. Spalte 0 weist ebenfalls fehlende Werte auf, was aber unkritisch ist. Spalte 8 ist das Ziel; dort sind Nullen erwartbar.

Das zeigt: Unterschiedliche Strategien zum Umgang mit fehlenden Werten können je Spalte sinnvoll sein, damit genug Daten zum Trainieren bleiben.

In Python – insbesondere mit Pandas, NumPy und Scikit-Learn – werden fehlende Werte als NaN markiert.

NaN-Werte werden bei Operationen wie Summe oder Zählen ignoriert.

Mit DataFrame.replace() kannst du Werte in ausgewählten Spalten leicht durch NaN ersetzen.

Anschließend kannst du mit isnull() alle NaN-Werte als True markieren und pro Spalte zählen.

# Mark zero values as missing or NaN
data[[1,2,3,4,5]] = data[[1,2,3,4,5]].replace(0, np.NaN)
# Count the number of NaN values in each column
print(data.isnull().sum())
0      0
1      5
2     35
3    227
4    374
5     11
6      0
7      0
8      0
dtype: int64

Die Spalten 1–5 haben nun genauso viele fehlende Werte wie zuvor Nullen. Das zeigt, dass die Markierung korrekt war.

Die Übersicht ist nützlich – zur Sicherheit schauen wir uns wieder die Rohdaten an.

Unten dieselbe Abfrage mit den ersten 5 Zeilen.

data.head()
  0 1 2 3 4 5 6 7 8
0 6 148.0 72.0 35.0 NaN 33.6 0.627 50 1
1 1 85.0 66.0 29.0 NaN 26.6 0.351 31 0
2 8 183.0 64.0 NaN NaN 23.3 0.672 32 1
3 1 89.0 66.0 23.0 94.0 28.1 0.167 21 0
4 0 137.0 40.0 35.0 168.0 43.1 2.288 33 1

Die Rohdaten bestätigen die beabsichtigte Wirkung. Jetzt imputieren wir die fehlenden Werte. Beim Imputieren ersetzt ein Verfahren die fehlenden Werte. Wir nutzen Mean Imputation, also den Spaltenmittelwert. Mit Pandas fillna() geht das schnell.

# Fill missing values with mean column values
data.fillna(data.mean(), inplace=True)
# Count the number of NaN values in each column
print(data.isnull().sum())
0    0
1    0
2    0
3    0
4    0
5    0
6    0
7    0
8    0
dtype: int64

Super – das Thema fehlende Werte ist erledigt. Jetzt bauen wir mit scikit-learn ein Logistic-Regression-Modell.

Zuerst mit zufällig gewählten Hyperparametern. Danach trainieren wir zwei weitere Modelle mit Grid Search und Random Search.

# Split dataset into inputs and outputs
values = data.values
X = values[:,0:8]
y = values[:,8]
# Initiate the LR model with random hyperparameters
lr = LogisticRegression(penalty='l1',dual=False,max_iter=110)

Du hast ein Logistic-Regression-Modell mit einigen zufälligen Hyperparametern erzeugt. Diese Hyperparameter hast du verwendet:

  • penalty: Legt die Norm der Regularisierung fest.
  • dual: Duale oder primale Formulierung. Die duale Variante ist nur für l2 mit liblinear implementiert. Bei n_samples > n_features empfehlenswert: dual=False.
  • max_iter: Maximale Anzahl Iterationen bis zur Konvergenz.

Später in der Fallstudie optimierst du diese Hyperparameter und vergleichst die Ergebnisse.

# Pass data to the LR model
lr.fit(X,y)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
          intercept_scaling=1, max_iter=110, multi_class='ovr', n_jobs=1,
          penalty='l1', random_state=None, solver='liblinear', tol=0.0001,
          verbose=0, warm_start=False)

Zeit für den Accuracy-Score.

lr.score(X,y)
0.7747395833333334

Bisher hast du das Modell auf dieselben Daten angewandt und bewertet. Du musst aber prüfen, wie stabil dein Modell ist. Ein Modell nur auf Trainingsdaten zu fitten und zu hoffen, dass es auf unbekannten Daten gut funktioniert, reicht nicht. Du brauchst Evidenz, dass dein Modell die Muster tatsächlich gelernt hat.

Hier hilft Cross-Validation. Details sprengen den Rahmen, aber dieser Beitrag erklärt es sehr gut.

# You will need the following dependencies for applying Cross-validation and evaluating the cross-validated score

from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
# Build the k-fold cross-validator

kfold = KFold(n_splits=3, random_state=7)

Mit n_splits=3 führst du eine 3-fach-Cross-Validation aus. random_state=7 dient der Reproduzierbarkeit; jeder andere Integer wäre auch möglich. Anwenden wir das Ganze.

result = cross_val_score(lr, X, y, cv=kfold, scoring='accuracy')
print(result.mean())
0.765625

Die Genauigkeit sinkt leicht. Mit Hyperparameter-Tuning geht da mehr.

Wir bauen nun ein weiteres LR-Modell, diesmal mit getunten Hyperparametern – zuerst via Grid Search.

Dafür stellt scikit-learn die Utility GridSearchCV bereit.

from sklearn.model_selection import GridSearchCV

Definieren wir das Grid für die oben genutzten Hyperparameter.

dual=[True,False]
max_iter=[100,110,120,130,140]
param_grid = dict(dual=dual,max_iter=max_iter)

Das Grid steht. Jetzt führen wir die Suche aus und messen die Laufzeit.

import time

lr = LogisticRegression(penalty='l2')
grid = GridSearchCV(estimator=lr, param_grid=param_grid, cv = 3, n_jobs=-1)

start_time = time.time()
grid_result = grid.fit(X, y)
# Summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
print("Execution time: " + str((time.time() - start_time)) + ' ms')
Best: 0.752604 using {'dual': False, 'max_iter': 100}
Execution time: 0.3954019546508789 ms

Du kannst das Grid auch vergrößern und erneut suchen lassen.

dual=[True,False]
max_iter=[100,110,120,130,140]
C = [1.0,1.5,2.0,2.5]
param_grid = dict(dual=dual,max_iter=max_iter,C=C)
lr = LogisticRegression(penalty='l2')
grid = GridSearchCV(estimator=lr, param_grid=param_grid, cv = 3, n_jobs=-1)

start_time = time.time()
grid_result = grid.fit(X, y)
# Summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
print("Execution time: " + str((time.time() - start_time)) + ' ms')
Best: 0.763021 using {'C': 2.0, 'dual': False, 'max_iter': 100}
Execution time: 0.793781042098999 ms

Die Accuracy steigt, aber auch die Laufzeit. Je größer das Grid, desto länger die Suche.

Jetzt wiederholen wir alles mit Random Search. In scikit-learn heißt das RandomizedSearchCV. Importieren wir, was wir brauchen.

from sklearn.model_selection import RandomizedSearchCV
random = RandomizedSearchCV(estimator=lr, param_distributions=param_grid, cv = 3, n_jobs=-1)

start_time = time.time()
random_result = random.fit(X, y)
# Summarize results
print("Best: %f using %s" % (random_result.best_score_, random_result.best_params_))
print("Execution time: " + str((time.time() - start_time)) + ' ms')
Best: 0.763021 using {'max_iter': 100, 'dual': False, 'C': 2.0}
Execution time: 0.28888916969299316 ms

Stark! Random Search erreicht dieselbe Accuracy in deutlich kürzerer Zeit.

Das war die Fallstudie. Fassen wir zusammen.

Fazit und weiterführende Quellen

In diesem Tutorial hast du Parameter und Hyperparameter von Machine-Learning-Modellen kennengelernt und ihre Unterschiede verstanden. Du weißt nun, welche Rolle Hyperparameter-Optimierung beim Aufbau leistungsfähiger Modelle spielt. Außerdem hast du mit scikit-learn eine einfache Logistic Regression in Python gebaut.

Du hast Hyperparameter mit Grid Search und Random Search getunt und gesehen, welche Methode in diesem Beispiel besser abschneidet.

Zusätzlich hast du kleine Schritte der Datenvorverarbeitung (Umgang mit fehlenden Werten) und Cross-Validation angewendet.

Das ist viel Stoff – und alles ist wichtig für deinen Weg in der Data Science. Hier sind weiterführende Quellen:

Weiterführende Literatur:

Für Fortgeschrittene empfehle ich dieses Paper zur effektiven Optimierung von Hyperparametern in neuronalen Netzen: link

Wenn du mehr über Machine Learning lernen möchtest, empfehlen wir diese DataCamp-Kurse:

Themen
Maschinelles Lernen
Python

Mehr über Machine Learning lernen

Kurs

Machine Learning verstehen

2 Std.
308.6K
In diesem Kurs lernst du das spannende Themenfeld des maschinellen Lernens kennen – und du benötigst dafür gar keine Programmierkenntnisse.
Details anzeigenRight Arrow
Kurs Starten
Mehr anzeigenRight Arrow
Verwandt

Tutorial

Ein Leitfaden zu Python-Hashmaps

Finde heraus, was Hashmaps sind und wie sie in Python mit Hilfe von Wörterbüchern umgesetzt werden.
Javier Canales Luna's photo

Javier Canales Luna

11 Min.

Tutorial

Python Datenstrukturen Tutorial

Mach dich mit Python-Datenstrukturen vertraut: Lerne mehr über Datentypen und primitive sowie nicht-primitive Datenstrukturen wie Strings, Listen, Stapel usw.
Sejal Jaiswal's photo

Sejal Jaiswal

24 Min.

Tutorial

Python-Anweisungen IF, ELIF und ELSE

In diesem Tutorial lernst du ausschließlich Python if else-Anweisungen kennen.
Sejal Jaiswal's photo

Sejal Jaiswal

9 Min.

Tutorial

Python-Lambda-Funktionen: Ein Leitfaden für Anfänger

Lerne mehr über Python-Lambda-Funktionen, wozu sie gut sind und wann man sie benutzt. Enthält praktische Beispiele und bewährte Methoden für eine effektive Umsetzung.
Mark Pedigo's photo

Mark Pedigo

10 Min.

Tutorial

Python-Tutorial zum Verknüpfen von Zeichenfolgen

Lerne verschiedene Methoden zum Verknüpfen von Zeichenfolgen in Python kennen, mit Beispielen, die jede Technik zeigen.
DataCamp Team's photo

DataCamp Team

5 Min.

Tutorial

Python Switch Case Statement: Ein Leitfaden für Anfänger

Erforsche Pythons match-case: eine Anleitung zu seiner Syntax, Anwendungen in Data Science und ML sowie eine vergleichende Analyse mit dem traditionellen switch-case.
Matt Crabtree's photo

Matt Crabtree

5 Min.

Mehr AnzeigenMehr Anzeigen