K-Fold-Kreuzvalidierung im Machine Learning

Ein Modell kann während des Trainings sehr genau wirken, bei unbekannten Testdaten jedoch deutlich an Genauigkeit verlieren. Diese Situation wird als Overfitting bezeichnet. Das bedeutet, dass sich das Modell zu stark an die Trainingsbeispiele angepasst hat. Underfitting beschreibt den umgekehrten Fall: Das Modell liefert selbst auf den Trainingsdaten schlechte Ergebnisse.

Cross-Validation hilft dabei einzuschätzen, ob ein Machine-Learning-Modell voraussichtlich zuverlässig auf neuen Daten funktioniert. Die Methode wird üblicherweise in mehreren Schritten durchgeführt:

Wie Cross-Validation funktioniert

  • Fold-Erstellung: Der Datensatz wird in mehrere kleinere Gruppen aufgeteilt, die als Folds bezeichnet werden.
  • Wiederholtes Training und Validieren: In jeder Runde wird das Modell auf einem Teil des Datensatzes trainiert, während ein Fold zur Validierung verwendet wird. Der Validierungs-Fold wechselt von Runde zu Runde.
  • Berechnung des finalen Scores: Die Ergebnisse aller Validierungsrunden werden gemittelt, um eine stabilere Schätzung der Gesamtleistung des Modells zu erhalten.

Voraussetzungen

  • Grundkenntnisse im Machine Learning – Verständnis für Modelltraining, Bewertungsmetriken und Overfitting.
  • Python-Kenntnisse – Vertrautheit mit Python sowie Bibliotheken wie scikit-learn, numpy und pandas.
  • Vorbereitung des Datensatzes – Ein bereinigter und vorverarbeiteter Datensatz, der für das Modelltraining bereit ist.
  • Installiertes Scikit-Learn – Falls noch nicht vorhanden, lässt es sich mit pip install scikit-learn installieren.
  • Verständnis von Leistungsmetriken – Kenntnisse über Accuracy, Precision, Recall, RMSE und ähnliche Kennzahlen – abhängig von der jeweiligen Aufgabe.

Gängige Cross-Validation-Methoden

  • K-Fold Cross-Validation: Der Datensatz wird in k gleich große Abschnitte geteilt, und das Modell wird k-mal trainiert. In jedem Durchlauf dient ein anderer Fold als Validierungsmenge.
  • Stratified K-Fold: Diese Variante sorgt bei Klassifikationsaufgaben dafür, dass in jedem Fold die gleichen Klassenverhältnisse erhalten bleiben. Das ist besonders hilfreich, wenn die Zielvariable unausgewogen ist, also kategoriale Klassen nicht gleichmäßig verteilt sind.
  • Leave-One-Out (LOO): Hier wird jeweils nur eine einzelne Beobachtung zur Validierung verwendet, während alle übrigen Instanzen für das Training genutzt werden. Das wird für jede Beobachtung wiederholt.
  • Time-Series Cross-Validation: Diese Methode ist für sequentielle Daten gedacht und stellt sicher, dass die Trainingsdaten zeitlich immer vor den Validierungsdaten liegen.

Cross-Validation ist hilfreich, um das beste Modell und passende Hyperparameter auszuwählen und gleichzeitig das Risiko von Overfitting zu verringern.

In diesem Leitfaden behandeln wir:

  • Was K-Fold Cross-Validation ist
  • Wie sie sich von einem klassischen Train-Test-Split unterscheidet
  • Eine Schritt-für-Schritt-Implementierung mit scikit-learn
  • Erweiterte Varianten wie Stratified K-Fold, Group K-Fold und Nested K-Fold
  • Methoden zum Umgang mit unausgewogenen Datensätzen

Was ist K-Fold Cross-Validation?

K-Fold Cross-Validation ist ein Resampling-Verfahren zur Bewertung von Machine-Learning-Modellen, bei dem der Datensatz in K gleich große Folds unterteilt wird. Das Modell wird auf K-1 Folds trainiert und auf dem verbleibenden Fold validiert. Dieser Ablauf wird K-mal wiederholt, und der endgültige Leistungswert ergibt sich als Durchschnitt aller Durchläufe.

Warum K-Fold Cross-Validation verwenden?

  • Im Gegensatz zu einem einzelnen Train-Test-Split verwendet K-Fold mehrere Aufteilungen und reduziert dadurch die Varianz der Leistungsschätzung. Dadurch kann das Modell unbekannte Daten besser vorhersagen.
  • Jeder Datenpunkt wird in unterschiedlichen Durchläufen sowohl für das Training als auch für die Validierung verwendet. So wird der verfügbare Datensatz effizienter genutzt und die Bewertung aussagekräftiger.
  • Da die Validierung mehrfach auf verschiedenen Datenabschnitten erfolgt, lassen sich Overfitting-Probleme leichter erkennen und verringern. So wird sichergestellt, dass das Modell allgemeine Muster lernt, statt Trainingsbeispiele auswendig zu lernen.
  • Durch das Mitteln der Ergebnisse aus mehreren Folds liefert K-Fold Cross-Validation eine belastbarere Schätzung der tatsächlichen Modellleistung und reduziert sowohl Bias als auch Varianz.
  • K-Fold Cross-Validation wird häufig zusammen mit Grid Search und Randomized Search eingesetzt, um Hyperparameter zu optimieren, ohne sich an nur einen einzelnen Train-Test-Split anzupassen.

K-Fold vs. Train-Test-Split

Aspekt K-Fold Cross-Validation Train-Test-Split
Datennutzung Der Datensatz wird in mehrere Folds aufgeteilt, sodass jeder Datenpunkt in verschiedenen Durchläufen sowohl im Training als auch in der Validierung verwendet werden kann. Der Datensatz wird einmalig in feste Trainings- und Testanteile unterteilt.
Bias-Varianz-Abwägung Die Varianz wird reduziert, weil das Modell mehrfach auf unterschiedlichen unbekannten Datenabschnitten trainiert wird, was zu einer besseren Balance zwischen Bias und Varianz beiträgt. Bei einem einfachen Train-Test-Split besteht eine höhere Wahrscheinlichkeit für hohe Varianz. Das passiert oft dann, wenn das Modell die Trainingsdaten zu eng abbildet und die Testdaten nicht gut verallgemeinert.
Overfitting-Risiko Das Risiko für Overfitting ist geringer, da das Modell über mehrere Folds hinweg getestet wird. Das Risiko für Overfitting ist höher, wenn die einmalige Aufteilung den gesamten Datensatz nicht gut repräsentiert.
Leistungsbewertung Liefert eine stabilere und besser verallgemeinerbare Einschätzung der Modellleistung. Die Bewertung hängt nur von einem einzigen Train-Test-Split ab, was zu Verzerrungen führen kann.

K-Fold Cross-Validation in Python umsetzen

Im Folgenden wenden wir K-Fold Cross-Validation mit scikit-learn an.

Schritt 1: Abhängigkeiten importieren

Zunächst importieren wir die benötigten Bibliotheken.

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import KFold, cross_val_score, train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn import linear_model, tree, ensemble

Schritt 2: Titanic-Datensatz laden und untersuchen

Für dieses Beispiel verwenden wir den Titanic-Datensatz, einen sehr bekannten Datensatz, mit dem sich die Funktionsweise der k-fold cross-validation gut nachvollziehen lässt.

df = pd.read_csv("https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv")
print(df.head(3))
print(df.info())

 

PassengerId  Survived  Pclass  \
0            1         0       3   
1            2         1       1   
2            3         1       3   

                                                Name     Sex   Age  SibSp  \
0                            Braund, Mr. Owen Harris    male  22.0      1   
1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   
2                             Heikkinen, Miss. Laina  female  26.0      0   

   Parch            Ticket     Fare Cabin Embarked  
0      0         A/5 21171   7.2500   NaN        S  
1      0          PC 17599  71.2833   C85        C  
2      0  STON/O2. 3101282   7.9250   NaN        S  
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
None

Schritt 3: Datenvorverarbeitung

Als Nächstes ist es sinnvoll, vor dem Training eines Modells mit Datenvorverarbeitung und Feature Engineering zu beginnen.

df = df[['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare']]  # Select relevant features
df.dropna(inplace=True)  # Remove missing values

# Encode categorical variable
label_encoder = LabelEncoder()
df['Sex'] = label_encoder.fit_transform(df['Sex'])

# Split features and target
X = df.drop(columns=['Survived'])
y = df['Survived']
df.shape
(714, 7)

Schritt 4: K-Fold-Aufteilung definieren

kf = KFold(n_splits=5, shuffle=True, random_state=42)

In diesem Beispiel bedeutet n_splits=5, dass der Datensatz in fünf Folds aufgeteilt wird. Der Parameter shuffle=True sorgt für eine zufällige Durchmischung.

Schritt 5: Modell trainieren und auswerten


model = RandomForestClassifier(n_estimators=100, random_state=42)
scores = cross_val_score(model, X, y, cv=kf, scoring='accuracy')
print(f'Cross-validation accuracy scores: {scores}')
print(f'Average Accuracy: {np.mean(scores):.4f}')
Cross-validation accuracy scores: [0.77622378 0.8041958 0.79020979 0.88111888 0.80985915] Average Accuracy: 0.8123
score = cross_val_score(tree.DecisionTreeClassifier(random_state= 42), X, y, cv= kf, scoring="accuracy")  
print(f'Scores for each fold are: {score}')  
print(f'Average score: {"{:.2f}".format(score.mean())}')
Scores for each fold are: [0.72727273 0.79020979 0.76923077 0.81818182 0.8028169] Average score: 0.78

Erweiterte Cross-Validation-Techniken

1. Stratified K-Fold (für unausgewogene Datensätze)

Beim Arbeiten mit unausgewogenen Klassen stellt Stratified K-Fold sicher, dass jeder Fold dieselbe Klassenverteilung wie der vollständige Datensatz beibehält. Diese ausgewogene Verteilung macht die Methode zu einer starken Wahl für Klassifikationsprobleme mit ungleich verteilten Klassen.

from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=skf, scoring='accuracy')
print(f'Average Accuracy (Stratified K-Fold): {np.mean(scores):.4f}')

Average Accuracy (Stratified K-Fold): 0.8124

2. Repeated K-Fold Cross-Validation

Repeated K-Fold führt K-Fold mehrmals mit unterschiedlichen Aufteilungen aus, um die Varianz weiter zu verringern. Diese Methode wird häufig verwendet, wenn der Datensatz eher einfach ist und Modelle wie die logistische Regression gut darauf angepasst werden können.

from sklearn.model_selection import RepeatedKFold
rkf = RepeatedKFold(n_splits=5, n_repeats=10, random_state=42)
scores = cross_val_score(model, X, y, cv=rkf, scoring='accuracy')
print(f'Average Accuracy (Repeated K-Fold): {np.mean(scores):.4f}')

Average Accuracy (Repeated K-Fold): 0.8011

3. Nested K-Fold Cross-Validation (für Hyperparameter-Tuning)

Nested K-Fold führt die Hyperparameter-Optimierung in einer inneren Schleife durch, während die Modellleistung in einer äußeren Schleife bewertet wird. So lässt sich Overfitting während des Tunings besser reduzieren.

from sklearn.model_selection import GridSearchCV, cross_val_score
param_grid = {'n_estimators': [50, 100, 150], 'max_depth': [None, 10, 20]}
gs = GridSearchCV(model, param_grid, cv=5)
scores = cross_val_score(gs, X, y, cv=5)
print(f'Average Accuracy (Nested K-Fold): {np.mean(scores):.4f}')

4. Group K-Fold (für nicht unabhängige Stichproben)

Wenn ein Datensatz Gruppen enthält, etwa mehrere Bilder desselben Patienten, sorgt Group K-Fold dafür, dass Stichproben derselben Gruppe nicht gleichzeitig in Training und Validierung auftauchen. Das ist besonders nützlich bei hierarchischen Datenstrukturen.

from sklearn.model_selection import GroupKFold
gkf = GroupKFold(n_splits=5)
groups = np.random.randint(0, 5, size=len(y))
scores = cross_val_score(model, X, y, cv=gkf, groups=groups, scoring='accuracy')
print(f'Average Accuracy (Group K-Fold): {np.mean(scores):.4f}')

FAQs

Wie führt man K-Fold Cross-Validation in Python aus?

Verwenden Sie cross_val_score() aus scikit-learn und übergeben Sie KFold als Wert für den Parameter cv.

Was ist der Unterschied zwischen K-Fold und Stratified K-Fold?

K-Fold teilt die Daten zufällig auf, während Stratified K-Fold dafür sorgt, dass die Klassenverhältnisse in jedem Fold konsistent bleiben.

Wie wähle ich die richtige Anzahl an Folds?

  • 5-Fold oder 10-Fold ist in den meisten Fällen der übliche Standard.
  • Eine höhere Anzahl an Folds, zum Beispiel 20, kann den Bias reduzieren, erhöht aber auch den Rechenaufwand.

Was macht die KFold-Klasse in Python?

Sie teilt den Datensatz in n_splits Folds auf, damit Training und Validierung wiederholt durchgeführt werden können.

Fazit

Damit ein Machine-Learning-Modell auch auf unbekannten Daten zuverlässig funktioniert, ist Cross-Validation ein unverzichtbarer Schritt. K-Fold Cross-Validation gehört zu den wirkungsvollsten Verfahren, um zu verhindern, dass sich das Modell zu stark an die Trainingsdaten anpasst, und gleichzeitig die Balance zwischen Bias und Varianz zu erhalten. Durch die Aufteilung des Datensatzes in mehrere Folds und das iterative Trainieren und Validieren in jeder Runde entsteht eine bessere Einschätzung darüber, wie sich das Modell bei unbekannten Daten verhalten wird.

In Python lässt sich K-Fold Cross-Validation mit Bibliotheken wie scikit-learn einfach umsetzen. Dort stehen Werkzeuge wie KFold und StratifiedKFold zur Verfügung, um auch mit unausgewogenen Datensätzen umzugehen. Wenn Sie K-Fold Cross-Validation in Ihren Workflow integrieren, können Sie Hyperparameter gezielter abstimmen, Modelle verlässlicher vergleichen und die Generalisierungsfähigkeit für reale Anwendungen verbessern.

Ganz gleich, ob Sie Regressions-, Klassifikations- oder Deep-Learning-Modelle entwickeln – dieser Validierungsansatz ist ein zentraler Bestandteil moderner Machine-Learning-Pipelines.

Quelle: digitalocean.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren:

Moderne Hosting Services mit Cloud Server, Managed Server und skalierbarem Cloud Hosting für professionelle IT-Infrastrukturen

LangMem SDK für KI-Agenten: Langzeitgedächtnis Guide

AI/ML, Tutorial
Vijona8 Juni um 13:37 Uhr LangMem SDK für KI-Agenten: Langzeitgedächtnis, Architektur, Integration, Leistung und Alternativen KI-Agenten, die auf großen Sprachmodellen basieren, waren lange mit einer wesentlichen Einschränkung konfrontiert: Ihr Gedächtnis ist…