特征工程-數據分箱


建模數據的預處理的過程中,變量分箱(即變量離散化)往往是較為核心一環。變量分箱的優劣往往會影響模型評分效果.

一,數據分箱的重要性

 1.對異常數據有比較好的魯棒性.

 2.在邏輯回歸模型中,單個變量分箱之后每個箱有自己獨立的權重,相當於給模型加入了非線性的能力,能夠提升模型的表達能力,極大擬合.

 3.缺失值也可以作為一類特殊的變量進行模型.

 4.分箱之后相對於簡單的one_hot編碼而言能夠降低模型的復雜度,提升模型運算速度,對后期生產上線較為友好.

二、三類變量分箱方法的及注意要點

  2.1 無序變量的分箱問題

  舉個例子,在實際模型建立當中,有個 job 職業的特征,取值為(“國家機關人員”,“專業技術人員”,“商業服務人員”),對於這一類變量,如果我們將其依次賦值為(國家機關人員=1;專業技術人員=2;商業服務人員=3),就很容易產生一個問題,不同種類的職業在數據層面上就有了大小順序之分,國家機關人員和商業服務人員的差距是2,專業技術人員和商業服務人員的之間的差距是1,而我們原來的中文分類中是不存在這種先后順序關系的。所以這么簡單的賦值是會使變量失去原來的衡量效果。

  怎么處理這個問題呢,“一位有效編碼” (one-hot Encoding)可以解決這個問題,通常叫做虛變量或者啞變量(dummpy variable):比如職業特征有3個不同變量,那么將其生成個2啞變量,分別是“是否國家黨政職業人員”,“是否專業技術人員” ,每個虛變量取值(1,0)。  

  2.2 有序變量的分箱問題

  有序多分類變量是很常見的變量形式,通常在變量中有多個可能會出現的取值,各取值之間還存在等級關系。比如高血壓分級(0=正常,1=正常高值,2=1級高血壓,3=2級高血壓,4=3級高血壓)這類變量處理起來簡直不要太省心,使用 pandas 中的 map()替換相應變量就行。

  

import pandas as pd
df= pd.DataFrame(['正常','3級高血壓','正常','2級高血壓','正常','正常高值','1級高血壓'],columns=['blood_pressure'])
dic_blood = {'正常':0,'正常高值':1,'1級高血壓':2,'2級高血壓':3,'3級高血壓':4}
df['blood_pressure_enc'] = df['blood_pressure'].map(dic_blood)
print(df)

  3.3連續變量的分箱方式  

  連續變量的分箱可以划分2種:無監督分組,有監督分組

  3.3.1無監督分組

  等寬划分:按照相同寬度將數據分成幾等份。缺點是受到異常值的影響比較大。 pandas.cut方法可以進行等寬划分。

  等頻划分:將數據分成幾等份,每等份數據里面的個數是一樣的。pandas.qcut方法可以進行等頻划分。

import pandas as pd

df = pd.DataFrame([[22,1],[13,1],[33,1],[52,0],[16,0],[42,1],[53,1],[39,1],[26,0],[66,0]],columns=['age','Y'])
#print(df)
df['age_bin_1'] = pd.qcut(df['age'],3) #新增一列存儲等頻划分的分箱特征
df['age_bin_2'] = pd.cut(df['age'],3)  #新增一列存儲等距划分的分箱特征
print(df)

 

 

  3.3.2有監督學習方法:

  卡方分箱(em...這個我看是風空模型里面的,具體的可能后續要補一補)


免責聲明!

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



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