数据归一化与标准化均是数据特征无量纲化处理方式,而无量纲化是指通过一个合适的变量替代,将一个涉及物理量的方程的部分或全部的单位移除,以求简化实验或者计算的目的,是科学研究中一种重要的处理思想。
无量纲处理主要将数据按比例缩放,使之落入一个小的特定区间,一般目的在于:去除数据的单位限制,转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。
数据特征无量纲化主要有以下优点:
1、加速模型求解,例如模型使用梯度下降法求最优解时,经过归一化/标准化处理可以加快结果收敛速度;
2、提升模型精度,对于KNN、聚类等算法需要求解样本点之间的距离时,通过特征无量纲化,避免某一特征取值域较大特征主导距离计算,以此提高模型精度。
数据归一化是将数据x按照最小值中心化后,再按照极差(最大值-最小值)进行缩放,最终数据会被收敛到【0,1】之间。
归一化公式如下:
数据标准化是指数据按均值中心化后,再按照标准差缩放,数据就会服从均值为0,方差为1的标准正态分布。
标准化公式如下:
首先标准化和归一化都不会改变数据分布,只是对数据进行线性无量纲处理,通过相应的缩放和平移使数据发生改变,但并没有改变原始数据的排列顺序。
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 创建数组
data_rn = np.random.randint(-10, 10, 10).reshape(5, 2)
plt.subplots(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.plot(data_rn);
plt.subplot(1, 2, 2)
sns.distplot(data_rn);
# 归一化
scales_mm = MinMaxScaler()
data_rn_new = scales_mm.fit(data_rn).transform(data_rn)
# 标准化
scales_ss = StandardScaler()
data_rn_new1 = scales_ss.fit(data_rn).transform(data_rn)
plt.subplots(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.plot(data_rn_new);
plt.subplot(1, 2, 2)
plt.plot(data_rn_new1);
plt.subplots(figsize=(10, 4))
plt.subplot(1, 2, 1)
sns.distplot(data_rn_new);
plt.subplot(1, 2, 2)
sns.distplot(data_rn_new1);
从上图看出原始数据排序并未发生变化,其次归一化Normalization默认将数据缩放到【0,1】之间,但是标准化Standardiza没有严格的区间,变化后的数据没有范围,只是数据整体的均值为0,标准差为1
此外,归一化并不会消除异常值影响,其缩放比例与极值有关,因此对于存在异常值的数据,归一化并不是一个好的选择;而标准化缩放比例和整体数据集有关,因为其针对数据方差进行数据缩放。
一般情况下,因为MinMaxScaler对异常值较为敏感,所以优先选择StandardScaler进行特征缩放,例如聚类、逻辑回归、支持向量机、PCA等。
但是在数据缩放不涉及距离、梯度等计算,并且对数据的范围有严格要求时,就可以使用MinMaxScaler进行数据缩放。
但并不是所有情况都涉需要标准化和归一化:
类似决策树模型,在节点分裂的时候计算的是信息增益,标准化后并不能大幅提高模型的计算速度;
类似概率模型,并不关心变量的值,只关心变量的分布和变量之间的条件概率。
综上所述,一般在特征无量纲化的时候,如果没有硬性规定(缩放范围、距离计算等),可以先使用标准化,效果不好再试试归一化。
参考文献:(81条消息) 数据处理中的标准化、归一化,究竟是什么?_小一的学习笔记的博客-CSDN博客_数据标准化是什么意思