Verstehen Sie K-Fold-Kreuzvalidierung: Eine Schritt-für-Schritt-Anleitung
📖 Einleitung
Wenn ein Machine-Learning-Modell über die Daten lernt, schneidet es oft gut bei den Trainingsdaten ab, hat jedoch schlechtere Leistungen bei ungesehenen Daten oder Testdaten. Dies wird als Überanpassung des Modells bezeichnet. Überanpassung tritt auf, wenn das Modell die Trainingsdaten gut erfasst, und Unteranpassung tritt auf, wenn das Modell selbst bei den Trainingsdaten nicht gut abschneidet.
Die Kreuzvalidierung ist eine der Techniken, die sicherstellt, dass das maschinelle Lernmodell gut auf unbekannte Daten generalisiert. Sie funktioniert wie folgt:
- Das Aufteilen von Daten in Falten: Ein gegebenes Dataset wird in mehrere Teilmengen, bekannt als „Falten“, unterteilt.
- Trainings- und Validierungszyklen: Das Modell wird auf einem Teil der Daten trainiert, und ein Falt wird für die Validierung verwendet. Dieser Prozess wiederholt sich, wobei bei jedem Mal ein anderer Falt verwendet wird.
- Durchschnittliche Ergebnisse: Die Leistungskennzahlen aus jedem Validierungsschritt werden gemittelt, um eine zuverlässigere Schätzung der Wirksamkeit des Modells zu ermöglichen.
Bildquelle
📌 Voraussetzungen
Grundkenntnisse im maschinellen Lernen – Verständnis des Modelltrainings, der Evaluierungsmetriken und der Überanpassung.
Python-Programmierkenntnisse – Vertrautheit mit Python und Bibliotheken wie scikit-learn, numpy und pandas.
Datensatzvorbereitung – Ein bereinigter und vorverarbeiteter Datensatz, der für das Modelltraining bereit ist.
Scikit-Learn installiert – Installieren Sie es mit pip install scikit-learn, falls noch nicht verfügbar.
Verständnis der Modellleistungsmetriken – Kenntnisse über Genauigkeit, Präzision, Recall, RMSE usw., abhängig von der Aufgabe.
🚀 Häufige Methoden der Kreuzvalidierung
- K-Fold Kreuzvalidierung: Der Datensatz wird in k gleich große Teile aufgeteilt, und das Modell wird k Mal trainiert, wobei jedes Mal ein anderer Teil als Validierungsset verwendet wird.
- Stratifiziertes K-Falten: Diese Methode stellt sicher, dass jeder Falten die gleiche Proportion von Klassen in Klassifikationsproblemen beibehält. Sie wird oft verwendet, wenn die Zielvariablen-Daten unausgewogen sind, d.h. wenn die Zielvariable eine kategorielle Spalte ist und die Klassen nicht gleichmäßig verteilt sind.
- Leave-One-Out (LOO): Diese Methode verwendet nur eine Instanz zur Validierung, während sie mit den restlichen trainiert, und wiederholt dies für alle Instanzen.
- Zeitreihen-Kreuzvalidierung: Wird für sequenzielle Daten verwendet, wobei sichergestellt wird, dass die Trainingsdaten vor den Validierungsdaten liegen.
Die Kreuzvalidierung hilft bei der Auswahl des besten Modells und der Hyperparameter und verhindert gleichzeitig Überanpassung.
In diesem Leitfaden werden wir erkunden:
- Was K-Fold-Kreuzvalidierung ist
- Wie es sich mit einem traditionellen Train-Test-Split vergleicht
- Schritt-für-Schritt-Implementierung mit
scikit-learn - Fortgeschrittene Variationen wie stratifizierte K-Fold, Gruppen-K-Fold und geschachtelte K-Fold
- Umgang mit unausgeglichenen Datensätzen
🤔 Was ist K-Fold Kreuzvalidierung?
K-Fold Cross-Validation ist eine Resampling-Technik, die verwendet wird, um Machine-Learning-Modelle zu bewerten, indem der Datensatz in K gleich große Falten geteilt wird. Das Modell wird an K-1 Falten trainiert und an der verbleibenden Falte validiert, wobei der Prozess K Mal wiederholt wird. Der endgültige Leistungswert ist der Durchschnitt aller Iterationen.
Warum K-Fold-Kreuzvalidierung verwenden?
- Im Gegensatz zu einem einzelnen Train-Test-Split verwendet K-Fold mehrere Splits, wodurch die Varianz in den Leistungsbewertungen reduziert wird. Daher wird das Modell fähiger, Vorhersagen über unbekannte Datensätze zu treffen.
- Jeder Datenpunkt wird für das Training und die Validierung verwendet, um die verfügbaren Daten zu maximieren und zu einer robusteren Leistungsbewertung zu führen.
- Da das Modell mehrere Male über verschiedene Datensegmente validiert wird, hilft es, Überanpassung zu erkennen und zu mindern. Dies stellt sicher, dass das Modell spezifische Trainingsproben nicht auswendig lernt, sondern gut auf neue Daten generalisiert.
- Durch das Durchschnittsbilden der Ergebnisse über mehrere Faltungen bietet die K-Fold-Kreuzvalidierung eine zuverlässigere Schätzung der tatsächlichen Leistung des Modells, wodurch Verzerrungen und Varianz verringert werden.
- K-Fold-Kreuzvalidierung wird häufig in Kombination mit Grid-Suche und zufälliger Suche verwendet, um optimale Hyperparameter zu finden, ohne sich auf einen einzelnen Train-Test-Split zu überanpassen.
🔍 K-Fold vs. Train-Test-Aufteilung
| Aspekt | K-Faltige Kreuzvalidierung | Train-Test-Aufteilung |
|---|---|---|
| Datennutzung | Die Daten werden in mehrere Falten unterteilt, um sicherzustellen, dass jeder Datenpunkt die Möglichkeit hat, sowohl Teil der Trainings- als auch der Validierungssets in verschiedenen Iterationen zu sein. | Teile die Daten in feste Portionen für das Training und das Testen auf. |
| Bias-Varianz-Abwägung | Es reduziert die Varianz, da das Modell mehrfach mit unbekannten Daten trainiert wird; daher wird der optimale Bias-Varianz-Tradeoff erreicht. | Es besteht die Möglichkeit einer hohen Varianz bei der einfachen Aufteilung in Trainings- und Testdaten. Dies geschieht oft, weil das Modell die Trainingsdaten gut anpasst und häufig Schwierigkeiten hat, die Testdaten zu verstehen. |
| Überanpassungsrisiko | Geringes Risiko der Überanpassung, da das Modell über verschiedene Falten hinweg getestet wird. | Höheres Risiko der Überanpassung, wenn die Aufteilung in Trainings- und Testdaten nicht repräsentativ ist. |
| Leistungsbewertung | Bietet eine zuverlässigere und allgemeinere Leistungsabschätzung. | Die Leistung hängt von einer einzelnen Trainings-Test-Aufteilung ab, die voreingenommen sein kann. |
🏁 Implementierung der K-Fold-Kreuzvalidierung in Python
Lass uns K-Fold-Kreuzvalidierung mit scikit-learn implementieren.
Schritt 1: Abhängigkeiten importieren
Zuerst werden wir mit dem Import der erforderlichen Bibliotheken beginnen.
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: Laden und Erkunden des Titanic-Datensatzes
Für dieses Demo werden wir das Titanic-Datenset verwenden, ein sehr bekanntes Datenset, das uns helfen wird, zu verstehen, wie man k-fache Kreuzvalidierung durchführt.
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
Jetzt ist es eine großartige Praxis, mit der Datenverarbeitung und der Merkmalsentwicklung zu beginnen, bevor man ein Modell erstellt.
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: Definiere die K-Fold-Aufteilung
kf = KFold(n_splits=5, shuffle=True, random_state=42)
Hier geben wir n_splits=5 an, was bedeutet, dass die Daten in fünf Falten unterteilt werden. Das shuffle=True stellt Zufälligkeit sicher.
Schritt 5: Modell trainieren und evaluieren
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}')
Kreuzvalidierungsgenauigkeiten: [0.77622378 0.8041958 0.79020979 0.88111888 0.80985915] Durchschnittliche Genauigkeit: 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())}')
Punkte für jede Falte sind: [0.72727273 0.79020979 0.76923077 0.81818182 0.8028169] Durchschnittspunktzahl: 0.78
⚡ Fortgeschrittene Kreuzvalidierungstechniken
1. Stratified K-Fold (Für unausgeglichene Datensätze)
Bei Datensätzen mit unausgeglichenen Klassen stellt Stratifizierte K-Faltung sicher, dass jede Faltung die gleiche Klassendistribution wie der vollständige Datensatz hat. Diese Verteilung der Klassen macht es zur idealen Wahl für Probleme mit unausgeglichenen Klassifikationen.
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}')
Durchschnittliche Genauigkeit (stratifiziertes K-Fold): 0,8124
2. Wiederholte K-Faltungs-Kreuzvalidierung
Wiederholtes K-Fold führt K-Fold mehrere Male mit unterschiedlichen Aufteilungen durch, um die Varianz weiter zu reduzieren. Dies geschieht normalerweise, wenn die Daten einfach sind und Modelle wie die logistische Regression in den Datensatz 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}')
Durchschnittliche Genauigkeit (Wiederholtes K-Fold): 0,8011
3. Verschachtelte K-Faltens Kreuzvalidierung (Für Hyperparameter-Tuning)
Nested K-Fold führt die Hyperparameteroptimierung in der inneren Schleife durch, während die Leistung in der äußeren Schleife bewertet wird, was Überanpassung reduziert.
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. Gruppen-K-Faltung (Für nicht unabhängige Stichproben)
Wenn Ihr Datensatz Gruppen enthält (z. B. mehrere Bilder von demselben Patienten), sorgt Group K-Fold dafür, dass Proben aus derselben Gruppe nicht zwischen Training und Validierung aufgeteilt werden, was für hierarchische Daten nützlich ist.
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}')
💡 Häufig gestellte Fragen
Wie führt man K-Fold-Kreuzvalidierung in Python durch?
Verwenden Sie cross_val_score() aus scikit-learn mit KFold als dem cv Parameter.
Was ist der Unterschied zwischen K-Fold und Stratified K-Fold?
K-Fold teilt die Daten zufällig auf, während Stratified K-Fold das Klassenungleichgewicht in jedem Fold aufrechterhält.
Wie wähle ich die richtige Anzahl an Falten?
- 5- oder 10-fach ist für die meisten Fälle Standard.
- Höhere Faltungen (z.B. 20) reduzieren die Verzerrung, erhöhen jedoch die Berechnungszeit.
Was macht die KFold Klasse in Python?
Es teilt den Datensatz in n_splits Falten zur Ausbildung und Validierung.
🔚 Schlussfolgerung
Um sicherzustellen, dass das von Ihnen entwickelte Machine-Learning-Modell bei der Bereitstellung von unbekannten Daten die beste Leistung erbringt, wird die Kreuzvalidierung zu einem entscheidenden Schritt, um das Modell zuverlässig zu machen. Die k-fache Kreuzvalidierung ist eine der besten Methoden, um sicherzustellen, dass das Modell nicht überanpasst wird, wodurch das Verhältnis von Bias und Varianz aufrechterhalten wird. Die Aufteilung der Daten in verschiedene Falten und das wiederholte Trainieren und Validieren des Modells durch jede Phase bietet eine bessere Schätzung dafür, wie das Modell bei Bereitstellung eines unbekannten Datensatzes abschneiden wird.
In Python ist die Implementierung von K-Fold-Kreuzvalidierung dank Bibliotheken wie scikit-learn unkompliziert, die KFold und StratifiedKFold für den Umgang mit unausgewogenen Datensätzen bietet. Die Integration von K-Fold-Kreuzvalidierung in Ihren Workflow ermöglicht es Ihnen, Hyperparameter effektiv zu optimieren, Modelle mit Vertrauen zu vergleichen und die Verallgemeinerung für Anwendungsfälle in der realen Welt zu verbessern.
Ob man ein Regressions-, Klassifikations- oder tiefes Lernmodell baut, dieser Validierungsansatz ist ein wesentlicher Bestandteil von Machine-Learning-Pipelines.
Referenzen
- Eine sanfte Einführung in die k-fache Kreuzvalidierung
- Ein umfassender Leitfaden zur K-Falt-Kreuzvalidierung
- K-Fold-Kreuzvalidierungstechnik und ihre Grundlagen
- Wie man ein Deep-Learning-Modell zur Vorhersage der Mitarbeiterbindung mit Keras und TensorFlow erstellt


