特征工程系列:(三)特征對齊與表征


數據對齊

Z分數標准化

    將數據轉換成服從標准正太分布的數據

    $$
    \hat x = \frac{x-\mu}{\sigma}
    $$

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()

scaler.fit_transform(data)

歸一化

    將數據縮放到0-1之間,注意對於稀疏數據,最好不要使用歸一化,因為稀疏數據大部分是由0構成,歸一化之后,反而將數據變得稠密了

    $$
    \hat x = \frac{x-min(x)}{max(x)-min(x)}
    $$

from sklearn.preprocessing import MinMaxScaler
mms = MinMaxScaler(feature_range=[5,10]) #設置歸一化區間
result = mms.fit_transform(data) 

data = mms.inverse_transform(result)  #反向推理

行歸一化

行歸一化不是計算每列的統計值(均值、最小值、最大值等),而是會保證每行有單位范數(unit norm),意味着每行的向量長度相同。x=( x1, x2,…, xn) 那么行歸一化算法如下所示:

\(x_{new} = \frac{x}{||x||}\)

from sklearn.preprocessing import Normalizer
normalize = Normalizer()
data = pd.DataFrame(normalize.fit_transform(data) 

#行歸一化的平均范數是1
np.sqrt((data**2).sum(axis=1)).sum()

默認使用的是L2范數,其中:

\[||x|| = \sqrt{(x_1^2+x_2^2+...+x_n^2)} \]

用途

有一些算法會容易受到數據尺度的影響

KNN——因為依賴歐幾里得距離, 所以要對特征進行歸一化

K均值聚類——和KNN的原因一樣;

邏輯回歸、支持向量機、神經網絡——如果使用梯度下降來學習權重,歸一化之后可以增加收斂速度。

主成分分析——特征向量將偏向較大的列,所以最好也進行歸一化。

數據編碼

離散型數據

(1) LabelEncoder

將文本型標簽變成數字型,主要針對於類別數據,例如數據集的標簽,可以進行數字化。

from sklearn.preprocessing import LabelEncoder
​
from sklearn.preprocessing import LabelEncoder
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])

#屬性
.classes_           #屬性.classes_查看標簽中究竟有多少類別

inverse_transform(label)     #使用inverse_transform可以逆轉

(2) OrdinalEncoder

能夠將文本型分類特征轉換為浮點數字,例如 A,B,C轉換成了0.0 , 1.0 , 2.0,

OrdinalEncoder可以用來處理有序變量,例如體重,數字的大小是有關系的,所以使用OrdinalEncoder

from sklearn.preprocessing import OrdinalEncoder
​data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])

#接口categories_對應LabelEncoder的接口classes_,一模一樣的功能
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_

(3) OneHotEncoder

one-hot只要用於名義變量,也就是有我 沒有你的變量,這類變量直接沒有明確的計算關系,都是獨立的,所以使用one-hot最為合適

from sklearn.preprocessing import OneHotEncoder
X = data.iloc[:,1:-1]
​
enc = OneHotEncoder(categories='auto').fit(X)

連續性數據

(1) Binarizer

根據閾值將數據二值化(將特征值設置為0或1),用於處理連續型變量。大於閾值的值映射為1,而小於或等於閾值的值映射為0。默認閾值為0時,特征中所有的正值都映射到1。二值化是對文本計數數據的常見操作,分析人員可以決定僅考慮某種現象的存在與否。它還可以用作考慮布爾隨機變量的估計器的預處理步驟(例如,使用貝葉斯設置中的伯努利分布建模)

data_2 = data.copy()
​
from sklearn.preprocessing import Binarizer
X = data_2.iloc[:,0].values.reshape(-1,1)               #類為特征專用,所以不能使用一維數組
transformer = Binarizer(threshold=30).fit_transform(X)
​
transformer

(2) KBinsDiscretizer

主要是對連續數據進行分段處理, 可以通過參數進行比較靈活的分段

from sklearn.preprocessing import KBinsDiscretizer
​
X = data.iloc[:,0].values.reshape(-1,1) 
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit_transform(X)
​
#查看轉換后分的箱:變成了一列中的三箱
set(est.fit_transform(X).ravel())
​
est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')
#查看轉換后分的箱:變成了啞變量
est.fit_transform(X).toarray()

參數:

n_bins: 分箱的個數,默認為5

encode:編碼方式,分箱之后使用什么方式進行編碼,有幾種常見的可選項,"one-hot", "ordinal", "onehot-dense" 等。

strategy: 如何分箱,分箱的寬度等,有幾種方式

  • "uniform": 按照等寬進行分箱,箱子最大寬度為 ( f.max() - f.min() ) / ( n_bings) f為特征。
  • "quantile": 等位分箱,每個箱子里面樣本量相同。
  • "kmeans": 表示按照聚類分箱

(3) 樹模型

可以構建一個樹模型,然后通過樹的分支來對模型進行分箱,這個沒有具體操作過,所以簡單提一下。

Entity Embedding

Entity Embedding 可以將變量直接編碼成一個向量,如果想要用基於神經網絡的方法去訓練離散型數據的話,這個方法非常建議使用。

(1) 離散變量

本質上就等價於一個全連接層神經網絡作為編碼,舉個例子:

數據的特征首先進行one-hot 然后假設有三個類別,N個樣本的話,就可以的到一個 N*3 的one-hot表征,這個時候,可以定義一個Embedding 尺寸為(3,M), M 表示要轉換的維度,於是,特征通過相乘就轉換為了
(N,3)x (3,M) -> (N,M)

具體怎么實現,兩種方法,第一是直接通過標簽訓練這個矩陣,第二是直接加入一個Embedding層,然后和其他特征一起訓練就可以了 , 其實也可以理解為NLP中的詞嵌入層,直接加入一個nn.Embedding() 層就可以了。

(2) 連續變量

針對於連續型變量,想要進行Entity Embedding的話,可以進行分箱操作。 如下圖所示,首先,是對連續型變量進行分組,分組后對應一個值,例如均值或者中值,用這個值\(c_i\)表示。 之后來了新值之后,可以先和\(c_i\)做求距離操作,然后進行softmax,這樣可以得到一個權重w,用來表示這個值和各個箱子的距離。然后權重w在和Embedding() 層相乘,就可以得到最終的表征了。

舉個例子:

首先 Embedding層尺寸為: (N , M )

x 為輸入,尺寸為 ( B, 1), 這里B 是batch的數量, x 是一個連續型的變量,輸入是一個浮點型數據。之后,x 和每一個 分箱的中心代表值\(c_i\) 做求距離操作,距離越近,表示這個值越應該屬於這個箱子,這個時候,對距離做softmax操作,可以得到一個權重w, 尺寸為( B, N) , 注意這里分母加了一項防止除0

\[w = softmax(\frac{1}{|x_b-c_i|+\epsilon}|) \]

最后,得到的權重和Embedding相乘就可以得到最終的表征了, 最后輸出的是 (B,M) 維度的表征。((B, N ) * (N, M ) = (B ,M))

    $$
    r_x = w * Embeeding()
    $$

參考

《特征工程入門與實踐》
《精通特征工程》
《菜菜sklearn》


免責聲明!

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



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