使用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列印到控制檯。每個列的值構成列表的定義,充當輸入到函式的字典的鍵和值。每個球員的資訊都以表格形式顯示,得分、助攻、籃板的統計資料按列排列,每一行代表一個球員。
結論
總而言之,當模型中的兩個或多個預測變數彼此之間具有很強的相關性時,就稱為多重共線性。這種現象可能使模型結果難以解釋。在這種情況下,難以確定每個獨特的預測變數如何影響結果變數。
資料結構
網路
關係資料庫管理系統(RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP