Variance Inflation Factor (VIF): Umgang mit Multikollinearität in der Regressionsanalyse

In der Regressionsanalyse tritt Multikollinearität auf, wenn unabhängige Variablen miteinander korreliert sind. Dies erschwert die Bestimmung des einzigartigen Einflusses jedes Prädiktors auf die abhängige Variable. Als Ergebnis haben Sie aufgeblähte Standardfehler, die wiederum die Signifikanz der Koeffizienten beeinflussen.

Der Varianzinflationsfaktor (VIF) ist ein großartiges Werkzeug zur Erkennung von Multikollinearität, das Einblicke jenseits einfacher paarweiser Korrelationen bietet. Dieses Tutorial erklärt, wie der VIF funktioniert, wie man ihn berechnet und interpretiert und was zu tun ist, wenn hohe VIF-Werte festgestellt werden. Diese Schritte helfen Ihnen als Datenprofis und Datenwissenschaftler dabei, die Stabilität Ihres Modells zu verbessern.

Obwohl der VIF ein wichtiges Diagnosewerkzeug ist und es sich lohnt, ihn zu lernen, stellt er nur einen kleinen Teil des breiteren Fähigkeitsspektrums dar, das Sie in unserem Karriereweg als Machine Learning Scientist in Python entwickeln werden. Melden Sie sich also noch heute an.

Was ist der Varianzinflationsfaktor (VIF)?

Entwickelt von dem Statistiker Cuthbert Daniel, ist VIF ein weit verbreitetes Diagnosewerkzeug in der Regressionsanalyse zur Erkennung von Multikollinearität, die bekanntermaßen die Stabilität und Interpretierbarkeit von Regressionskoeffizienten beeinflusst. Technisch gesehen funktioniert VIF, indem es quantifiziert, wie sehr die Varianz eines Regressionskoeffizienten aufgrund von Korrelationen zwischen Prädiktoren aufgebläht wird.

All dies ist wichtig, weil diese Korrelationen es schwierig machen, den eindeutigen Effekt jedes Prädiktors auf die Zielvariable zu isolieren, was zu weniger zuverlässigen Schätzwerten des Modells führt. Ich sollte auch erwähnen, dass, um die richtige Geschichte wirklich zu erzählen, der VIF immer für jeden Prädiktor in einem Modell berechnet wird.

Die Formel für den Varianzinflationsfaktor

Der VIF für einen Prädiktor X wird wie folgt berechnet:

Wo:

  • R2 ist der Bestimmtheitskoeffizient, der erhalten wird, wenn X auf alle anderen Prädiktoren regressiert wird.

Schritt-für-Schritt-Berechnung

Die Berechnung des VIF ist ein dreistufiger Prozess. Der erste Schritt besteht darin, ein separates lineares Regressionsmodell für jeden Prädiktor gegen alle anderen Prädiktoren anzupassen. Der zweite Schritt besteht darin, den R2-Wert für jedes Modell zu erhalten. Der letzte Schritt besteht darin, den VIF mithilfe der obigen Formel zu berechnen.

Interpretation der VIF-Werte

So interpretieren Sie die VIF-Werte, um das Ausmaß der Multikollinearität zu verstehen:

  • VIF = 1: Dies deutet auf keine Multikollinearität hin. Der Prädiktor korreliert nicht mit anderen Prädiktoren, daher wird der Standardfehler nicht aufgebläht und die Stabilität des Modells nicht beeinflusst.
  • VIF zwischen 1 und 5: Dies deutet auf moderate Multikollinearität hin. Es gibt eine gewisse Korrelation mit anderen Prädiktoren, aber normalerweise ist sie nicht schwerwiegend. Es lohnt sich jedoch, diese Prädiktoren im Auge zu behalten, um zu sehen, ob die Multikollinearität zu einem Problem wird, insbesondere wenn andere VIF-Werte hoch sind.
  • VIF > 5: Hohe Multikollinearität liegt vor. Der Standardfehler des Prädiktors kann deutlich vergrößert sein, was den Koeffizienten weniger zuverlässig macht. Erwägen Sie Schritte zur Reduzierung der Multikollinearität, wie das Entfernen oder Kombinieren korrelierter Prädiktoren.
  • VIF > 10: Dies signalisiert ernsthafte Multikollinearität. Der Standardfehler des Prädiktors ist stark vergrößert, und seine Koeffizientschätzung ist wahrscheinlich instabil. Korrekturmaßnahmen, wie das Entfernen des Prädiktors oder die Verwendung von Regularisierungstechniken, sind normalerweise erforderlich.

Beispielsweise zeigt ein VIF von 10 eines Prädiktors an, dass die Varianz des Koeffizienten dieses Prädiktors 10 Mal so groß ist wie ohne Multikollinearität.

Wie das VIF die Multikollinearität in der Regression erklärt

Multikollinearität führt dazu, dass Standardfehler zunehmen, was es schwieriger macht, die Signifikanz einzelner Prädiktoren zu bewerten. Dies geschieht, weil kollineare Variablen ähnliche Informationen tragen, was es schwierig macht, ihre spezifischen individuellen Effekte auf die Zielvariable zu trennen.

Obwohl Multikollinearität das Modell nicht unbedingt daran hindert, Vorhersagen zu treffen, verringert sie die Zuverlässigkeit und Klarheit der Koeffizienten. Dies ist besonders problematisch, wenn wir den individuellen Einfluss jedes Prädiktors verstehen wollen.

Der Varianzinflationsfaktor (VIF) dient als präzises diagnostisches Maß, um Multikollinearität zu identifizieren. Im Gegensatz zu allgemeinen Beobachtungen über Korrelationen isoliert VIF den kombinierten Effekt aller Prädiktoren auf jede Variable und hebt Interaktionen hervor, die aus paarweisen Korrelationen nicht ersichtlich sein könnten.

Varianzinflationsfaktor in Python und R

Um dies umsetzbar zu machen, gehen wir anhand eines Beispiels sowohl in Python als auch in R mit einem einzigartigen Datensatz vor. Wir werden den VIF mithilfe automatisierter Pakete berechnen und auch die VIF-Formel verwenden, um ein Verständnis aufzubauen. Um eine gute Übung zu haben, habe ich absichtlich einen Datensatz erstellt, bei dem wir einen hohen VIF-Wert für eine unserer Variablen entdecken werden, obwohl es keine sehr hohe paarweise Korrelation zwischen zwei Variablen gibt – also denke ich, dass es ein überzeugendes Beispiel ist. Beginnen wir mit einem Überblick über den Datensatz, den wir verwenden werden.

Datensatzübersicht:

Dieser fiktive Datensatz repräsentiert Umfrageergebnisse einer Studie, die in 1.000 Filialen eines Einzelhandelsriesen durchgeführt wurde. Kunden in jeder Filiale wurden gebeten, verschiedene Aspekte ihres Einkaufserlebnisses auf einer Skala von -5 bis +5 zu bewerten, wobei -5 eine sehr negative Erfahrung und +5 eine sehr positive Erfahrung angibt. Der Durchschnitt der Kundenbewertungen in jeder Filiale wurde über vier Schlüsselparameter hinweg ermittelt:

  • Ambiente: Kund*innenwahrnehmung der Umgebung des Geschäfts, wie Sauberkeit, Layout, Beleuchtung und allgemeine Atmosphäre.

  • Kundenservice: Bewertung des von den Mitarbeiter*innen des Geschäfts gebotenen Service, einschließlich Hilfsbereitschaft, Freundlichkeit und Reaktionsschnelligkeit auf die Bedürfnisse der Kund*innen.

  • Angebote: Bewertung der Werbeangebote, Rabatte und Deals, die den Kunden zur Verfügung stehen.

  • Product_range: Bewertung der Vielfalt und Qualität der im Geschäft verfügbaren Produkte.

Die Zielvariable Performance misst die Gesamtleistung jedes Geschäfts. Allerdings ist sie aus der Sicht des VIF nicht relevant. Sie können den Datensatz hier herunterladen.

Varianzinflationsfaktor in Python

Wir beginnen damit, die VIF-Werte mithilfe der Python-Pakete zu berechnen. Der erste Schritt besteht darin, den Datensatz und die erforderlichen Bibliotheken zu laden.

from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from statsmodels.stats.outliers_influence import variance_inflation_factor from statsmodels.tools.tools import add_constant datacamp_retail_data = pd.read_csv(' vif_data.csv') datacamp_retail_data.head()

Der obige Code lädt die Daten und zeigt die ersten fünf Datensätze an.

Als nächster Schritt können wir eine Korrelationsmatrix ausführen, um nach paarweisen Korrelationen zu suchen.

Der folgende Code wählt vier Spalten aus und speichert sie in einem neuen DataFrame namens correl_data. Es berechnet dann die paarweise Korrelationsmatrix mit der Funktion .corr(). Das Ergebnis wird im Objekt corr_matrix gespeichert, welches eine Tabelle mit den Korrelationskoeffizienten zwischen jedem Paar der ausgewählten Spalten darstellt. 

Die Matrix wird dann mit der Funktion heatmap() von Seaborn visualisiert, wobei jeder Korrelationskoeffizient als farbcodierter Zelle dargestellt wird, wobei Blau negative Korrelationen und Rot positive Korrelationen basierend auf der Farbkarte coolwarm darstellt. 

correl_data = datacamp_retail_data[['Ambience', 'Customer_service', 'Offers', 'Product_range']] # Berechnen der paarweisen Korrelationsmatrix corr_matrix = correl_data.corr() # Visualisierung der Korrelationsmatrix plt.figure(figsize=(10, 8)) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1) plt.title('Pairwise Correlation Matrix') plt.show()

Ausgabe:

  Korrelation zwischen den Variablen. Bild von Autor

Das Diagramm bietet eine visuelle Zusammenfassung der Beziehungen zwischen den Variablen in correl_data. Die Korrelationswerte reichen von -1 bis 1, wobei Werte nahe 1 eine starke positive Korrelation anzeigen, Werte nahe -1 eine starke negative Korrelation anzeigen und Werte um 0 auf keine Korrelation hindeuten. Es ist offensichtlich, dass keine starken paarweisen Korrelationen zwischen den Variablen bestehen, da keiner der Korrelationswerte sogar größer als 0,6 ist. 

Der nächste Schritt besteht darin, die VIF-Werte für die Prädiktorvariablen zu berechnen. Der folgende Code berechnet die Werte für jede Prädiktorvariable im Datensatz, um auf Multikollinearität zu prüfen.

Zunächst definiert er X, indem die Zielspalte Performance entfernt und ein Intercept hinzugefügt wird. Anschließend wird ein DataFrame datacamp_vif_data erstellt, um die Prädiktorvariablennamen und ihre VIF-Werte zu speichern. Mithilfe einer Schleife berechnet er dann den VIF für jeden Prädiktor mit der variance_inflation_factor()-Funktion, wobei höhere VIFs auf das Vorhandensein von Multikollinearität hinweisen.

# Definiere die Prädiktorvariablen X = datacamp_retail_data.drop(columns=['Performance']) # Füge dem Modell eine Konstante hinzu (Intercept) X = add_constant(X) # Berechne den VIF für jedes Merkmal datacamp_vif_data = pd.DataFrame() datacamp_vif_data['Feature'] = X.columns datacamp_vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] print(datacamp_vif_data)

Ausgabe:

Ausgabe der VIF-Werte. Bild von Autor

Dieser Output zeigt den VIF-Wert für jede Prädiktorvariable und gibt Aufschluss über die Multikollinearitätsniveaus im Datensatz. Die Zeile const repräsentiert den Intercept-Term, mit einem VIF-Wert nahe bei 1, was bedeutet, dass keine Multikollinearität vorliegt. Unter den Prädiktorvariablen hat Product_range den höchsten VIF-Wert (5,94), was darauf hinweist, dass hier Korrekturmaßnahmen erforderlich sind. Alle anderen Prädiktoren haben VIF-Werte unter 3, was auf geringe Multikollinearität hindeutet.

Manueller Ansatz zur VIF-Berechnung

Ein anderer Ansatz besteht darin, die Werte separat zu berechnen, indem jede unabhängige Variable gegen die anderen Prädiktorvariablen regressiert wird.

Das Verfahren funktioniert so, dass für jedes Merkmal in retail_data dieses Merkmal als abhängige Variable (y) festgelegt wird und die verbleibenden Merkmale als unabhängige Variablen (X). Ein lineares Regressionsmodell wird dann angepasst, um y unter Verwendung von X vorherzusagen, und der R-Quadrat-Wert des Modells wird verwendet, um den VIF-Wert mithilfe der Formel zu berechnen, über die wir im ersten Abschnitt gesprochen haben.

Anschließend werden jede Funktion und ihre entsprechenden VIF-Werte in einem Wörterbuch (vif_manual) gespeichert, das dann in ein DataFrame (vif_manual_df) für die Anzeige umgewandelt wird.

datacamp_retail_data = retail_data.drop(columns=['Performance']) # Manuelle VIF-Berechnung vif_manual = {} for feature in retail_data.columns: # Definieren der Zielvariablen (aktuelle Funktion) und Prädiktoren (alle anderen Funktionen) y = datacamp_retail_data[feature] X = datacamp_retail_data.drop(columns=[feature]) # Passen des linearen Regressionsmodells an model = LinearRegression().fit(X, y) # Berechnen von R-Quadrat r_squared = model.score(X, y) # Berechnen von VIF vif = 1 / (1 - r_squared) vif_manual[feature] = vif # Das Wörterbuch in ein DataFrame für eine bessere Anzeige umwandeln vif_manual_df = pd.DataFrame(list(vif_manual.items()), columns=['Feature', 'VIF']) print(vif_manual_df)

 Ausgabe:

Anzeige der VIF-Werte. Bild von Autor

Die Ausgabe zeigt jedes Merkmal zusammen mit seinem VIF-Wert, um potenzielle Multikollinearitätsprobleme zu identifizieren. Sie können sehen, dass das Ergebnis offensichtlich dasselbe ist wie oben; und so wird auch seine Interpretation sein, nämlich dass die Variable Produktbereich Multikollinearität aufweist.

Varianzinflationsfaktor in R

In diesem Abschnitt werden wir die Übung des obigen Varianzinflationsfaktors im Python-Abschnitt wiederholen, insbesondere für Entwickler, die mit der R-Programmiersprache arbeiten. Wir beginnen damit, den Datensatz und die erforderlichen Bibliotheken zu laden.

library(tidyverse) library(car) library(corrplot) data <- read.csv('vif_data.csv') str(data)

Ausgabe:

Der nächste Schritt besteht darin, die paarweise Korrelationsmatrix zu berechnen und sie mit dem Heatmap zu visualisieren. Die Funktionen cor() und corrplot helfen uns dabei, diese Aufgabe zu erledigen.

# Entferne die Zielspalte predictors_data <- data[, !(names(data) %in% "Performance")] # Berechne die Korrelationsmatrix correlation_matrix <- cor(predictors_data) # Plotte das Korrelations-Heatmap # Lade erforderliche Bibliotheken library(ggplot2) library(reshape2) melted_corr_matrix <- melt(correlation_matrix) # Plotte das Heatmap mit ggplot2 ggplot(data = melted_corr_matrix, aes(x = Var1, y = Var2, fill = value)) + geom_tile(color = "white") + scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit = c(-1, 1), space = "Lab", name="Correlation") + theme_minimal() + # Minimal Theme für ein sauberes Aussehen theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + labs(x = "", y = "") + # Entferne Achsenbeschriftungen geom_text(aes(Var1, Var2, label = round(value, 2)), color = "black", size = 4) + theme(axis.text=element_text(size=15))

Ausgabe:

Korrelation zwischen den Variablen. Bild von Autor

Es ist offensichtlich aus dem Korrelations-Heatmap, dass es keine starken paarweisen Korrelationen zwischen den Variablen gibt, wobei keine der Korrelationswerte sogar größer als 0,6 ist. Jetzt werden wir die VIF-Werte berechnen und sehen, ob es etwas Alarmierendes gibt. Die folgende Codezeile erledigt diese Aufgabe.

# Füge ein Regressionsmodell hinzu model <- lm(Performance ~ Ambience + Customer_service + Offers + Product_range, data = data) # Berechne VIF vif(model)

Ausgabe:

Aus der Ausgabe können wir sehen, dass unter den Prädiktorvariablen nur die Variable Product_range einen VIF-Wert größer als 5 aufweist, was auf eine hohe Multikollinearität hinweist, die korrigierende Maßnahmen erfordert.

Manueller Ansatz zur VIF-Berechnung

Der andere Ansatz zur VIF-Berechnung wäre, die VIF-Werte für jede Variable separat zu berechnen, indem jede unabhängige Variable gegen die anderen Prädiktorvariablen regressiert wird.

Dies wird im folgenden Code durchgeführt, der die Funktion sapply() über jeden Prädiktor verwendet, wobei jeder Prädiktor als abhängige Variable in einem linearen Regressionsmodell mit den anderen Prädiktoren als unabhängige Variablen festgelegt ist.

Der R-Quadrat-Wert jedes Modells wird dann verwendet, um die VIF-Werte mit seiner Formel zu berechnen. Schließlich zeigt das Ergebnis, vif_values, den VIF-Wert für jeden Prädiktor an und hilft bei der Identifizierung von Multikollinearitätsproblemen.

# VIF-Berechnung für jeden Prädiktor manuell predictors <- c("Ambience", "Customer_service", "Offers", "Product_range") vif_values <- sapply(predictors, function(pred) { formula <- as.formula(paste(pred, "~ .")) model <- lm(formula, data = data[, predictors]) 1 / (1 - summary(model)$r.squared) }) print(vif_values)

Ausgabe:

Wir erhalten das gleiche Ergebnis und es ist offensichtlich, dass die Variable Product_range mit einem hohen VIF-Wert über 5 eingreifen muss.

VIF vs. Korrelationsmatrix und andere Methoden

Zur Zusammenfassung, hier sind die beliebten Methoden zur Erkennung von Multikollinearität:

  • Hohe VIF-Werte: Ein hoher VIF-Wert ist ein deutlicher Indikator für Multikollinearität. Wenn diese Werte bestimmte Schwellenwerte überschreiten, deutet dies darauf hin, dass ein Prädiktor stark mit anderen Prädiktoren zusammenhängt, was die Stabilität, Zuverlässigkeit und Leistung des Modells beeinträchtigen kann.
  • Korrelationsmatrizen: Durch die Untersuchung einer Korrelationsmatrix können Sie die paarweisen Korrelationen zwischen Prädiktoren sehen. Hohe paarweise Korrelationen deuten auf Multikollinearität zwischen diesen spezifischen Prädiktoren hin. Dieses Verfahren erkennt jedoch nur direkte lineare Beziehungen zwischen zwei Variablen und kann Multikollinearität übersehen, die komplexere Interaktionen zwischen mehreren Variablen beinhaltet.
  • Koeffizientenänderungen: Wenn die Koeffizienten der Prädiktoren sich signifikant ändern, wenn Sie andere Variablen zum Modell hinzufügen oder entfernen, kann dies ein Anzeichen für Multikollinearität sein. Solche Schwankungen deuten darauf hin, dass bestimmte Prädiktoren möglicherweise gemeinsame Informationen teilen, was es schwieriger macht, den einzigartigen Einfluss jeder Variablen auf das Ergebnis zu identifizieren.

Unter all diesen Methoden ist der VIF besonders nützlich, da er Multikollinearität auch dann erkennen kann, wenn die paarweisen Korrelationen niedrig sind, wie wir in unserem eigenen Beispiel gesehen haben. Dies macht den VIF zu einem umfassenderen Werkzeug.

Zusätzliche Ideen, wie man hohe VIF-Werte angehen kann

Wenn die VIF-Werte auf eine hohe Multikollinearität hinweisen und Sie die Variable nicht unbedingt entfernen möchten, gibt es einige andere, fortgeschrittenere Strategien zur Minderung von Multikollinearität:

  1. Merkmalsauswahl: Entfernen Sie einen der stark korrelierten Prädiktoren und berechnen Sie erneut den VIF, um zu sehen, ob dies dazu beiträgt, das Modell zu vereinfachen und die Stabilität zu verbessern.
  2. Hauptkomponentenanalyse (PCA): Verwenden Sie PCA, um Ihre Prädiktoren in eine kleinere Menge unkorrelierter Komponenten zu kombinieren. Dies transformiert die ursprünglichen Variablen in neue, unabhängige und unkorrelierte Variablen, die den Großteil der Datenvariation erfassen und dabei helfen, Multikollinearität zu behandeln, ohne wertvolle Informationen zu verlieren.
  3. Regulierungstechniken: Wenden Sie Ridge- oder Lasso-Regression an, die Strafterme zum Modell hinzufügen. Diese Techniken helfen, Multikollinearität zu reduzieren, indem sie den Einfluss korrelierter Variablen verringern und das Modell stabiler und zuverlässiger machen.

Schluss

Zu wissen, wie man VIF verwendet, ist entscheidend, um Multikollinearität zu identifizieren und zu beheben, was die Genauigkeit und Klarheit von Regressionsmodellen verbessert. Durch regelmäßige Überprüfung der VIF-Werte und Anwendung von Korrekturmaßnahmen, wenn nötig, können Datenprofis und Analysten Modelle aufbauen, denen sie vertrauen können. Dieser Ansatz gewährleistet, dass der Effekt jedes Prädiktors klar ist, was es einfacher macht, verlässliche Schlussfolgerungen aus dem Modell zu ziehen und bessere Entscheidungen auf Grundlage der Ergebnisse zu treffen. Nehmen Sie an unserem Karriereweg Machine Learning Scientist in Python teil, um wirklich zu verstehen, wie man Modelle erstellt und verwendet. Außerdem sieht der Abschluss des Programms im Lebenslauf gut aus.

Außerdem sollten Sie für weiteres Lernen erwägen, die folgenden Ressourcen aus dem DataCamp-Blog und den Tutorial-Abschnitten zu erkunden:

Source:
https://www.datacamp.com/tutorial/variance-inflation-factor