更新於 2024/09/25閱讀時間約 2 分鐘

【資料分析】python機器學習-什麼是虛擬變數陷阱? 虛擬變數陷阱所引發問題與處理

raw-image

虛擬變數陷阱(Dummy Variable Trap)是指在進行 One-Hot Encoding(或虛擬變數編碼)時,生成的虛擬變數之間存在 完全多重共線性 的問題。
當你對類別型變數進行 One-Hot Encoding 時,每個類別都會被轉換為二元變數(0 或 1)。如果原始類別有 N 個不同的取值,則 One-Hot Encoding 會生成 N 個虛擬變數。
然而,這樣做可能會導致一個問題,即所有的虛擬變數是線性相關的。例如,當你有三個類別 A、B、C 並將它們進行 One-Hot 編碼,得到三個二元變數 A、B 和 C,這三個變數是線性相關的,因為 A + B + C = 1
這樣一來,知道了 A 和 B 的值,我們就可以推斷出 C 的值,這就是所謂的 完全多重共線性。這種共線性會導致回歸模型中出現計算問題,因為多餘的變數會讓模型無法準確估計每個變數的影響。


# 可使用目錄功能快速確認要閱覽的主題


具體的例子

假設你有一個 Marital_Status 欄位,包含三個類別:SingleMarriedDivorced。對其進行 One-Hot Encoding 後,你會得到三個二元變數:

  • Marital_Status_Single
  • Marital_Status_Married
  • Marital_Status_Divorced

如果一筆數據的這三個變數分別為 [0, 1, 0],那麼我們知道這個客戶是 Married。若另一筆數據的這三個變數分別為 [0, 0, 1],那麼該客戶是 Divorced。通過這三個變數,我們可以推斷任何一筆數據的類別,因此這三個變數之間是 線性相關 的,這會引發模型訓練中的問題。



處理虛擬變數陷阱的方法

為了避免虛擬變數陷阱,通常會採取以下策略:


1. 刪除第一個類別的變數

使用 pd.get_dummies() 時,設置 drop_first=True 來刪除第一個類別變數。這樣的話,剩餘的變數依然可以表示所有的類別。例如,在 Marital_Status 這個例子中,刪除了 Marital_Status_Single 後:

    • 若 Marital_Status_Married=0 且 Marital_Status_Divorced=0,那麼該筆數據就是 Single。
    • 若 Marital_Status_Married=1,那麼該筆數據就是 Married。
    • 若 Marital_Status_Divorced=1,那麼該筆數據就是 Divorced。
# 使用 drop_first=True 避免虛擬變數陷阱
df_encoded_no_trap = pd.get_dummies(df, columns=['Marital_Status'], drop_first=True)

# 檢查編碼後的結果
print(df_encoded_no_trap)


"""
Marital_Status_Divorced Marital_Status_Married
0 0 0
1 0 1
2 1 0
3 0 0
4 0 1

"""

在這裡,Marital_Status_Single 被刪除了。透過這兩個變數,我們依然可以推斷出所有類別的狀態:

  • 當兩個欄位都是 0,代表該資料點為 Single
  • Marital_Status_Divorced = 1,表示該資料點為 Divorced
  • Marital_Status_Married = 1,表示該資料點為 Married

這樣做就避免了虛擬變數之間的多重共線性問題。


2. 使用正規化模型

某些機器學習模型(如決策樹或隨機森林)不受多重共線性問題的影響,這些模型能夠自動處理虛擬變數的多餘信息。因此,對於這類模型,不一定需要手動刪除變數。



結論

虛擬變數陷阱是由於多重共線性引起的問題,會在進行 One-Hot Encoding 後產生多餘的變數,從而影響某些機器學習模型的訓練結果。為了避免這個問題,最常見的做法是使用 drop_first=True 刪除一個變數,這樣依然可以保持模型的穩定性和準確性。


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.