建模資料的預處理的過程中,變數分箱(即變數離散化)往往是較為核心一環。變數分箱的優劣往往會影響模型評分效果.
1.對異常資料有比較好的魯棒性.
2.在邏輯回歸模型中,單個變數分箱之後每個箱有自己獨立的權重,相當於給模型加入了非線性的能力,能夠提公升模型的表達能力,極大擬合.
3.缺失值也可以作為一類特殊的變數進行模型.
4.分箱之後相對於簡單的one_hot編碼而言能夠降低模型的複雜度,提公升模型運算速度,對後期生產上線較為友好.
舉個例子,在實際模型建立當中,有個 job 職業的特徵,取值為(「國家機關人員」,「專業技術人員」,「商業服務人員」),對於這一類變數,如果我們將其依次賦值為(國家機關人員=1;專業技術人員=2;商業服務人員=3),就很容易產生乙個問題,不同種類的職業在資料層面上就有了大小順序之分,國家機關人員和商業服務人員的差距是2,專業技術人員和商業服務人員的之間的差距是1,而我們原來的中文分類中是不存在這種先後順序關係的。所以這麼簡單的賦值是會使變數失去原來的衡量效果。
怎麼處理這個問題呢,「一位有效編碼」 (one-hot encoding)可以解決這個問題,通常叫做虛變數或者啞變數(dummpy variable):比如職業特徵有3個不同變數,那麼將其生成個2啞變數,分別是「是否國家黨政職業人員」,「是否專業技術人員」 ,每個虛變數取值(1,0)。
有序多分類變數是很常見的變數形式,通常在變數中有多個可能會出現的取值,各取值之間還存在等級關係。比如高血壓分級(0=正常,1=正常高值,2=1級高血壓,3=2級高血壓,4=3級高血壓)這類變數處理起來簡直不要太省心,使用 pandas 中的 map()替換相應變數就行。
import連續變數的分箱可以劃分2種:無監督分組,有監督分組pandas as pd
df= pd.dataframe(['
正常','
3級高血壓
','正常
','2級高血壓
','正常
','正常高值
','1級高血壓
'],columns=['
blood_pressure'])
dic_blood =
df['
blood_pressure_enc
'] = df['
blood_pressure
'].map(dic_blood)
print(df)
3.3.1無監督分組
等寬劃分:按照相同寬度將資料分成幾等份。缺點是受到異常值的影響比較大。 pandas.cut方法可以進行等寬劃分。
等頻劃分:將資料分成幾等份,每等份資料裡面的個數是一樣的。pandas.qcut方法可以進行等頻劃分。
importpandas 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...這個我看是風空模型裡面的,具體的可能後續要補一補)
特徵工程之分箱
最近比賽資料進入到特徵組合的階段,在進行特徵組合前,要分箱處理,等深等距之類的方法太沒有道理了,加上測試集的深度廣度也不同。所以嘗試了一種woe編碼分箱的方法 import woe.feature process as fp import woe.eval as eval dataset train...
大資料 特徵工程
1 單變數特徵篩選 計算每乙個特徵與響應變數的相關性 工程上常用的手段有計算皮爾遜係數和互資訊係數,皮爾遜係數只能衡量線性相關性而互資訊係數能夠很好地度量各種相關性,但是計算相對複雜一些,好在很多toolkit裡邊都包含了這個工具 如sklearn的mine 得到相關性之後就可以排序選擇特徵了 2 ...
特徵工程 清洗資料
我們在進行機器學習的時候,採用的資料樣本往往是向量 特徵向量 而我們的原始資料並不是以向量的形式呈現給我們的,這是便需要將資料對映到特徵 直接對映便ok 雖然機器學習是根據浮點值進行的訓練,但是不需要將整數6轉換為6.0,這個過程是預設的 好多時候,有的特徵是字串,比如此前訓練的加利福尼亞房產資料集...