機器學習特徵工程之預處理

上篇文章介紹特徵抽取,這篇文章將要介紹徵工程的預處理。主要介紹對數據兩種方法兩種方式如何處理,它的算法原理是什麼,api如何使用,用於場景。

特徵處理

通過特定的統計方法(數學方法)將數據轉換成算法要求的數據

機器學習特徵工程之預處理

特徵處理之後的數據

如圖所示特徵抽取完之後,就要進行對其預處理,左邊就是原始特徵值,右邊就被預處理完之後的數據,之所以進行預處理是為了後續算法(算法後續文章將會更新)要求的數據。這裡要強調下,這時候的數據是數值型數據,是已經把文本、圖片轉換成數值之後。

數值型數據處理,有一種方法標準縮放,這方法又有兩種方式一種叫做歸一化,一種叫做標準化;對於類別型數據的處理的方法叫one-hot編碼;對於時間類型處理的方法有時間的切分。

接下來介紹第一組數據轉化的方式。

歸一化

特點:通過對原始數據進行變換把數據映射到(默認為[0,1])之間

機器學習特徵工程之預處理

歸一化的算法公式

公式解釋:作用於每一列,max為一列的最大值,min為一列的最小值,mx、mi分別為指定區間值默認mx為1、mi為0,X''為最終結。

舉個栗子,理解

機器學習特徵工程之預處理

以第一列為例

解(得一分):
X'=(90-60)/(90-60)=1
X''=1* (1-0)+0=1

所以第一列第一行為1

X'=(60-60)/(90-60)=0
X''=0 (1-0)+0=0
 

所以第一列第二行為0

X'=(75-60)/(90-60)=0.5
X''=0 .5(1-0)+0=0.5

所以第一列第二行為0.5

API:

sklearn歸一化API: sklearn.preprocessing.MinMaxScaler
MinMaxScalar(feature_range=(0,1)…)
 每個特徵縮放到給定範圍(默認[0,1])
 MinMaxScalar.fit_transform(X)
 X:numpy array格式的數據[n_samples,n_features]
 返回值:轉換後的形狀相同的array

案例:

def gyh():
 dict = MinMaxScaler()
 data = dict.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])
 print(data)
	 
	 
if __name__ == '__main__':
 gyh()
機器學習特徵工程之預處理

執行結果

作用:

進行歸一化,使特徵同等重要。使某一個特徵不會對結果造成傾斜式的影響。

相親約會對象數據,這個樣本時男士的數據,三個特徵,玩遊戲所消耗時間的

百分比、每年獲得的飛行常客里程數、每週消費的冰淇淋公升數。然後有一個

所屬類別,被女士評價的三個類別,不喜歡didnt、魅力一般small、極具魅力large

也許也就是說飛行里程數對於結算結果或者說相親結果影響較大,但是統計的

人覺得這三個特徵同等重要。

機器學習特徵工程之預處理

如果上圖的算法是(72993-35948)^2+(10.141740-6.83)^2+(1.03-1.21)^2 這樣它影響因素就變成里程數,而不是三個因素。這時候對三個因素進行歸一化處理,這樣里程數和公升數和消耗時間比,影響就是相同的。

缺點:

從公式看出,這種算法很受最大值最小值影響。

在特定場景下最大值最小值是變化的,另外,最大值與最小值非常容易受異常點影響,所以這種方法魯棒性較差,只適合傳統精確小數據場景。

標準化

特點:

通過對原始數據進行變換把數據變換到均值為0,標準差為1範圍內。

機器學習特徵工程之預處理

公式

注:作用於每一列,mean為平均值, 6為標準差(考量數據的穩定性)

機器學習特徵工程之預處理

舉個栗子說明:

機器學習特徵工程之預處理

第一列的方差

 var=((90-75)^2+(60-75)^2+(75-75)^2)/3=300

方差決定為該數據的穩定性。

標準化與歸一化的差別:

對於歸一化來說:如果出現異常點,影響了最大值和最小值,那麼結果顯然會發生改變。

對於標準化來說:如果出現異常點,由於具有一定數據量,少量的異常點對於平均值的影響並不大,從而方差改變較小。

標準化由於方差跟平均值大多相關,比歸一化的魯棒性強很多。所以標準化是常用於特徵處理的方式。

Api:

sklearn特徵化API: scikit-learn.preprocessing.StandardScaler
StandardScaler(…)
	處理之後每列來說所有數據都聚集在均值0附近標準差為1
		StandardScaler.fit_transform(X,y)
			X:numpy array格式的數據[n_samples,n_features]
			返回值:轉換後的形狀相同的array
		StandardScaler.mean
			原始數據中每列特徵的平均值
		StandardScaler.var
			原始數據每列特徵的方差

案例:

def staevc():
 dict = StandardScaler()
 data = dict.fit_transform([[1., -1., 3.], [2., 4., 2.], [4., 6., -1.]])
 print(data)
	 
	 
if __name__ == '__main__':
 staevc()
機器學習特徵工程之預處理

運行結果

標準化適合在已有樣本足夠多的情況下比較穩定,適合現代嘈雜大數據場景。

缺失值處理

處理方式:

刪除: 如果每列或者行數據缺失值達到一定的比例,建議放棄整行或者整列。

插補:可以通過缺失值每行或者每列的平均值、中位數來填充。

Api:

sklearn缺失值API: sklearn.preprocessing.Imputer
Imputer(missing_values='NaN', strategy='mean', axis=0)
 完成缺失值插補
 Imputer.fit_transform(X,y) 
 X:numpy array格式的數據[n_samples,n_features]
 返回值:轉換後的形狀相同的array

案例:

def imputerevc():
 im = Imputer(missing_values='NaN', strategy='mean', axis=0)
 data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
 print(data)
if __name__ == '__main__':
	imputerevc()
機器學習特徵工程之預處理

初始化Imputer,指定”缺失值”,指定填補策略,指定行或列。缺失值也可以是別的指定要替換的值。這裡傳進去的空值必須用使用np.nan/np.NaN來代替,該類型屬於float類型 im = Imputer(missing_values='NaN', strategy='mean', axis=0),第一個參數是鎖定空值,第二個是如果是空則取平均值,這裡的平均值是取不包括空值的平均值,如上圖結果 (1+7)/2=4.,axis=0是從列中取。

後續會持續更新由淺入深機器學習的技術文章,關注我隨時瞭解人工智能


分享到:


相關文章: