Website-Suche

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:

  1. Das Aufteilen von Daten in Falten: Ein gegebenes Dataset wird in mehrere Teilmengen, bekannt als „Falten“, unterteilt.
  2. 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.
  3. 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

AspektK-Faltige KreuzvalidierungTrain-Test-Aufteilung
DatennutzungDie 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ägungEs 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.
ÜberanpassungsrisikoGeringes 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.
LeistungsbewertungBietet 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