背景:由于特征之间的量纲不同,使得不同的指标之间没有可比性,不处于同一数量级的指标,无法进行分析。
解决方案:将所有的数据映射到同一个尺度中。
重要性:处于区间范围差异较大的特征,当采用随即梯度下降法学习时,学习速率相比同一区间更低。
适用于:通过梯度下降法求解的模型,如:线性回归,逻辑回归,SVM,神经网络等。
不适用于:树形结构
一、最值归一化 normalization
即:把所有数据映射到0-1之间
适用于:分布有明显边界的情况,如:学生分数/图像像素
缺点:受outlier影响较大,如:收入
python实现:
import numpy as np
x = np.random.randint(0,100,size=100)
(x - np.min(x)) / (np.max(x) - np.min(x))
X = np.random.randint(0,100,(50,2))
X = np.array(X, dtype=float)
# X[:,0]第一列,第一个特征
X[:,0] = (X[:,0] - np.min(X[:,0])) / (np.max(X[:,0]) - np.min(X[:,0]))
X[:,1] = (X[:,1] - np.min(X[:,1])) / (np.max(X[:,1]) - np.min(X[:,1]))
# n个特征时
for i in range(0,n):
X[:,i] = (X[:,i]-np.min(X[:,i])) / (np.max(X[:,i] - np.min(X[:,i])))
二、均值方差归一化 standardization
即:把所有数据归一到均值为0方差为1的分布中
适用于:分布无明显边界,有可能存在极端数据值 (除分数/像素等之外,基本都考虑有均值方差归一化)
python实现:
X2 = np.array(np.random.randint(0,100,(50,2)),dtype=float)
for i in range(0,2):
X2[:,i]=(X2[:,i]-np.mean(X2[:,i])) / np.std(X2[:,i])
三、在sklearn中专门的用来数据归一化的方法:StandardScaler
from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
standardScaler.fit(X_train)
standardScaler.mean_
standardScaler.scale_
X_train_standard = standardScaler.transform(X_train)
X_test_standard = standardScaler.transform(X_test)
注:测试数据集的均值和方差,依然使用训练集的