首頁 > 後端開發 > Python教學 > 使用Python檢測和處理迴歸中的多重共線性問題

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

王林
發布: 2023-08-18 15:05:20
轉載
1747 人瀏覽過

多重共線性是指迴歸模型中的自變數之間存在高度的相互關聯。這可能導致模型的係數不準確,使得難以判斷不同的自變數對因變數的影響。在這種情況下,有必要識別和處理迴歸模型的多重共線性,並結合不同的程序和它們的輸出,我們將逐步解釋。

方法

  • 偵測多重共線性

  • #處理多重共線性

#演算法

步驟 1 − 導入必要的函式庫

第二步 - 將資料載入到pandas Dataframes中

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

第四步 − 建立一個相關矩陣的熱力圖,以視覺化相關性

第5步 - 計算輸出的每個預測變數的變異數膨脹因子

步驟 6 − 確定預測器

第7步 - 預測器應該被移除

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

第九步 - 再次檢查。

方法一:偵測多重共線性

使用pandas包的corr()函數來決定獨立變數的相關矩陣。使用seaborn庫產生熱力圖來顯示相關矩陣。使用statsmodels套件的variance_inflation_factor()函數來確定每個獨立變數的變異數膨脹因子(VIF)。 VIF大於5或10表示存在高多重共線性。

Example-1

的中文翻譯為:

範例-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)將高度相關的自變數合併為一個變數。可以使用嶺迴歸或套索迴歸等正規化方法來減少強相關自變數對模型係數的影響。使用上述方法,可以使用以下範例程式碼來識別和解決多重共線性問題−

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之後,消除具有高度相關性的獨立因素。我們使用嶺迴歸來減少高度相關的獨立變數對模型係數的影響,並使用主成分分析將高度相關的獨立變數合併為一個變數。

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"以減少複雜性。透過在第二行程式碼中執行pd.DataFrame()方法最終建構了一個DataFrame。

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

結論

總之,當模型中的兩個或多個預測變數彼此之間存在強相關性時,這稱為多重共線性。這種情況會使得解釋模型結果變得困難。在這種情況下,很難確定每個獨特的預測變數如何影響結果變數。

以上是使用Python檢測和處理迴歸中的多重共線性問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:tutorialspoint.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板