目錄
什么是特征處理
通過 特定的統計方法(數學方法)將 數據 轉換成 算法要求的數據
- 數值型數據
- 歸一化
- 標准化
- 缺失值
- 類別型數據:one-hot編碼
- 時間類型:時間的切分
歸一化(Normalization)
目的
使得某一個特征對最終的結果不會造成更大的影響,即【三個特征同等重要的時候,就需要進行歸一化】歸一化公式如下:
\[X^{'} = \frac{x-min}{max-min} \]
\[X^{''} =X^{'}*(mx-mi)+mi \]
注:作用於每一列,max為一列的最大值,min為一列的最小值,那么x”為最終結果,mx,mi分別為指定區間值默認mx為1,mi為0
例如:
得到如下
特點、缺點、應用
特點:通過對原始數據進行變換把數據映射到(默認為[0,1])之間
缺點、應用:異常點對最大值最小值的影響太大, 所以這種方法魯棒性較差,只適合傳統精確小數據場景
實現代碼(sklearn庫)
from sklearn.preprocessing import MinMaxScaler # sklearn歸一化API
def normalization():
"""
歸一化處理
:return: NOne
"""
mm = MinMaxScaler(feature_range=(0, 1)) # 【 每個特征縮放到給定范圍(默認[0, 1]) feature_range = (0, 1) 】
# X:numpy array格式的數據[n_samples,n_features]
# 返回值:轉換后的形狀相同的array
data = mm.fit_transform([[90, 2, 10, 40],
[60, 4, 15, 45],
[75, 3, 13, 46]])
print(data)
return None
if __name__ == '__main__':
normalization()
輸出:
[[1. 0. 0. 0. ]
[0. 1. 1. 0.83333333]
[0.5 0.5 0.6 1. ]]
標准化(Standardization)
目的
通過對原始數據進行變換把數據變換到均值為0,方差為1范圍內
標准化公式如下:
\[X^{'} =\frac{x-mean}{σ} \]
\[var =\frac{(x_1-mean)^2+(x_2-mean)^2+...(x_n-mean)^2}{n} \]
\[σ=\sqrt{var} \]
注:作用於每一列,mean為平均值,σ為標准差(考量數據的穩定性)
方差:
衡量隨機變量或一組數據時離散程度的度量,
方差越大,說明數據越離散,就是都是離平均值遠;方差為0, 說明所有這個特征所有值都一樣
例如:
應用
應用:在已有樣本足夠多的情況下比較穩定,適合現代嘈雜大數據場景。
實現代碼(sklearn庫)
from sklearn.preprocessing import StandardScaler # sklearn標准化API
def standardization():
"""
標准化縮放
:return:
"""
std = StandardScaler()
# 處理之后每列來說所有數據都聚集在均值0附近方差為1
# X:numpy array格式的數據[n_samples,n_features]
# 返回值:轉換后的形狀相同的array
data = std.fit_transform([[90, 2, 10, 40],
[60, 4, 15, 45],
[75, 3, 13, 46]])
print(data)
return None
if __name__ == '__main__':
standardization()
輸出:
[[ 1.22474487 -1.22474487 -1.29777137 -1.3970014 ]
[-1.22474487 1.22474487 1.13554995 0.50800051]
[ 0. 0. 0.16222142 0.88900089]]
歸一化、標准化對比
對於歸一化來說:
如果出現異常點,影響了最大值和最小值,那么結果顯然會發生改變。
對於標准化來說:
如果出現異常點,由於具有一定數據量,少量的異常點對於平均值的影響並不大,從而方差改變較小。
缺失值
- 刪除:如果每列或者行數據缺失值達到一定的比例,建議放棄整行或者整列
- 插補:可以通過缺失值每行或者每列的平均值、中位數來填充
from sklearn.preprocessing import Imputer
import numpy as np
def im():
"""
缺失值填補
:return:
"""
# missing_values 需要填補的值的類型
# strateg 填補策略
# axis 按行(1)按列(0)填補
im = Imputer(missing_values="NaN", strategy="mean",axis=0)
data = im.fit_transform([[1,2],[np.nan,3],[7,6]])
print(data)
return None
if __name__ == '__main__':
im()