該圖提供了變量在correl_data
中的關係的視覺摘要。相關值的範圍從-1到1,值越接近1表示強正相關,值越接近-1表示強負相關,值接近0表明沒有相關性。顯而易見的是,變量之間沒有強烈的成對相關,沒有任何相關值大於甚至0.6。
接下來的步驟是計算預測變數的VIF值。以下的程式碼計算資料集中每個預測變數的值,以檢查多重共線性。
首先,它通過刪除目標列Performance
並添加一個截距來定義X
。然後,創建一個DataFrame,datacamp_vif_data
,來存儲預測變數的名稱和它們的VIF值。使用循環,它通過variance_inflation_factor()
函數計算每個預測變數的VIF值,較高的VIF值表示存在多重共線性。
# 定義預測變數 X = datacamp_retail_data.drop(columns=['Performance']) # 將一個常數添加到模型中(截距) X = add_constant(X) # 為每個特徵計算VIF 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)
輸出:
顯示VIF值的輸出。作者提供的圖像
此輸出顯示了每個預測變量的VIF值,這些值表示數據集中的多重共線性水平。const
行代表截距項,其VIF接近1,表示沒有多重共線性。在預測變量中,Product_range
的VIF值最高(5.94),這表明需要採取糾正措施。所有其他預測變量的VIF值均低於3,表示多重共線性低。
通過手動方法計算VIF
另一種方法是通過將每個獨立變量與其他預測變量進行回歸分析來分別計算這些值。
其工作原理是對於retail_data
中的每個特徵,將該特徵設置為因變量(y),將其餘特徵設置為自變量(X)。然後,擬合線性回歸模型以使用X預測y,並使用模型的R平方值使用我們在初始部分討論的公式來計算VIF。
接下來,每個特徵及其對應的VIF值都存儲在一個字典(vif_manual
)中,然後轉換為一個DataFrame(vif_manual_df
)以進行顯示。
datacamp_retail_data = retail_data.drop(columns=['Performance']) # 手動計算VIF vif_manual = {} for feature in retail_data.columns: # 定義目標變量(當前特徵)和預測變量(所有其他特徵) y = datacamp_retail_data[feature] X = datacamp_retail_data.drop(columns=[feature]) # 配適線性回歸模型 model = LinearRegression().fit(X, y) # 計算R平方 r_squared = model.score(X, y) # 計算VIF vif = 1 / (1 - r_squared) vif_manual[feature] = vif # 將字典轉換為DataFrame以進行更好的顯示 vif_manual_df = pd.DataFrame(list(vif_manual.items()), columns=['Feature', 'VIF']) print(vif_manual_df)
輸出:
顯示VIF值的輸出。作者提供圖片
輸出顯示每個特徵及其VIF值,有助於識別潛在的多重共線性問題。你可以看到結果顯然與我們上面得到的結果相同;因此其解釋也將是,即Product_range
變數正在表現出多重共線性。
在R中的方差膨脹因子
在這一部分中,我們將重複進行上面在Python部分中的方差膨脹因子的練習,特別是針對那些使用R編程語言的開發人員。我們首先加載數據集和必要的庫。
library(tidyverse) library(car) library(corrplot) data <- read.csv('vif_data.csv') str(data)
輸出:
下一步是計算成對相關矩陣,並通過熱圖可視化它。cor()
和corrplot
函數幫助我們完成這一任務。
刪除目標列 predictors_data <- data[, !(names(data) %in% "Performance")] 計算相關矩陣 correlation_matrix <- cor(predictors_data) 繪製相關熱度圖 加載必要的庫 library(ggplot2) library(reshape2) melted_corr_matrix <- melt(correlation_matrix) 使用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() + 最小主題以獲得清爽外觀 theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + labs(x = "", y = "") + 刪除軸標籤 geom_text(aes(Var1, Var2, label = round(value, 2)), color = "black", size = 4) + theme(axis.text=element_text(size=15))
輸出:
變數之間的相關性。作者提供圖像
從相關熱度圖可以清楚地看出,變數之間沒有強烈的兩兩相關性,甚至沒有任何相關值大於0.6。現在,我們將計算VIF值,看看是否存在什麼問題。下面的代碼執行這個任務。
擬合回歸模型 model <- lm(Performance ~ Ambience + Customer_service + Offers + Product_range, data = data) 計算VIF vif(model)
輸出:
從輸出結果中,我們可以看到在預測變量中,只有Product_range
變量的VIF值大於5,這表明存在高共線性,需要採取糾正措施。
手動計算VIF的方法
另一種計算VIF的方法是分別計算每個變量的VIF值,通過將每個自變量與其他預測變量進行回歸。
下面的代碼執行了這一過程,使用sapply()
函數對每個預測變量進行操作,在線性回歸模型中,將每個預測變量設置為依變量,其他預測變量設置為自變量。
然後使用每個模型的R平方值來計算VIF值,並使用其公式。最後,結果vif_values
顯示每個預測變數的VIF,幫助識別多重共線性問題。
# 為每個預測變數手動計算VIF 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)
輸出:
我們得到相同的結果,明顯地變數Product_range
的VIF值超過5,需要干預。
VIF vs. Correlation Matrix and Other Methods
簡而言之,以下是檢測多重共線性的流行方法:
- 高的VIF值:高的VIF值是多重共线性的明确指标。当这些值超过一定阈值时,它们表明一个预测变量与其他预测变量之间存在强关联,这可能影响模型的稳定性、可靠性和性能。
- 相关矩阵:通过检查相关矩阵,您可以看到预测变量之间的成对相关性。高的成对相关性表明这些特定预测变量之间存在多重共线性。然而,这种方法只能检测两个变量之间的直接线性关系,可能会忽略涉及多个变量之间更复杂相互作用的多重共线性。
- 係數變化:如果在模型中添加或刪除其他變量時,預測變量的係數明顯變化,這可能是多重共線性的徵兆。這樣的波動表明某些預測變量可能共享共同信息,使得更難確定每個變量對結果的獨特影響。
在所有這些方法中,VIF特別有用,因為即使兩兩變數之間的相關性很低,它也可以檢測到多重共線性,就像我們的例子中看到的那樣。這使VIF成為一種更全面的工具。
解決高VIF值的其他想法
如果VIF值表明存在高度多重共線性,而您不一定只想刪除該變量,還有一些其他更高級的策略可以減輕多重共線性:
- 特徵選擇:移除高度相關的預測變數之一,然後重新計算VIF,以查看是否有助於簡化模型並改善穩定性。
- 主成分分析(PCA):使用PCA將您的預測變數組合成一組較小的不相關組件。這將原始變數轉換為新的、獨立的、不相關的變數,捕捉大部分數據的變化,有助於解決多重共線性問題,同時不損失寶貴信息。
- 正規化技術:應用岭回归或套索回归,向模型添加惩罚项。这些技术有助于通过缩小相关变量的影响来减少多重共线性,使模型更稳定可靠。
結論
知道如何使用VIF是識別和解決多重共線性的關鍵,這有助於提高回歸模型的準確性和清晰度。定期檢查VIF值並在需要時應用修正措施,有助於數據專業人士和分析師構建值得信賴的模型。這種方法確保每個預測變量的影響清晰,使從模型中得出可靠結論並根據結果做出更好決策變得更容易。參加我們的Python機器學習科學家職業培訓課程,真正了解如何構建模型並使用它們。此外,完成該課程對履歷來說也是一大亮點。
Source:
https://www.datacamp.com/tutorial/variance-inflation-factor