日萌社
人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度學習實戰(不定時更新)
1.7 特徵工程-特徵預處理
1 什麼是特徵預處理
1.1 特徵預處理定義
scikit-learn的解釋
provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.
翻譯過來:通過一些轉換函數將特徵數據轉換成更加適合算法模型的特徵數據過程
-
爲什麼我們要進行歸一化/標準化?
- 特徵的單位或者大小相差較大,或者某特徵的方差相比其他的特徵要大出幾個數量級,容易影響(支配)目標結果,使得一些算法無法學習到其它的特徵
-
舉例:約會對象數據
我們需要用到一些方法進行無量綱化,使不同規格的數據轉換到同一規格
1.2 包含內容(數值型數據的無量綱化)
- 歸一化
- 標準化
1.3 特徵預處理API
sklearn.preprocessing
2 歸一化
2.1 定義
通過對原始數據進行變換把數據映射到(默認爲[0,1])之間
2.2 公式
作用於每一列,max爲一列的最大值,min爲一列的最小值,那麼X’’爲最終結果,mx,mi分別爲指定區間值默認mx爲1,mi爲0
那麼怎麼理解這個過程呢?我們通過一個例子
2.3 API
- sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
- MinMaxScalar.fit_transform(X)
- X:numpy array格式的數據[n_samples,n_features]
- 返回值:轉換後的形狀相同的array
- MinMaxScalar.fit_transform(X)
2.4 數據計算
我們對以下數據進行運算,在dating.txt中。保存的就是之前的約會對象數據
milage,Liters,Consumtime,target
40920,8.326976,0.953952,3
14488,7.153469,1.673904,2
26052,1.441871,0.805124,1
75136,13.147394,0.428964,1
38344,1.669788,0.134296,1
- 分析
1、實例化MinMaxScalar
2、通過fit_transform轉換
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
def minmax_demo():
"""
歸一化演示
:return: None
"""
data = pd.read_csv("./data/dating.txt")
print(data)
# 1、實例化一個轉換器類
transfer = MinMaxScaler(feature_range=(2, 3))
# 2、調用fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("最小值最大值歸一化處理的結果:\n", data)
return None
返回結果:
milage Liters Consumtime target
0 40920 8.326976 0.953952 3
1 14488 7.153469 1.673904 2
2 26052 1.441871 0.805124 1
3 75136 13.147394 0.428964 1
.. ... ... ... ...
998 48111 9.134528 0.728045 3
999 43757 7.882601 1.332446 3
[1000 rows x 4 columns]
最小值最大值歸一化處理的結果:
[[ 2.44832535 2.39805139 2.56233353]
[ 2.15873259 2.34195467 2.98724416]
[ 2.28542943 2.06892523 2.47449629]
...,
[ 2.29115949 2.50910294 2.51079493]
[ 2.52711097 2.43665451 2.4290048 ]
[ 2.47940793 2.3768091 2.78571804]]
問題:如果數據中異常點較多,會有什麼影響?
2.5 歸一化總結
注意最大值最小值是變化的,另外,最大值與最小值非常容易受異常點影響,所以這種方法魯棒性較差,只適合傳統精確小數據場景。
怎麼辦?
3 標準化
3.1 定義
通過對原始數據進行變換把數據變換到均值爲0,標準差爲1範圍內
3.2 公式
作用於每一列,mean爲平均值,σ爲標準差
所以回到剛纔異常點的地方,我們再來看看標準化
- 對於歸一化來說:如果出現異常點,影響了最大值和最小值,那麼結果顯然會發生改變
- 對於標準化來說:如果出現異常點,由於具有一定數據量,少量的異常點對於平均值的影響並不大,從而方差改變較小。
3.3 API
- sklearn.preprocessing.StandardScaler( )
- 處理之後每列來說所有數據都聚集在均值0附近標準差差爲1
- StandardScaler.fit_transform(X)
- X:numpy array格式的數據[n_samples,n_features]
- 返回值:轉換後的形狀相同的array
3.4 數據計算
同樣對上面的數據進行處理
- 分析
1、實例化StandardScaler
2、通過fit_transform轉換
import pandas as pd
from sklearn.preprocessing import StandardScaler
def stand_demo():
"""
標準化演示
:return: None
"""
data = pd.read_csv("dating.txt")
print(data)
# 1、實例化一個轉換器類
transfer = StandardScaler()
# 2、調用fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("標準化的結果:\n", data)
print("每一列特徵的平均值:\n", transfer.mean_)
print("每一列特徵的方差:\n", transfer.var_)
return None
返回結果:
milage Liters Consumtime target
0 40920 8.326976 0.953952 3
1 14488 7.153469 1.673904 2
2 26052 1.441871 0.805124 1
.. ... ... ... ...
997 26575 10.650102 0.866627 3
998 48111 9.134528 0.728045 3
999 43757 7.882601 1.332446 3
[1000 rows x 4 columns]
標準化的結果:
[[ 0.33193158 0.41660188 0.24523407]
[-0.87247784 0.13992897 1.69385734]
[-0.34554872 -1.20667094 -0.05422437]
...,
[-0.32171752 0.96431572 0.06952649]
[ 0.65959911 0.60699509 -0.20931587]
[ 0.46120328 0.31183342 1.00680598]]
每一列特徵的平均值:
[ 3.36354210e+04 6.55996083e+00 8.32072997e-01]
每一列特徵的方差:
[ 4.81628039e+08 1.79902874e+01 2.46999554e-01]
3.5 標準化總結
在已有樣本足夠多的情況下比較穩定,適合現代嘈雜大數據場景。
4 總結
- 什麼是特徵工程【知道】
- 定義
- 通過一些轉換函數將特徵數據轉換成更加適合算法模型的特徵數據過程
- 包含內容:
- 歸一化
- 標準化
- 定義
- 歸一化【知道】
- 定義:
- 對原始數據進行變換把數據映射到(默認爲[0,1])之間
- api:
- sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
- 參數:feature_range -- 自己指定範圍,默認0-1
- 總結:
- 魯棒性比較差(容易受到異常點的影響)
- 只適合傳統精確小數據場景(以後不會用你了)
- 定義:
- 標準化【掌握】
- 定義:
- 對原始數據進行變換把數據變換到均值爲0,標準差爲1範圍內
- api:
- sklearn.preprocessing.StandardScaler( )
- 總結:
- 異常值對我影響小
- 適合現代嘈雜大數據場景(以後就是用你了)
- 定義: