Variance Inflatie Factor (VIF): Het aanpakken van multicollineariteit in regressieanalyse

In regressieanalyse treedt multicollineariteit op wanneer onafhankelijke variabelen met elkaar gecorreleerd zijn. Dit maakt het moeilijk om de unieke invloed van elke predictor op de afhankelijke variabele te bepalen. Als gevolg hiervan heb je opgeblazen standaardfouten, wat op zijn beurt de significantie van coëfficiënten beïnvloedt.

De variantie-inflatiefactor (VIF) is een geweldig hulpmiddel om multicollineariteit te detecteren, en biedt inzichten die verder gaan dan eenvoudige paargewijze correlaties. Deze handleiding legt uit hoe VIF werkt, hoe je het kunt berekenen en interpreteren, en wat je moet doen als je hoge VIF-waarden vindt. Deze stappen helpen je als data professionals en data scientists om de stabiliteit van je model te verbeteren.

Hoewel VIF een belangrijk diagnostisch hulpmiddel is en het zeker de moeite waard is om te leren, vertegenwoordigt het slechts een klein deel van de bredere vaardigheden die je zult ontwikkelen in ons Machine Learning Scientist in Python carrièrepad, dus schrijf je vandaag nog in.

Wat is de Variantie-inflatiefactor (VIF)?

Ontwikkeld door statisticus Cuthbert Daniel, is VIF een veelgebruikt diagnostisch hulpmiddel in regressieanalyse om multicollineariteit te detecteren, wat bekend is om de stabiliteit en interpreteerbaarheid van regressiecoëfficiënten te beïnvloeden. Technisch gezien werkt VIF door te kwantificeren hoeveel de variantie van een regressiecoëfficiënt wordt opgeblazen door correlaties tussen voorspellers.

Dit alles is belangrijk omdat deze correlaties het moeilijk maken om het unieke effect van elke voorspeller op de doelvariabele te isoleren, wat leidt tot minder betrouwbare modelschattingen. Ik moet ook zeggen dat, om het juiste verhaal te vertellen, VIF altijd voor elke voorspeller in een model wordt berekend.

De formule voor de variantie-inflatiefactor

De VIF voor een voorspeller X wordt berekend als:

Waar:

  • R2 de determinatiecoëfficiënt is die wordt verkregen wanneer X wordt geregresseerd op alle andere voorspellers.

Stapsgewijze berekening

Het vinden van VIF is een driestappenproces. De eerste stap is om een afzonderlijk lineair regressiemodel te passen voor elke voorspeller tegen alle andere voorspellers. De tweede stap is om de R2-waarde voor elk model te verkrijgen. De laatste stap is om de VIF te berekenen met behulp van de bovenstaande formule.

Interpretatie van VIF-waarden

Hier volgt hoe VIF-waarden geïnterpreteerd kunnen worden om het niveau van multicollineariteit te begrijpen:

  • VIF = 1: Dit duidt op geen multicollineariteit. De voorspeller is niet gecorreleerd met andere voorspellers, dus het verhoogt de standaardfout niet en heeft geen invloed op de stabiliteit van het model.
  • VIF tussen 1 en 5: Dit suggereert matige multicollineariteit. Er is enige correlatie met andere voorspellers, maar meestal is dit niet ernstig. Het is echter de moeite waard om deze voorspellers in de gaten te houden om te zien of multicollineariteit een probleem wordt, vooral als andere VIF-waarden hoog zijn.
  • VIF > 5: Er is sprake van hoge multicollineariteit. De standaardfout van de voorspeller kan aanzienlijk worden opgeblazen, waardoor de betrouwbaarheid van de coëfficiënt kan afnemen. Overweeg stappen te ondernemen om de multicollineariteit te verminderen, zoals het verwijderen of combineren van gecorreleerde voorspellers.
  • VIF > 10: Dit duidt op ernstige multicollineariteit. De standaardfout van de voorspeller is sterk opgeblazen en de schatting van de coëfficiënt is waarschijnlijk onstabiel. Correctieve maatregelen, zoals het verwijderen van de voorspeller of het gebruik van regularisatietechnieken, zijn meestal nodig.

Als bijvoorbeeld de VIF van een voorspeller 10 is, geeft dit aan dat de variantie van de coëfficiënt van die voorspeller 10 keer zo groot is als wanneer er geen multicollineariteit zou zijn.

Hoe de VIF multicollineariteit verklaart in regressie

Multicollineariteit zorgt ervoor dat standaardfouten toenemen, waardoor het moeilijker wordt om de significantie van afzonderlijke voorspellers te beoordelen. Dit gebeurt omdat collineaire variabelen vergelijkbare informatie bevatten, waardoor het moeilijk is om hun specifieke individuele effecten op de uitkomstvariabele te scheiden.

Hoewel multicollineariteit niet per se schadelijk is voor het voorspellingsvermogen van het model, vermindert het de betrouwbaarheid en duidelijkheid van de coëfficiënten. Dit is vooral problematisch wanneer we de individuele impact van elke voorspeller willen begrijpen.

De variantie-inflatie factor (VIF) dient als een nauwkeurige diagnostische maatstaf om multicollineariteit te identificeren. In tegenstelling tot algemene observaties over correlatie isoleert VIF het gecombineerde effect van alle voorspellers op elke variabele, waarbij interacties worden benadrukt die mogelijk niet duidelijk zijn uit bivariate correlaties.

Variantie-Inflatie Factor in Python en R

Om dit uitvoerbaar te maken, zullen we een voorbeeld doorlopen in zowel Python als R met behulp van een unieke dataset. We zullen VIF berekenen met geautomatiseerde pakketten en ook met behulp van de VIF-formule om intuïtie op te bouwen. Om een goede praktijk te hebben, heb ik opzettelijk een dataset gemaakt waar we een hoge VIF-waarde zullen ontdekken voor een van onze variabelen, ook al is er geen zeer hoge paar correlatie tussen twee variabelen – dus ik denk dat het een overtuigend voorbeeld is. Laten we beginnen met een overzicht van de dataset die we zullen gebruiken.

Dataset Overzicht:

Deze fictieve dataset vertegenwoordigt de resultaten van een enquête uit een onderzoek dat werd uitgevoerd in 1.000 winkels van een detailhandelgigant. Klanten in elke winkel werd gevraagd om verschillende aspecten van hun winkelervaring te beoordelen op een schaal van -5 tot +5, waarbij -5 een zeer negatieve ervaring aangeeft, en +5 een zeer positieve ervaring aangeeft. Het gemiddelde van de klantbeoordelingen in elke winkel werd genomen over vier belangrijke parameters:

  • Ambiance: Klantperceptie van de omgeving van de winkel, zoals netheid, indeling, verlichting en algemene sfeer.

  • Klantenservice: Beoordeling van de service die door het winkelpersoneel wordt geboden, inclusief behulpzaamheid, vriendelijkheid en responsiviteit op de behoeften van de klant.

  • Aanbiedingen: Beoordeling van de promotieaanbiedingen, kortingen en deals die beschikbaar zijn voor klanten.

  • Product_range: Evaluatie van het assortiment en de kwaliteit van producten die beschikbaar zijn in de winkel.

De doelvariabele, Prestaties, meet de algehele prestaties van elke winkel. Het is echter niet relevant vanuit het VIF-perspectief. U kunt het gegevensbestand hier downloaden.

Variansinflatie factor in Python

We zullen beginnen met het berekenen van VIF-waarden met behulp van de Python-pakketten. De eerste stap is het laden van het dataset en de benodigde bibliotheken.

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()

De code hierboven zal de gegevens laden en de eerste vijf records weergeven.

Als volgende stap kunnen we een correlatiematrix uitvoeren om te controleren op onderlinge correlatie.

De onderstaande code selecteert vier kolommen en slaat deze op in een nieuwe DataFrame genaamd correl_data. Vervolgens berekent het de paargewijze correlatiematrix met behulp van de .corr() functie. Het resultaat wordt opgeslagen in het object corr_matrix, dat een tabel is die de correlatiecoëfficiënten tussen elk paar van de geselecteerde kolommen toont.

De matrix wordt vervolgens gevisualiseerd met behulp van Seaborn’s heatmap() functie, waarbij elke correlatiecoëfficiënt wordt weergegeven als een kleurgecodeerde cel, waarbij blauw negatieve correlaties en rood positieve correlaties vertegenwoordigt, op basis van de coolwarm kleurenkaart.

correl_data = datacamp_retail_data[['Ambience', 'Customer_service', 'Offers', 'Product_range']] # Bereken de paargewijze correlatiematrix corr_matrix = correl_data.corr() # Visualiseer de correlatiematrix plt.figure(figsize=(10, 8)) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1) plt.title('Pairwise Correlation Matrix') plt.show()

Uitgang:

  Correlatie tussen de variabelen. Afbeelding van Auteur

De plot geeft een visuele samenvatting van de relaties tussen variabelen in correl_data. De correlatie waarden variëren van -1 tot 1, waar waarden dichter bij 1 een sterke positieve correlatie aangeven, waarden dichter bij -1 een sterke negatieve correlatie aangeven, en waarden rond 0 suggereren geen correlatie. Het is duidelijk dat er geen sterke paarwijze correlatie is tussen de variabelen, waarbij geen van de correlatiewaarden zelfs groter is dan 0.6.

De volgende stap is het berekenen van de VIF-waarden voor de voorspellende variabelen. De onderstaande code berekent de waarden voor elke voorspellende variabele in de dataset om multicollineariteit te controleren.

Eerst definieert het X door de doelkolom Prestatie te verwijderen en een intercept toe te voegen. Vervolgens maakt het een DataFrame, datacamp_vif_data, om de namen van de voorspellers en hun VIF-waarden op te slaan. Met een lus berekent het vervolgens de VIF voor elke voorspeller met de variance_inflation_factor() functie, waarbij hogere VIFs duiden op de aanwezigheid van multicollineariteit.

# Definieer de voorspellende variabelen X = datacamp_retail_data.drop(columns=['Performance']) # Voeg een constante toe aan het model (intercept) X = add_constant(X) # Bereken VIF voor elke functie 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)

Output:

Output toont de VIF-waarden. Afbeelding door auteur

Deze output toont de VIF-waarde voor elke voorspellende variabele, wat de niveaus van multicollineariteit in de dataset aangeeft. De rij const vertegenwoordigt de intercept term, met een VIF-waarde dicht bij 1, wat betekent dat het geen multicollineariteit heeft. Onder de voorspellende variabelen heeft Product_range de hoogste VIF-waarde (5,94), wat suggereert dat het corrigerende maatregelen nodig heeft. Alle andere voorspellers hebben VIF-waarden onder de 3, wat duidt op een lage multicollineariteit.

Handmatige benadering van VIF-berekening

De andere benadering is om de waarden apart te berekenen door elke onafhankelijke variabele te regresseren tegen de andere voorspellende variabelen.

Hoe het werkt is dat voor elke functie in retail_data, het die functie als de afhankelijke variabele (y) instelt en de overige functies als onafhankelijke variabelen (X). Er wordt vervolgens een lineair regressiemodel aangepast om y te voorspellen met behulp van X, en de R-kwadraatwaarde van het model wordt gebruikt om de VIF te berekenen met behulp van de formule die we besproken hebben in het initiële gedeelte.

Vervolgens worden elke functie en de bijbehorende VIF-waarden opgeslagen in een dictionary (vif_manual), die vervolgens wordt omgezet in een DataFrame (vif_manual_df) voor weergave.

datacamp_retail_data = retail_data.drop(columns=['Performance']) # Handmatige VIF-berekening vif_manual = {} for feature in retail_data.columns: # Definieer de doelvariabele (huidige functie) en voorspellers (alle andere functies) y = datacamp_retail_data[feature] X = datacamp_retail_data.drop(columns=[feature]) # Pas het lineaire regressiemodel toe model = LinearRegression().fit(X, y) # Bereken R-kwadraat r_squared = model.score(X, y) # Bereken VIF vif = 1 / (1 - r_squared) vif_manual[feature] = vif # Zet de dictionary om naar een DataFrame voor betere weergave vif_manual_df = pd.DataFrame(list(vif_manual.items()), columns=['Feature', 'VIF']) print(vif_manual_df)

 Uitvoer:

Uitvoer met de VIF-waarden. Afbeelding door Auteur

De output toont elk kenmerk samen met zijn VIF-waarde, wat helpt bij het identificeren van mogelijke multicollineariteitsproblemen. Je kunt zien dat het resultaat duidelijk hetzelfde is als wat we hierboven hebben gekregen; en dus zal ook de interpretatie hetzelfde zijn, namelijk dat de variabele Product_range multicollineariteit vertoont.

Variance inflation factor in R

In dit gedeelte zullen we de oefening van de bovenstaande variantie-inflatiefactor herhalen in de Python-sectie, vooral voor ontwikkelaars die werken met de programmeertaal R. We beginnen met het laden van de dataset en de benodigde bibliotheken.

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

Output:

De volgende stap is het berekenen van de paarsgewijze correlatiematrix en deze visualiseren met de heatmap. De functies cor() en corrplot helpen ons deze taak te volbrengen.

# Verwijder de doelkolom predictors_data <- data[, !(names(data) %in% "Performance")] # Bereken de correlatiematrix correlation_matrix <- cor(predictors_data) # Plot de correlatie heatmap # Laad de benodigde bibliotheken library(ggplot2) library(reshape2) melted_corr_matrix <- melt(correlation_matrix) # Plot de heatmap met 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() + # Minimaal thema voor een strak uiterlijk theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + labs(x = "", y = "") + # Verwijder aslabels geom_text(aes(Var1, Var2, label = round(value, 2)), color = "black", size = 4) + theme(axis.text=element_text(size=15))

Output:

Correlatie tussen de variabelen. Afbeelding van auteur

Het is duidelijk uit de correlatie heatmap dat er geen sterke paar correlatie is tussen de variabelen, waarbij geen van de correlatiewaarden zelfs groter is dan 0.6. Nu zullen we de VIF-waarden berekenen en kijken of er iets alarmerends is. De volgende regel code voert die taak uit.

# Pas een regressiemodel toe model <- lm(Performance ~ Ambience + Customer_service + Offers + Product_range, data = data) # Bereken VIF vif(model)

Output:

Uit de output kunnen we zien dat onder de voorspellende variabelen alleen de variabele Product_range een VIF-waarde heeft die groter is dan 5, wat wijst op hoge multicollineariteit die corrigerende maatregelen vereist.

Handmatige benadering van VIF-berekening

De andere benadering voor VIF-berekening zou zijn om de VIF-waarden voor elke variabele afzonderlijk te berekenen door elke onafhankelijke variabele te regresseren tegen de andere voorspellende variabelen.

Dit wordt uitgevoerd in de onderstaande code, die de sapply()-functie gebruikt over elke voorspeller, waarbij elke voorspeller als afhankelijke variabele wordt ingesteld in een lineair regressiemodel met de andere voorspellers als onafhankelijke variabelen.

De R-kwadraat waarde uit elk model wordt vervolgens gebruikt om de VIF-waarden te berekenen met behulp van de formule. Uiteindelijk geeft het resultaat, vif_values, de VIF voor elke voorspeller weer, wat helpt bij het identificeren van multilineariteitsproblemen.

# VIF-berekening voor elke voorspeller handmatig 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)

Output:

We krijgen hetzelfde resultaat en het is duidelijk dat de variabele Product_range met een hoge VIF-waarde boven 5 ingrijpen vereist.

VIF vs. Correlatiematrix en Andere Methoden

Ter herinnering, hier zijn de populaire methoden om multilineariteit op te sporen:

  • Hoge VIF-waarden: Een hoge VIF-waarde is een duidelijke indicator van multicollineariteit. Wanneer deze waarden bepaalde drempels overschrijden, geven ze aan dat een voorspeller sterk gerelateerd is aan andere voorspellers, wat de stabiliteit, betrouwbaarheid en prestaties van het model kan beïnvloeden.
  • Correlatiematrixen: Door een correlatiematrix te onderzoeken, kunt u de onderlinge correlaties tussen voorspellers zien. Hoge onderlinge correlaties suggereren multicollineariteit tussen die specifieke voorspellers. Deze methode detecteert echter alleen directe lineaire relaties tussen twee variabelen en kan multicollineariteit missen die betrekking heeft op complexere interacties tussen meerdere variabelen.
  • Coefficiëntveranderingen: Als de coëfficiënten van voorspellers aanzienlijk veranderen wanneer u andere variabelen toevoegt of verwijdert uit het model, kan dit een teken zijn van multicollineariteit. Dergelijke schommelingen geven aan dat bepaalde voorspellers mogelijk gemeenschappelijke informatie delen, waardoor het moeilijker wordt om de unieke impact van elke variabele op de uitkomst te identificeren.

Onder al deze methoden is VIF bijzonder nuttig omdat het multicollineariteit kan detecteren zelfs wanneer de onderlinge correlaties laag zijn, zoals we zagen in ons eigen voorbeeld. Dit maakt VIF een meer omvattend instrument.

Aanvullende ideeën over hoe om te gaan met hoge VIF-waarden

Als VIF-waarden wijzen op hoge multicollineariteit, en u niet per se gewoon de variabele wilt verwijderen, zijn er enkele andere, meer geavanceerde strategieën om multicollineariteit te verminderen:

  1. Kenmerkselectie: Verwijder een van de sterk gecorreleerde voorspellers en herbereken de VIF om te zien of dit helpt om het model te vereenvoudigen en de stabiliteit te verbeteren.
  2. Principal Component Analysis (PCA): Gebruik PCA om je voorspellers te combineren tot een kleinere set van ongecorreleerde componenten. Hiermee worden de oorspronkelijke variabelen omgezet in nieuwe, onafhankelijke en ongecorreleerde variabelen die het grootste deel van de variatie in de gegevens vastleggen, waardoor multicollineariteit wordt aangepakt zonder waardevolle informatie te verliezen.
  3. Regularisatietechnieken: Pas ridge- of lasso-regressie toe, die straftermen aan het model toevoegen. Deze technieken helpen multicollineariteit te verminderen door de invloed van gecorreleerde variabelen te verkleinen, waardoor het model stabieler en betrouwbaarder wordt.

Conclusie

Het kennen van het gebruik van VIF is essentieel om multicollineariteit te identificeren en op te lossen, wat de nauwkeurigheid en duidelijkheid van regressiemodellen verbetert. Regelmatig controleren van VIF-waarden en het toepassen van corrigerende maatregelen wanneer nodig helpt data-professionals en analisten modellen te bouwen waar ze op kunnen vertrouwen. Deze aanpak zorgt ervoor dat het effect van elke voorspeller duidelijk is, waardoor het gemakkelijker wordt om betrouwbare conclusies te trekken uit het model en betere beslissingen te nemen op basis van de resultaten. Neem onze Machine Learning Scientist in Python carrièretrack om echt te begrijpen hoe je modellen kunt bouwen en gebruiken. Bovendien staat de voltooiing van het programma goed op een cv.

Ook, voor verdere leerervaring, overweeg het verkennen van de volgende bronnen van de DataCamp-blog en zelfstudiegedeeltes:

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