归一化和标准化
特征缩放是数据要做的最重要的转换之一。除了个别情况,当输入的数值属性量度不同,不同的特征指标有的不一样的量度和单位,这样就会影响到数据分析的结果,以至于机器学习算法的性能都不会好,此时就需要对数据进行归一化或标准化的处理。
概念
归一化:值被转变、重新缩放,把数据变为(0,1)之间的小数,把有量纲表达式变成无量纲表达式。
标准化:将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。例如:首先减去平均值(所以标准化值的平均值总是 0),然后除以方差,使得到的分布具有单位方差。就服从均值为0,方差为1的分布,也就是标准高斯分布
作用
在实际应用中,由于不同特征的数据往往具有不同的指标,例如身高与体重,它们就具有不同的量纲长度和单位,此时就会影响数据分析的结果和模型的性能。此时我们可以将其进行标准化处理,使得这些特征的指标能够服从一样的分布,此时即能够去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较。
经过标准化的数据是无量纲的纯数值,对其进行归一化把数据变为(0,1)之间的小数。
如右图对两个特征进行了归一化后,对应的等高线就会变圆
在梯度下降进行求解时能较快的收敛,而不像左图需要走许多的“弯路”
而且能够给模型有更高的精度
实现代码
归一化、标准化
[
- 归一化:将数据缩放到区间[0,1]
from sklearn import preprocessing
import numpy as np
x = np.array([[10,2,3],
[4,5,6],
[7,8,9]])
##对每一列进行归一化
min_max_scaler = preprocessing.MinMaxScaler()
x_minmax = min_max_scaler.fit_transform(x)
print(x_minmax)
#[[1. 0. 0. ]
# [0. 0.5 0.5]
#[0.5 1. 1. ]]
- 标准化:去除数据的单位限制,将其转化为无量纲的纯数值,通过对原始数据进行变换把数据变换到均值为0,方差为1范围内。
from sklearn.preprocessing import StandardScaler
std = StandardScaler()
data = std.fit_transform([[1., -1., 3.],
[2., 4., 2.],
[4., 6., -1.]])
print(data)
#[[-1.06904497 -1.35873244 0.98058068]
# [-0.26726124 0.33968311 0.39223227]
# [ 1.33630621 1.01904933 -1.37281295]]