数据预处理:标称型特征的编码和缺失值处理
本文轉自https://www.cnblogs.com/cnkai/p/7755097.html
標稱型特征編碼(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 Imputerimp = 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 PolynomialFeaturesX = 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 FunctionTransformertransformer = FunctionTransformer(np.log1p) X = np.array([[0,1], [2,3]]) transformer.transform(X總結
以上是生活随笔為你收集整理的数据预处理:标称型特征的编码和缺失值处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 标称型数据和数值型数据_2017-12-
- 下一篇: BERT 是如何分词的