使用Python檢測和處理迴歸中的多重共線性


多重共線性是指回歸模型中的自變數之間存在高度的相互依賴關係。這可能會導致模型係數不準確,難以評估不同的自變數如何影響因變數。在這種情況下,需要識別和處理迴歸模型的多重共線性,我們將逐步解釋不同的程式及其輸出。

方法

  • 檢測多重共線性

  • 處理多重共線性

演算法

步驟1 − 匯入必要的庫

步驟2 − 將資料載入到pandas DataFrame中

步驟3 − 使用預測變數建立相關矩陣

步驟4 − 建立相關矩陣的熱力圖以視覺化相關性

步驟5 − 計算每個預測變數的方差膨脹因子(VIF)

步驟6 − 確定預測變數

步驟7 − 應移除預測變數

步驟8 − 重新執行迴歸模型

步驟9 − 再次檢查。

方法一:檢測多重共線性

利用pandas包的corr()函式確定自變數的相關矩陣。使用seaborn庫生成熱力圖以顯示相關矩陣。利用statsmodels包中的variance_inflation_factor()函式確定每個自變數的方差膨脹因子(VIF)。VIF大於5或10表示存在高度的多重共線性。

示例-1

在此程式碼中,一旦資料載入到Pandas DataFrame中,預測變數X和因變數y就會被分開。為了計算每個預測變數的VIF,我們使用statsmodels包中的variance_inflation_factor()函式。該過程的最後一步是在將VIF值以及預測變數的名稱儲存在一個新的Pandas DataFrame中之後顯示結果。使用此程式碼,將生成一個表,其中包含每個預測變數的變數名稱和VIF值。當變數具有較高的VIF值(根據情況高於5或10)時,重要的是要進一步分析該變數。

import pandas as pd
from statsmodels.stats.outliers_influence import variance_inflation_factor

# Load data into a pandas DataFrame
data = pd.read_csv("mydata.csv")

# Select independent variables
X = data[['independent_var1', 'independent_var2', 'independent_var3']]

# Calculate VIF for each independent variable
vif = pd.DataFrame()
vif["VIF Factor"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
vif["features"] = X.columns

# Print the VIF results
print(vif)

輸出

VIF  Factor      Features 
0    3.068988    Independent_var1
1    3.870567    Independent_var2
2    3.843753    Independent_var3

方法二:處理多重共線性

從模型中去除一個或多個高度相關的自變數。可以使用主成分分析(PCA)將高度相關的自變數組合成單個變數。可以使用嶺迴歸或LASSO迴歸等正則化方法來減少高度相關的自變數對模型係數的影響。使用上述方法,可以使用以下示例程式碼來識別和處理多重共線性:

import pandas as pd
import seaborn as sns
from statsmodels.stats.outliers_influence import variance_inflation_factor
from sklearn.decomposition import PCA
from sklearn.linear_model import Ridge

# Load the data into a pandas DataFrame
data = pd.read_csv('data.csv')

# Calculate the correlation matrix
corr_matrix = data.corr()

# Create a heatmap to visualize the correlation matrix
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')

# Check for VIF for each independent variable
for i in range(data.shape[1]-1):
   vif = variance_inflation_factor(data.values, i)
   print('VIF for variable {}: {:.2f}'.format(i, vif))

# Remove highly correlated independent variables
data = data.drop(['var1', 'var2'], axis=1)

# Use PCA to combine highly correlated independent variables
pca = PCA(n_components=1)
data['pca'] = pca.fit_transform(data[['var1', 'var2']])

# Use Ridge regression to reduce the impact of highly correlated independent variables
X = data.drop('dependent_var', axis=1)
y = data['dependent_var']
ridge = Ridge(alpha=0.1)
ridge.fit(X, y)

除了輸出每個自變數的VIF值外,該函式不會生成任何其他輸出。執行此程式碼只會輸出每個自變數的VIF值;不會列印圖表或模型效能。

在此示例中,資料首先載入到pandas DataFrame中,然後計算相關矩陣,最後建立熱力圖以顯示相關矩陣。然後,在測試每個自變數的VIF後,我們消除高度相關的自變數。我們使用嶺迴歸來減少高度相關的自變數對模型係數的影響,並使用PCA將高度相關的自變數合併成單個變數。

import pandas as pd

#create DataFrame
df = pd.DataFrame({'rating': [90, 85, 82, 18, 14, 90, 16, 75, 87, 86],
         'points': [22, 10, 34, 46, 27, 20, 12, 15, 14, 19],
         'assists': [1, 3, 5, 6, 5, 7, 6, 9, 9, 5],
         'rebounds': [11, 8, 10, 6, 3, 4, 4, 10, 10, 7]})

#view DataFrame
print(df)

輸出

   rating  points  assists  rebounds
0      90      22        1        11
1      85      10        3         8
2      82      34        5        10
3      18      46        6         6
4      14      27        5         3
5      90      20        7         4
6      16      12        6         4
7      75      15        9        10
8      87      14        9        10
9      86      19        5         7

使用Pandas包,可以透過這個Python程式生成一個稱為DataFrame的陣列資料結構。具體的維度包含四個不同的列:助攻、籃板、得分和評分。庫本身在程式碼的第一行匯入,之後簡稱為“pd”以減少複雜性。DataFrame最終是透過在第二行程式碼中執行的pd.DataFrame()方法構建的。

在第三行程式碼中,使用print()方法將DataFrame列印到控制檯。每個列的值構成列表的定義,充當輸入到函式的字典的鍵和值。每個球員的資訊都以表格形式顯示,得分、助攻、籃板的統計資料按列排列,每一行代表一個球員。

結論

總而言之,當模型中的兩個或多個預測變數彼此之間具有很強的相關性時,就稱為多重共線性。這種現象可能使模型結果難以解釋。在這種情況下,難以確定每個獨特的預測變數如何影響結果變數。

更新於:2023年7月24日

瀏覽量:1000+

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.