數值型特徵工程總結及實現

二值化處理

在一個歌曲數據集中,一個人聽歌1000遍,另一個人聽歌10遍,我們不能說第二個人的喜歡程度比第一個人的喜歡程度高100倍,這就是需要二值化的小例子

pandas中實現

# 我們定義聽過次數大於5為喜歡,二值化完成
listen_count[2] = (listen_count[2] > 5).astype(int)

分箱(區間量化)

個人感覺分箱就是二值化的升級版,將原始數據離散成了不同的數值

固定寬度分箱

我們數據為[27, 44, 73, 47, 27, 6, 72, 80, 67, 44, 23, 98, 28, 54, 93, 41, 3,
99, 51, 64]
我們想0-9為第一個箱子,10-19為第二個箱子.這就是固定寬度分箱

pandas中實現

# 固定寬度為10
data = np.floor_divide(data.values, 10)

固定量級分箱

固定量級分箱和固定寬度分箱其實差不多
比如我們數據為[296, 8286, 64011, 80, 3, 725, 867, 2215, 7689, 11495, 91897, 44, 28, 7971, 926, 122, 22222]
我們想0-9為第一個箱子,10-99為第二個箱子,這就是固定量級分箱

分位數分箱

固定分箱缺點很明顯就行,可能會有很多的空箱子,例如[1,2,3,4,99,98]如果按寬度為10進行分箱,則具有很多空箱子,那分位數分箱就是一個很好的辦法.
我們可以根據數據進行自適應箱體定位,也就是說可以數據的0-25%,25%-50%,50%-75%,75%-100%進行分箱

效果圖
dCP4nU.png

pandas中實現

# 按照分為數,將數據分為4個的箱子,保證每個箱子的數據都差不多
qcut,bins = pd.qcut(data,4,labels=False,retbins=True)
print(qcut,bins)

# 計算各個分位數的值
data.quantile([0.25,0.5,0.75])

對數變換

如果我們的數據分布情況為0-100的數據點有1000個,而100-10000的數據點只有20個,那使用對數變換可以使我們的數據分布變的更加的平滑

效果圖
dCPfXT.png

pandas中實現

# 做對數變化,np.log10(x + 1) ,+1是防止出現np.log10(0)的情況
data = np.log10(data + 1)

特徵縮放

有些模型是輸入的平滑函數,比如線性回歸模型、邏輯回歸模型或包含矩陣的模
型,它們會受到輸入尺度的影響。相反,那些基於樹的模型則根本不在乎輸入尺度有多
大。如果模型對輸入特徵的尺度很敏感,就需要進行特徵縮放。

import sklearn.preprocessing as preproc
# min-max縮放
data = preproc.minmax_scale(data)

# 標準化——注意根據標準化的定義,有些結果會是負的
data = preproc.StandardScaler().fit_transform(data)

# L2-歸一化
data = preproc.normalize(data, axis=0)

交互特徵

兩個特徵的乘積可以組成一對簡單的交互特徵

pandas中實現

X2 = preproc.PolynomialFeatures(include_bias=False).fit_transform(X)