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:
- 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.
- 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.
- 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.
Source:
https://www.datacamp.com/tutorial/variance-inflation-factor