1. 程式人生 > >131.003 數據預處理之Dummy Variable & One-Hot Encoding

131.003 數據預處理之Dummy Variable & One-Hot Encoding

table pandas 文化 影響 部分 href reg int 兩個

@(131 - Machine Learning | 機器學習)

Dummy Variable

虛擬變量的含義
虛擬變量又稱虛設變量、名義變量或啞變量,用以反映質的屬性的一個人工變量,是量化了的質變量,通常取值為0或1。引入啞變量可使線形回歸模型變得更復雜,但對問題描述更簡明,一個方程能達到倆個方程的作用,而且接近現實。

虛擬變量的作用
最開始用樹的模型沒有考慮過要處理類別型變量,但是SVM貌似必須是數值型的,所以沒法子,這塊內容還是要看看的~

  1. 分離異常因素的影響,例如分析我國GDP的時間序列,必須考慮“文革”因素對國民經濟的破壞性影響,剔除不可比的“文革”因素。
  2. 檢驗不同屬性類型對因變量的作用,例如工資模型中的文化程度、季節對銷售額的影響。
  3. 提高模型的精度,相當與將不同屬性的樣本合並,擴大了樣本容量(增加了誤差自由度,從而降低了誤差方差)

虛擬變量的設置原則
在模型中引入多個虛擬變量時,虛擬變量的個數應按下列原則確定:
如果有m種互斥的屬性類型,在模型中引入(m-1)個虛擬變量。
例如,性別有2個互斥的屬性,引用2-1=1個虛擬變量;再如,文化程度分小學、初中、高中、大學、研究生5類,引用4個虛擬變量。
【該原則的解釋會在dummy variable 和 one-hot encoding中差異中提及。】

One-Hot Encoding(獨熱編碼)

也是處理類別型變量的一種方法,舉例而言:如果變量X表示文化程度,共有{初中,高中,本科}三種取值。那麽虛擬變量可以是X_初中,X_高中。而One-Hot為X_初中,X_高中,X_本科。各個新生成變量的取值為{0,1}。

One-Hot編碼的含義
One-Hot編碼,又稱為一位有效編碼,主要是采用N位狀態寄存器來對N個狀態進行編碼,每個狀態都由他獨立的寄存器位,並且在任意時候只有一位有效。
One-Hot編碼是分類變量作為二進制向量的表示。這首先要求將分類值映射到整數值。然後,每個整數值被表示為二進制向量,除了整數的索引之外,它都是零值,它被標記為1。

One-Hot 作用
解決了分類器不好處理屬性數據的問題
在一定程度上也起到了擴充特征的作用
兩者的差別
從上面的介紹上看,onehot會比dummy多生成一個變量。是否對模型有不同的影響呢?
這部分參看知乎上的回答,雖然不大明白,但是先把他們的回答貼在這裏,備查&有空再學習下。

以線性回歸為例,在使用onehot的時候,新生成的變量實際上是線性相關的,即同一個樣本,同一個變量生成的onehot變量的和為1。即在上文的例子中,X_初中+X_高中+X_本科=1 。這樣會導致【知乎中王赟的回答】存在的問題:

“如果你不使用regularization,那麽one-hot encoding的模型會有多余的自由度。這個自由度體現在你可以把某一個分類型變量各個值對應的權重都增加某一數值,同時把另一個分類型變量各個值對應的權重都減小某一數值,而模型不變。在dummy encoding中,這些多余的自由度都被統攝到intercept裏去了。這麽看來,dummy encoding更好一些。

如果你使用regularization,那麽regularization就能夠處理這些多余的自由度。此時,我覺得用one-hot encoding更好,因為每個分類型變量的各個值的地位就是對等的了。”

評論中穆文的解釋還算明白,摘抄於此:

以線性模型舉例, 分類超平面是 wx+b =0,dummy下的話 w 有唯一解,one-hot 下 w 有無窮解 (就是答主說的 一部分權重增加點,另一部分權重減少點),這樣每個變量的權重就沒有解釋意義了,也使得模型沒有真正的預測效果。加了正則化之後,相當於約束了 w 的解空間,使得 w 相對有意義

one-hot無窮解的原因我自己猜測下:如果從線性回歸最終是解一個方程的角度來理解可能方便些。方程的系數矩陣存在線性相關的變量,假設原模型中有兩個類別型變量x1,x2,經過one-hot轉化為x1_1,x1_2,x2_1,x2_2,且x1_1+x1_2=x2_1+x2_2=1,那麽可以對這四個變量的系數做相應的變化,如x1的系數統一變成1.5倍,而x2的系數變為原來的0.5倍,並且方程等式關系依舊成立,但是導致會出現無窮解的情況。
其實線性回歸的前提假設中就包含了變量獨立性的要求。
至於正則化和約束解空間我還是不清楚,等學習到了在來填坑。安利下《ISLR》,回歸講的挺清楚的,比統計課本好的感覺。

實現

pandas.get_dummies

>>> import pandas as pd
>>> s = pd.Series(list('abca'))
>>> pd.get_dummies(s)
   a  b  c
0  1  0  0
1  0  1  0
2  0  0  1
3  1  0  0

131.003 數據預處理之Dummy Variable & One-Hot Encoding