天天看點

定量變量和定性變量的轉換(Transform of Quantitative & Qualitative Variables)

定量變量(Quantitative Variables):也稱為數值型變量(Numerical Variables),可以用連續值或離散值表示。比如:氣溫(連續值),學生人數(離散值)。

為什麼要對定量變量進行轉換?大多數情況下,我們可以直接使用定量變量。但是有時候,特征和目标之間不呈線性關系。比如說年齡和收入之間的關系,當人年輕時,收入通常會穩步上升,但到了一定年紀之後,收入便開始降低。我們當然可以用非線性模型來拟合資料,但是這樣會把模型弄得很複雜。是以比較好的做法是在資料準備的階段就對定量變量做分箱處理(Binning,也稱為分區間)。在對定量變量分箱處理之後,還要再将其轉換為虛拟變量或對其進行WOE轉換(參見:https://zhuanlan.zhihu.com/p/30026040)。

将定量變量轉換為定性變量的方法為:分區間(Binning),包括等寬分區間以及自适應分區間。

1. 等寬分區間(Fixed-Width Binning):可以用pandas的cut()方法自己設定區間範圍。等寬分區間的缺點是:落在某個區間中的資料點的數目不一定是均勻的,是以可能會得到不規則的區間。一些區間中的資料可能會非常的密集,一些區間則會非常稀疏甚至是空的。是以,自适應分區間方法是一個更安全的政策。

2. 自适應分區間(Adptive Binning):使用資料的四分位數來确定區間範圍,這樣確定每個區間内的資料個數是相同的。

定性變量(Qualitative Variables):也稱為類别型變量(Categorical Variables),通常用文本字元串或離散值表示。根據變量之間是否存在次序關系,又可以分為有序型定性變量(Ordinal)和無序型定性變量(Nominal)。比如:衣服的尺寸“大中小”(有序型),男女性别(無序型)。

為什麼要對定性變量進行轉換?因為最終我們需要進行數值間的運算,而文本字元串之間無法進行運算。即使将文本字元串轉變為離散值表示,比如将衣服的尺寸大中小表示為0:小,1:中,2:大,雖然将次序展現出來了(2>1>0),但還是不合理,因為不管對于有序型定性變量,還是無序型定性變量來說,這樣的數值運算都沒有意義。比如衣服的尺寸這個例子,如果将大減去中,其結果等于2-1=1,這是表示中号尺寸等于大号尺寸減去中号尺寸嗎?這顯然是不合理且沒有意義的。是以我們需要用其他方式對定性變量進行轉換。

有兩種轉換方式:a. 将定性變量轉換為虛拟變量,b. 将定性變量轉換為定量變量。

a. 将定性變量轉換為虛拟變量:

1. 虛拟編碼(Dummy Coding):如果某個特征變量有n個類别,那麼虛拟編碼會将其轉換成n-1個二進制編碼。變量的每個類别都被轉換成 n-1 維向量。我們将減少的這個類别作為基準,其由全部是0組成的向量表示。轉換後的變量稱為虛拟變量(Dummy Variables)。

0    2-大
1    1-中
2    2-大
3    0-小
Name: 衣服尺寸, dtype: object      
col=pd.Series(["2-大","1-中","2-大","0-小"],name="衣服尺寸")
print(pd.get_dummies(col).iloc[:,1:])      
1-中  2-大
0    0    1
1    1    0
2    0    1
3    0    0      

我們建立了一個衣服尺寸的Series,由四個樣本組成。轉換為虛拟變量後,可以看到變量由二進制組成的向量表示:大-[0,1],中-[1,0],小-[0,0]。其中把“小”作為基準,從特征中删去,因為“大”和“中”這兩個特征足以表示所有的資訊(不是大和中,便是小)。

2. 獨熱編碼(One Hot Encoding):如果某個特征變量有n個類别,那麼獨熱編碼會将其轉換成n個二進制編碼。變量的每個類别都被轉換成 n 維向量,其中隻有某一維的值為 1(表示激活狀态)。

col=pd.Series(["2-大","1-中","2-大","0-小"],name="衣服尺寸")
print(pd.get_dummies(col))      
0-小  1-中  2-大
0    0    0    1
1    0    1    0
2    0    0    1
3    1    0    0      

還是用上面衣服尺寸這個例子,轉換為獨熱編碼後,變量由二進制組成的向量表示為:大-[0,0,1],中-[0,1,0],小-[1,0,0]。

3. 效果編碼(Effect Coding):和虛拟編碼類似,隻不過作為基準的特征全由-1組成的向量表示。那麼既然已經有了虛拟編碼,為何還要用效果編碼呢?因為虛拟編碼的回歸系數表示的是某類别和基準類别之間的平均差異,而效果編碼可以有效估計出各類别和總體平均水準之間的平均差異(根據回歸系數),友善進行各類别之間的比較。是以如果各類别之間有關聯,那麼使用效果編碼更好。(參見:https://wenku.baidu.com/view/4c6918c7581b6bd97e19ea57.html)

col=pd.Series(["2-大","1-中","2-大","0-小"],name="衣服尺寸")
dummy=pd.get_dummies(col).iloc[:,1:]
dummy=dummy.astype(np.int8)
dummy.loc[np.all(dummy==0,axis=1)]=-1
print(dummy)      
1-中  2-大
0    0    1
1    1    0
2    0    1
3   -1   -1      

還是用上面衣服尺寸這個例子,轉換為效果編碼後,變量由二進制組成的向量表示為:大-[0,1],中-[1,0],小-[-1,-1]。

4. 區間計數(Bin Counting):對于有m個類别的某個特征,經過上述轉換後,将會變成m個新的特征。是以,當任意特征的類别數量變得很大的時候,很可能會造成次元災難。我們需要針對那些可能具有非常多類别的特征(如 IP 位址),研究其它的轉換方法 。區間計數使用基于機率的統計資訊和在模組化過程中所要預測的實際目标進行編碼,而不是使用實際的标簽值。這個方案需要曆史資料作為先決條件,并且要求資料非常詳盡。

5. 特征哈希(Feature Hashing):哈希函數通常與預設的編碼特征的數量(作為預定義長度向量)一起使用。哈希方案适用于字元串、數字和其它結構(如向量)。如果我們有一個特征擁有 1000 個不同的類别,我們設定最終的特征向量長度為10,那麼最終輸出的特征将隻有 10 個。特征哈希的缺點是可解釋性不強。

b. 将定性變量轉換為定量變量:

對于多個有序的定性變量,如果将其轉換為虛拟變量,會損失掉每個定性變量本身的順序資訊和定性變量間的關聯資訊。為了解決這個問題,常常根據類别的順序,将定性變量轉換為定量變量。轉換方法有:Ridit scoring(二分類問題),WOE(weight of evidence)等等。

參考:https://www.leiphone.com/news/201801/KTVu68zA6szteVmS.html

           https://www.leiphone.com/news/201801/T9JlyTOAMxFZvWly.html

           https://www.jiqizhixin.com/articles/2018-07-09-19

           https://segmentfault.com/a/1190000019860050

繼續閱讀