當數據集的數值屬性具有非常大的比例差異,往往導致機器學習的算法表現不佳,當然也有極少數特例。在實際應用中,通過梯度下降法求解的模型通常需要歸一化,包括線性回歸、邏輯回歸、支持向量機、神經網絡等模型。但對於決策樹不使用,以C4.5為例,決策樹在進行節點分裂時主要依據數據集D關於特征X的信息增益比,而信息增益比根特征是否經過歸一化是無關的。
同比例縮放所有屬性常用的兩種方法是:最小-最大縮放和標准化
最小-最大縮放(又加歸一化),將值重新縮放使其最終范圍在0-1之間,(current - min)/ (max - min),Scikit-Learn提供了MinMaxSaler轉換器可以完成該功能
標准化,(current - mean) / var,使得得到的結果分布具備單位方差,相比最小-最大縮放,標准化的方法受異常值的影響更小,同樣Scikit-Learn也提供了StandScaler轉換器
1. MinMaxScaler和StandScaler類結構
2. MinMaxScaler示例
>>> from sklearn.preprocessing import MinMaxScaler >>> >>> data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]] >>> scaler = MinMaxScaler() >>> print(scaler.fit(data)) MinMaxScaler(copy=True, feature_range=(0, 1)) >>> print(scaler.data_max_) [ 1. 18.] >>> print(scaler.transform(data)) [[ 0. 0. ] [ 0.25 0.25] [ 0.5 0.5 ] [ 1. 1. ]] >>> print(scaler.transform([[2, 2]])) [[ 1.5 0. ]]
3. StandScaler示例
>>> data = [[0, 0], [0, 0], [1, 1], [1, 1]] >>> scaler = StandardScaler() >>> print(scaler.fit(data)) StandardScaler(copy=True, with_mean=True, with_std=True) >>> print(scaler.mean_) [ 0.5 0.5] >>> print(scaler.transform(data)) [[-1. -1.] [-1. -1.] [ 1. 1.] [ 1. 1.]] >>> print(scaler.transform([[2, 2]])) [[ 3. 3.]]