數據預處理:標稱型特征的編碼和缺失值處理


注:本文是人工智能研究網的學習筆記

標稱型特征編碼(Encoding categorical feature)

有些情況下,某些特征的取值不是連續的數值,而是離散的標稱變量(categorical)。

比如一個人的特征描述可能是下面的或幾種:

features ['male', 'female'], ['from Europe', 'from US', 'from Asia'], ['use Firefox', 'use Chorme', 'use Safari', 'Use IE']。

這樣的特征可以被有效的編碼為整型特征值(interger number)。

['male', 'US', 'use IE']  -->>  [0,1,3]
['femel', 'Asia', 'use Chrome']  -->> [1,2,1]

但是這些整數型的特征向量是無法直接被sklearn的學習器使用的,因為學習器希望輸入的是連續變化的量或者可以比較大小的量,但是上述特征里面的數字大小的比較是沒有意義的。

一種變換標稱型特征(categorical features)的方法是使用one-of-K或者叫one-hot encoding,在類OneHotEncoder里面就已經實現了。這個編碼器將每一個標稱型特征編碼成一個m維二值特征,其中每一個樣本特征向量就只有一個位置是1,其余位置全是0。

enc = preprocessing.OneHotEncoder()
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])

enc.transform([[0,1,3]]).toarray()

第一列的取值有兩個,使用兩個數字編碼;第二列取值有單個,使用三個數字編碼;第三列取值有4個,使用四個數字編碼。一共使用九個數字進行編碼。

默認情況下,每個特征分量需要多少個值是從數據集中自動推斷出來的。我們還可以通過參數n_values進行顯式的指定。上面的數據集中,有兩個性別,三個可能的地方以及四個瀏覽器。然后fit之后在對每一個樣本進行變換。結果顯示,前兩個值編碼了性別,接下來的三個值編碼了地方,最后的四個值編碼了瀏覽器。

注意:如果訓練數據中某個標稱型特征分量的取值沒有完全覆蓋其所有可能的情況,則必須給OneHotEncoder指定每一個標稱型特征分量的取值個數,設置參數:n_values。

enc = preprocessing.OneHotEncoder(n_values=[2,3,4])
enc.fit([[1,2,3],[0,2,0]])

enc.transform([[1,0,0]]).toarray()

缺失值處理(Imputation of missing values)

由於各種各樣的原因,很多真實世界中的數據集包含有缺失值,通常使用blanks,NaNs or other placeholders來代替。這樣的數據集是無法直接被sklearn的學習器模型處理的。

一個解決的辦法是將包含缺失值得整行或者整列直接丟棄。然而這樣可能會丟失很多有價值的數據。

一個更好的辦法是補全缺失值,也就是從已知的部分數據推斷出未知的數據。

Imputer類提供了補全缺失值得基本策略: 使用一行或者一列的均值,中值,出現次數最多的值來補全,該類也允許不同缺失值得編碼。

from sklearn.preprocessing import Imputer

imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit([[1,2], [np.nan,3], [7,6]])

X = [[np.nan,2], [6, np.nan], [7,6]]
imp.transform(X)

使用訓練得數據來進行補全。

Imputer類支持稀疏矩陣:

import scipy.sparse as sp
X = sp.csc_matrix([[1,2], [0,3], [7,6]])
imp = Imputer(missing_values=0, strategy='mean', axis=0)
imp.fit(X)

X_test = sp.csc_matrix([[0,2], [6,0], [7,6]])
imp.transform(X_test)

多項式特征(Generating polynominal features)

為輸入數據添加非線性特征可以增加模型的復雜度,實現這一點的常用的簡單方法是使用多項式特征(polynominal features),他可以引入特征的高階項和互乘積項。

sklearn的PolynominalFeatures類可以用來在出入數據的基礎上構造多項式特征。

from sklearn.preprocessing import PolynomialFeatures

X = np.arange(6).reshape(3,2)
poly = PolynomialFeatures(2)   # 二階
poly.fit_transform(X)

有些情況下,我們只想要原始輸入特征分量之間的互乘積項,這時可以設置參數:interaction_only=True,這時將不會出現次方項。

自定義轉換器(Custom transformers)

有時候,你需要把一個已經有的Python函數變為一個變換器transformer來進行數據的清理和預處理。

借助於FunctionTransformer類,你可以從任意的Python函數實現一個transformer。比如,構造一個transformer實現對數變換。

from sklearn.preprocessing import FunctionTransformer

transformer = FunctionTransformer(np.log1p)
X = np.array([[0,1], [2,3]])
transformer.transform(X


免責聲明!

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



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