特征缩放(Feature Scaling)是将不同特征的值量化到同一区间的方法。
实现特征缩放有多种方法,下面介绍两种常用的方法:归一化和标准化:
- 特征缩放原因
- 特征缩放方法
1. 特征缩放原因
我们的数据集中会包含很多特征,有些情况下,这些不同的特征可能由于计量单位的不同(也可能由于其他原因),导致范围上差别很大。例如:
[ [0.7, 1, 18, 207, ], [0.5, 8, 88, 200, ], [0.2, 4, 45, 108, ], ]
上述数据集包含了 4 个特征,特征之间的数值范围相差甚大。例如:
第 1 个特征的取值范围是:0-1 之间
第 2 个特征的取值范围是:1-10 之间
第 3 个特征的取值范围是:10-100 之间
第 4 个特征的取值范围是:100-1000 之间
假设,此时们需要使用该数据集进行欧式距离计算,那么数值范围较大的特征对距离的影响就会很大,数值范围较小的特征对距离计算的影响就会很小。
所以,我们希望将不同数值范围的特征缩放到相同的范围内,进而保证不同数值范围的特征都会对距离计算的结果拥有适当的影响。
2. 特征缩放方法
特征缩放的方法有很多中,我们介绍 2 种方法:归一化和标准化:
这两种特征缩放方法有什么区别呢?
- 归一化过程中,如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变,适合精确小的场景。
- 标准化将数据变换到均值为0, 标准差为 1 范围内。少量的异常点对于平均值的影响并不大,从而方差改变较小。
下面使用 sklearn 库实现上述两种特征缩放方法:
from sklearn import preprocessing # 数据预处理模块 # 1. 数据归一化 def test_minmax_scaler(): # 待处理数据 data = [ [0.7, 1, 18, 207, ], [0.5, 8, 88, 200, ], [0.2, 4, 45, 108, ], ] # 创建归一化对象 minmax_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1)) # 归一化计算 minmax_data = minmax_scaler.fit_transform(data) print("归一化结果:\n", minmax_data) # 2. 数据标准化 def test_standard_scaler(): # 待处理数据 data = [ [0.7, 1, 18, 207, ], [0.5, 8, 88, 200, ], [0.2, 4, 45, 108, ], ] # 创建标准化对象 standard_scaler = preprocessing.StandardScaler() standard_data = standard_scaler.fit_transform(data) print("标准化结果:\n", standard_data) if __name__ == "__main__": test_minmax_scaler() test_standard_scaler()
程序结算结果:
归一化结果: [ [1. 0. 0. 1. ] [0.6 1. 1. 0.92929293] [0. 0.42857143 0.38571429 0. ] ] 标准化结果: [ [ 1.13554995 -1.16247639 -1.1217059 0.78327499] [ 0.16222142 1.27872403 1.30672955 0.62809787] [-1.29777137 -0.11624764 -0.18502365 -1.41137286] ]