定量變量和定性變量的轉換(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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM