虛擬變數陷阱(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
欄位,包含三個類別:Single
、Married
和 Divorced
。對其進行 One-Hot Encoding 後,你會得到三個二元變數:
Marital_Status_Single
Marital_Status_Married
Marital_Status_Divorced
如果一筆數據的這三個變數分別為 [0, 1, 0],那麼我們知道這個客戶是 Married
。若另一筆數據的這三個變數分別為 [0, 0, 1],那麼該客戶是 Divorced
。通過這三個變數,我們可以推斷任何一筆數據的類別,因此這三個變數之間是 線性相關 的,這會引發模型訓練中的問題。
為了避免虛擬變數陷阱,通常會採取以下策略:
使用 pd.get_dummies()
時,設置 drop_first=True
來刪除第一個類別變數。這樣的話,剩餘的變數依然可以表示所有的類別。例如,在 Marital_Status
這個例子中,刪除了 Marital_Status_Single
後:
# 使用 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
被刪除了。透過這兩個變數,我們依然可以推斷出所有類別的狀態:
Single
。Marital_Status_Divorced = 1
,表示該資料點為 Divorced
。Marital_Status_Married = 1
,表示該資料點為 Married
。這樣做就避免了虛擬變數之間的多重共線性問題。
某些機器學習模型(如決策樹或隨機森林)不受多重共線性問題的影響,這些模型能夠自動處理虛擬變數的多餘信息。因此,對於這類模型,不一定需要手動刪除變數。
虛擬變數陷阱是由於多重共線性引起的問題,會在進行 One-Hot Encoding 後產生多餘的變數,從而影響某些機器學習模型的訓練結果。為了避免這個問題,最常見的做法是使用 drop_first=True
刪除一個變數,這樣依然可以保持模型的穩定性和準確性。