Durchführen einer Kreuzvalidierung für die Modellperformance in R

Von Fabian
Kategorie: R
Tags: Regression
Lesezeit: 10 Minuten

Was ist Kreuzvalidierung?

In der Statistik erstellen wir Modelle häufig aus zwei Gründen:

  • Verständnis der Beziehung zwischen einer oder mehreren Prädiktorvariablen und einer Antwortvariablen.
  • Verwendung eines Modells zur Vorhersage zukünftiger Beobachtungen.

Die Kreuzvalidierung ist nützlich, um abzuschätzen, wie gut ein Modell zukünftige Beobachtungen vorhersagen kann.

Zum Beispiel können wir ein mehrfach lineares Regressionsmodell erstellen, das Alter und Einkommen als Prädiktorvariablen und den Kreditausfallstatus als Antwortvariable verwendet. In diesem Fall möchten wir das Modell möglicherweise an einen Datensatz anpassen und dieses Modell dann verwenden, um basierend auf dem Einkommen und dem Alter eines neuen Antragstellers die Wahrscheinlichkeit vorherzusagen, dass er mit einem Darlehen in Verzug gerät.

Um festzustellen, ob das Modell eine starke Vorhersagefähigkeit aufweist, müssen wir das Modell verwenden, um Vorhersagen für Daten zu treffen, die es zuvor noch nicht gesehen hat. Auf diese Weise können wir den Vorhersagefehler des Modells abschätzen.

Verwenden der Kreuzvalidierung zum Schätzen des Vorhersagefehlers

Die Kreuzvalidierung bezieht sich auf verschiedene Möglichkeiten, wie wir den Vorhersagefehler abschätzen können. Der allgemeine Ansatz der Kreuzvalidierung lautet wie folgt:

  1. Legen Sie eine bestimmte Anzahl von Beobachtungen im Datensatz beiseite – normalerweise 15-25% aller Beobachtungen.
  2. Passen Sie das Modell an die Beobachtungen an (oder trainieren Sie sie), die wir im Datensatz behalten.
  3. Testen Sie, wie gut das Modell Vorhersagen zu den Beobachtungen treffen kann, die wir nicht zum Trainieren des Modells verwendet haben.

Messung der Qualität eines Modells

Wenn wir das angepasste Modell verwenden, um Vorhersagen über neue Beobachtungen zu treffen, können wir verschiedene Metriken verwenden, um die Qualität des Modells zu messen, einschließlich:

R-Quadrat: Hiermit wird die Stärke der linearen Beziehung zwischen den Prädiktorvariablen und der Antwortvariablen gemessen. Ein mehrfaches R-Quadrat von 1 zeigt eine perfekte lineare Beziehung an, während ein mehrfaches R-Quadrat von 0 keinerlei lineare Beziehung anzeigt. Je höher das multiple R-Quadrat ist, desto besser können die Prädiktorvariablen die Antwortvariable vorhersagen.

Root Mean Squared Error (RMSE): Hiermit wird der durchschnittliche Vorhersagefehler gemessen, den das Modell bei der Vorhersage des Werts für eine neue Beobachtung gemacht hat. Dies ist der durchschnittliche Abstand zwischen dem wahren Wert einer Beobachtung und dem vom Modell vorhergesagten Wert. Niedrigere Werte für RMSE zeigen eine bessere Modellanpassung an.

Mittlerer absoluter Fehler (MAE): Dies ist die durchschnittliche absolute Differenz zwischen dem wahren Wert einer Beobachtung und dem vom Modell vorhergesagten Wert. Diese Metrik ist im Vergleich zu RMSE im Allgemeinen weniger empfindlich gegenüber Ausreißern. Niedrigere Werte für MAE zeigen eine bessere Modellanpassung an.

Implementierung von vier verschiedenen Kreuzvalidierungstechniken in R

Als nächstes erklären wir, wie die folgenden Kreuzvalidierungstechniken in R implementiert werden:

  1. Validierungssatzansatz
  2. k-fache Kreuzvalidierung
  3. Lassen Sie eine Kreuzvalidierung aus
  4. Wiederholte k-fache Kreuzvalidierung

Um zu veranschaulichen, wie diese verschiedenen Techniken verwendet werden, verwenden wir eine Teilmenge des integrierten R-Datensatzes mtcars:

#Datensatz definieren
data <- mtcars[ , c("mpg", "disp", "hp", "drat")]

#Die ersten sechs Zeilen mit neuen Daten anzeigen
head(data)

#                   mpg disp  hp drat
#Mazda RX4         21.0  160 110 3.90
#Mazda RX4 Wag     21.0  160 110 3.90
#Datsun 710        22.8  108  93 3.85
#Hornet 4 Drive    21.4  258 110 3.08
#Hornet Sportabout 18.7  360 175 3.15
#Valiant           18.1  225 105 2.76

Wir werden ein multiples lineares Regressionsmodell erstellen, das disp, hp und drat als Prädiktorvariablen und mpg als Antwortvariable verwendet.

Validierungssatz-Ansatz

Der Validierungssatz-Ansatz funktioniert wie folgt:

  1. Teilen Sie die Daten in zwei Datensätze auf: Ein Datensatz wird zum Trainieren des Modells verwendet (d. H. Zum Schätzen der Parameter des Modells) und der andere Datensatz wird zum Testen des Modells verwendet. In der Regel wird der Trainingssatz durch zufällige Auswahl von 70 bis 80% der Daten generiert, und die anderen verbleibenden 20 bis 30% der Daten werden als Testsatz verwendet.
  2. Erstellen Sie das Modell anhand des Trainingsdatensatzes.
  3. Verwenden Sie das Modell, um Vorhersagen zu den Daten im Testsatz zu treffen.
  4. Messen Sie die Qualität des Modells mithilfe von Metriken wie R-Quadrat, RMSE und MAE.

Beispiel:

Im folgenden Beispiel wird der oben definierte Datensatz verwendet. Zuerst teilen wir die Daten in auf
ein Trainingssatz und ein Testsatz, wobei 80% der Daten als Trainingssatz und die restlichen 20% der Daten als Testsatz verwendet werden. Als nächstes erstellen wir das Modell unter Verwendung des Trainingssatzes. Anschließend verwenden wir das Modell, um Vorhersagen für den Testsatz zu treffen. Zuletzt messen wir die Qualität des Modells mit R-Quadrat, RMSE und MAE.

#laden der dplyr Bibliothek zur Datenmanipulation
library(dplyr)

#Caret-Bibliothek laden, die zum Partitionieren von Daten inTrainings- und Test-Sets verwendet wird
library(caret)

#Machen Sie dieses Beispiel reproduzierbar
set.seed(0)

#Definieren Sie den Datensatz
data <- mtcars[ , c("mpg", "disp", "hp", "drat")]

#Teilen Sie den Datensatz in einen Trainingssatz (80%) und einen Testsatz (20%) auf
training_obs% createDataPartition(p = 0.8, list = FALSE)

train <- data[training_obs, ]
test <- data[-training_obs, ]

# Erstellen Sie das lineare Regressionsmodell auf dem Trainingssatz
model <- lm(mpg ~ ., data = train)

# Verwenden Sie das Modell, um Vorhersagen für den Testsatz zu treffen
predictions% predict(test)

#Untersuchen Sie R-Quadrat, RMSE und MAE von Vorhersagen
data.frame(R_squared = R2(predictions, test$mpg),
           RMSE = RMSE(predictions, test$mpg),
           MAE = MAE(predictions, test$mpg))

#  R_squared     RMSE     MAE
#1 0.9213066 1.876038 1.66614

Beim Vergleich verschiedener Modelle ist das Modell dasjenige, das den niedrigsten RMSE im Testsatz erzeugt.

Vor- und Nachteile dieses Ansatzes

Der Vorteil des Validierungssatzansatzes besteht darin, dass er unkompliziert und rechnerisch effizient ist. Der Nachteil ist, dass das Modell nur mit einem Teil der Gesamtdaten erstellt wird. Wenn die Daten, die wir zufällig aus dem Trainingssatz herauslassen, interessante oder wertvolle Informationen enthalten, berücksichtigt das Modell dies nicht.

k-facher Kreuzvalidierungsansatz

Der k-fache Kreuzvalidierungsansatz funktioniert wie folgt:

  1. Teilen Sie die Daten zufällig in k „Falten“ oder Teilmengen (z. B. 5 oder 10 Teilmengen) auf.
  2. Trainieren Sie das Modell mit allen Daten und lassen Sie nur eine Teilmenge aus.
  3. Verwenden Sie das Modell, um Vorhersagen zu den Daten in der Teilmenge zu treffen, die ausgelassen wurde.
  4. Wiederholen Sie diesen Vorgang, bis jede der k Teilmengen als Testmenge verwendet wurde.
  5. Messen Sie die Qualität des Modells, indem Sie den Durchschnitt der k Testfehler berechnen. Das ist bekannt
    als Kreuzvalidierungsfehler.

Beispiel

In diesem Beispiel teilen wir die Daten zunächst in 5 Teilmengen auf. Dann passen wir das Modell mit allen Daten außer einer Teilmenge an. Als Nächstes verwenden wir das Modell, um Vorhersagen für die ausgelassene Teilmenge zu treffen und den Testfehler aufzuzeichnen (unter Verwendung von R-Quadrat, RMSE und MAE). Wir wiederholen diesen Vorgang, bis jede Teilmenge als Testmenge verwendet wurde. Dann berechnen wir einfach den Durchschnitt der 5 Testfehler.

#laden der dplyr Bibliothek zur Datenmanipulation
library(dplyr)

#Caret-Bibliothek laden, die zum Partitionieren von Daten in Trainings- und Test-Sets verwendet wird
library(caret)

#Machen Sie dieses Beispiel reproduzierbar
set.seed(0)

#Definieren Sie den Datensatz
data <- mtcars[ , c("mpg", "disp", "hp", "drat")]

#Definieren Sie die Anzahl der zu verwendenden Teilmengen (oder "Falten")
train_control <- trainControl(method = "cv", number = 5)

#Trainieren Sie das Modell
model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control)

#Fassen Sie die Ergebnisse zusammen
print(model)

#Lineare Regression 
#
#32 samples
# 3 predictor
#
#Keine Vorverarbeitung
#Resampling: Kreuzvalidiert (5 fach) 
#Zusammenfassung der Stichprobengrößen: 26, 25, 26, 25, 26 
#Resampling-Ergebnisse:
#
#  RMSE      Rsquared   MAE     
#  3.095501  0.7661981  2.467427
#
#Der Abstimmungsparameter 'intercept' wurde konstant auf einem Wert von TRUE gehalten

Vor- und Nachteile dieses Ansatzes

Der Vorteil des k-fachen Kreuzvalidierungsansatzes gegenüber dem Validierungssatzansatz besteht darin, dass das Modell jedes Mal mehrmals unter Verwendung unterschiedlicher Datenblöcke erstellt wird, sodass wir beim Erstellen des Modells keine Chance haben, wichtige Daten auszulassen.

Der subjektive Teil dieses Ansatzes besteht darin, auszuwählen, welcher Wert für k verwendet werden soll, d. H. In wie viele Teilmengen die Daten aufgeteilt werden sollen. Im Allgemeinen führen niedrigere Werte von k zu einer höheren Vorspannung, aber einer geringeren Variabilität, während höhere Werte von k zu einer geringeren Vorspannung, aber einer höheren Variabilität führen.

In der Praxis wird k typischerweise zu 5 oder 10 gewählt, da diese Anzahl von Teilmengen dazu neigt, gleichzeitig zu viel Vorspannung und zu viel Variabilität zu vermeiden.

Leave One Out Kreuzvalidierungsansatz (LOOCV)

Der LOOCV-Ansatz funktioniert wie folgt:

  1. Erstellen Sie das Modell mit allen Beobachtungen im Datensatz bis auf eine.
  2. Verwenden Sie das Modell, um den Wert der fehlenden Beobachtung vorherzusagen. Notieren Sie den Testfehler dieser Vorhersage.
  3. Wiederholen Sie diesen Vorgang für jede Beobachtung im Datensatz.
  4. Messen Sie die Qualität des Modells, indem Sie den Durchschnitt aller Vorhersagefehler berechnen.

Beispiel

Das folgende Beispiel zeigt, wie Sie LOOCV für denselben Datensatz ausführen, den wir in den vorherigen Beispielen verwendet haben:

#laden der dplyr Bibliothek zur Datenmanipulation
library(dplyr)

#Caret-Bibliothek laden, die zum Partitionieren von Daten in Trainings- und Test-Sets verwendet wird
library(caret)

#Machen Sie dieses Beispiel reproduzierbar
set.seed(0)

#Definieren Sie den Datensatz
data <- mtcars[ , c("mpg", "disp", "hp", "drat")]

#Geben Sie an, dass Sie LOOCV verwenden möchten
train_control <- trainControl(method = "LOOCV")

#Trainieren Sie das Modell
model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control)

#Zusammenfassung der Ergebnisse
print(model)

#Lineare Regression 
#
#32 samples
# 3 predictor
#
#Keine Vorverarbeitung
#Resampling: Leave-One-Out Kreuzvalidierung
#Zusammenfassung der Stichprobengrößen: 31, 31, 31, 31, 31, 31, ... 
#Resampling-Ergebnisse:
#
#  RMSE      Rsquared   MAE     
#  3.168763  0.7170704  2.503544
#
#Der Abstimmungsparameter 'intercept' wurde konstant auf einem Wert von TRUE gehalten

Vor- und Nachteile dieses Ansatzes

Der Vorteil von LOOCV besteht darin, dass wir alle Datenpunkte verwenden, wodurch die potenzielle Verzerrung im Allgemeinen verringert wird. Da wir jedoch das Modell verwenden, um den Wert für jede Beobachtung vorherzusagen, könnte dies zu einer höheren Variabilität des Vorhersagefehlers führen.

Ein weiterer Nachteil dieses Ansatzes besteht darin, dass er für so viele Modelle geeignet sein muss, dass er rechnerisch ineffizient und umständlich werden kann.

Wiederholter k-facher Kreuzvalidierungsansatz

Wir können eine wiederholte k-fache Kreuzvalidierung durchführen, indem wir einfach mehrmals eine k-fache Kreuzvalidierung durchführen. Der letzte Fehler ist der mittlere Fehler aus der Anzahl der Wiederholungen.

Das folgende Beispiel führt eine 5-fache Kreuzvalidierung durch, die viermal wiederholt wird:

#laden der dplyr Bibliothek zur Datenmanipulation
library(dplyr)

#Caret-Bibliothek laden, die zum Partitionieren von Daten in Trainings- und Test-Sets verwendet wird
library(caret)

#Machen Sie dieses Beispiel reproduzierbar
set.seed(0)

#Definieren Sie den Datensatz
data <- mtcars[ , c("mpg", "disp", "hp", "drat")]

#Definieren Sie die Anzahl der zu verwendenden Teilmengen und die Häufigkeit, mit der der k-fache Lebenslauf wiederholt wird
train_control <- trainControl(method = "repeatedcv", number = 5, repeats = 4)

#Trainieren Sie das Modell
model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control)

#Zusammenfassung der Ergebnisse
print(model)

#Lineare Regression 
#
#32 samples
# 3 predictor
#
#Keine Vorverarbeitung
#Resampling: Kreuzvalidiert (5 fach, 4 mal wiederholt) 
#Zusammenfassung der Stichprobengrößen: 26, 25, 26, 25, 26, 25, ... 
#Resampling-Ergebnisse:
#
#  RMSE      Rsquared   MAE     
#  3.176339  0.7909337  2.559131
#
#Der Abstimmungsparameter 'intercept' wurde konstant auf einem Wert von TRUE gehalten

Vor- und Nachteile dieses Ansatzes

Der Vorteil des wiederholten k-fachen Kreuzvalidierungsansatzes besteht darin, dass die Daten für jede Wiederholung in leicht unterschiedliche Teilmengen aufgeteilt werden, was eine noch unvoreingenommenere Schätzung des Vorhersagefehlers des Modells ergeben sollte. Der Nachteil dieses Ansatzes besteht darin, dass er rechenintensiv sein kann, da wir den Modellanpassungsprozess mehrmals wiederholen müssen.

So wählen Sie die Anzahl der Falten bei der Kreuzvalidierung aus

Der subjektivste Teil der Kreuzvalidierung besteht darin, zu entscheiden, wie viele Falten (d. H. Teilmengen) verwendet werden sollen. Im Allgemeinen sind die Fehlerschätzungen umso voreingenommener, je kleiner die Anzahl der Falten ist, aber desto weniger variabel sind sie. Umgekehrt sind die Fehlerschätzungen umso weniger verzerrt, je höher die Anzahl der Falten ist, aber desto höher ist die Variable.

Es ist auch wichtig, die Rechenzeit zu berücksichtigen. Für jede Falte müssen Sie ein neues Modell trainieren. Wenn dies ein langsamer Prozess ist, kann es lange dauern, wenn Sie eine hohe Anzahl von Falten wählen.

In der Praxis wird die Kreuzvalidierung normalerweise mit 5 oder 10 Falten durchgeführt, da dies ein ausgewogenes Verhältnis zwischen Variabilität und Verzerrung ermöglicht und gleichzeitig rechnerisch effizient ist.

Auswählen eines Modells nach Durchführung einer Kreuzvalidierung

Die Kreuzvalidierung wird verwendet, um den Vorhersagefehler eines Modells zu bewerten. Dies kann uns bei der Auswahl zwischen zwei oder mehr verschiedenen Modellen helfen, indem hervorgehoben wird, welches Modell den niedrigsten Vorhersagefehler aufweist (basierend auf RMSE, R-Quadrat usw.).

Sobald wir die Kreuzvalidierung verwendet haben, um das beste Modell auszuwählen, verwenden wir alle verfügbaren Daten, um sie an das ausgewählte Modell anzupassen. Wir verwenden nicht die tatsächlichen Modellinstanzen, die wir während der Kreuzvalidierung für unser endgültiges Modell trainiert haben.

Beispielsweise können wir die 5-fache Kreuzvalidierung verwenden, um zu bestimmen, welches Modell am besten zwischen zwei verschiedenen Regressionsmodellen verwendet werden kann. Sobald wir jedoch herausgefunden haben, welches Modell am besten verwendet werden kann, verwenden wir alle Daten, um sie an das endgültige Modell anzupassen. Mit anderen Worten, wir lassen beim Erstellen des endgültigen Modells keine der Falten aus.

Statistik: Der Weg zur Datenanalyse

* Amazon Affiliate Link


Das könnte Sie auch interessieren: