数据标准化与归一化
特征归一化、标准化的理解
数据集如果标准化处理,对机器学习中的很多算法(包括梯度下降),会有很好的优化效果。如果数据未标准化(例如,数据集特征之间相差的数量级较大时),很多算法的表现性能不佳。
首先理解方差、标准差和均方根误差的区别
方差(variance)
衡量随机变量或一组数据的离散(偏离)程度
概率论中,方差是用来度量随机变量和其数学期望的(均值)之间的偏离程度。
统计学中,各数据分别与其平均数之差的平方和
假设一组随机变量或统计数据的期望(均值)用表示,则其方差表示为各数据与差的平方和,然后再求其期望(均值)得
为什么要使用标准差
根据上文我们知道方差是用来衡量随机变量或一组数据的离散(偏离)程度,标准差(也叫均方差)的公式为,方差和标准差有一个共有的性质:值越大分布曲线越扁也就是越分散。
由于数据是随机的,假设其同分布根据中心极限定理,该数据服从高斯(正太)分布(典型的例子就是误差),我们看下分布面积情况。
在使用标准差的时候我们可以清楚的看到数据属于某个值的概率。(我们处理特征的时候可以以此为依据筛选掉outlier)
横轴区间内的面积为68.268949%
横轴区间内的面积为95.449974%
横轴区间内的面积为99.730020%
根据切比雪夫不等式,偏离个标准差距离的概率小于
标准差(均方差)、均方误差的区别
标准差也叫均方差,而MSE(Mean Squared Error),平均平方误差,为所有样本误差(真实值与预测值之差)的平方和,然后取均值。MSE是回归分析中度量模型好坏的标准,此还有RMSE、MAE和。均方差是数据序列与均值的关系,而均方误差是数据序列与真实值之间的关系。
数据标准化和归一化
数据标准化是将数据按比例进行缩放去除数据之间的限制,将其转化为无量纲的数据便于各指标数据进行加权和比较,归一化可以说作为标准化的一种(数据标准化和归一化一般用于连续值,离散值一般使用labelencoding 和onehot对数据进行转换)。
目前数据标准化的方法主要分为以下三种:
直线型方法(阈值法:极值法等、标准化、比重法)
折线形
曲线型
不同的标准化方法,对系统的评价结果会产生不同的影响,在机器学习训练时可以多次进行尝试。
归一化的目的
- 提升模型的收敛速度
- 提升模型的精度
- 防止模型梯度爆炸
模型收敛速度的提升
在实际应用中,通过梯度下降法求解的模型一般都是需要归一化的,比如线性回归、logistic回归、KNN、SVM、神经网络等模型。
如果特征之间量纲差距较大的时候,模型的等高线呈现椭圆形,而在进行梯度下降时,梯度的方向为垂直等高线的方向,所以模型会走“之”字形路线,且此时学习率过大或过小将会导致梯度发散或不收敛的情况。
如果特征之间量纲差距较大的时候,模型的等高线呈现圆形,迭代速度会加快,此时只需调整学习率速度即可。如下图:
提升模型的精度
在涉及到距离计算的模型时,如果某一特征数值差别特别大,在计算的过程中会占据主导地位,对于值较小的特征则可能会导致信息的缺失(数值变化对最后计算结果几乎没有影响)。所以为使模型能够充分学习到各个特征的信息,我们在进行模型分析时应对数据进行标准化处理。数值标准化主要包括数据同趋化处理和数据量纲话处理。
数据同趋化主要是解决不同性质的问题,由于不同性质的指标不能直接加总进行处理,因而将其转化为同一种分布状态(标准正太分布),使所有指标对测评方案的作用力同趋化,再加总才能得出正确结果。
数据无量纲化主要是解决数据可比性的问题,及时数据处于同一种分布状态,如果不同特征之间没有进行数据归一化操作,较大特征会始终占据主导地位。
因此归一化是让不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。
深度学习中数据归一化可以防止梯度爆炸
常用的数据归一化方法及特点
(1) 最大最小标准化(min-max Normalization)
- 又称为离差标准化,将结果映射到[0,1]之间
- 使用情况:本归一化方法适用于数据值比较集中的情况,在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法(不包括Z-score方法)。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围
- 缺陷: 该方法极易收到最大值和最小值的影响,使的归一化结果不稳定使得后续使用效果也不稳定。实际使用中可以用经验常量来替代max和min。
(2) Z-score标准化方法(zero-mean normalization)
- 通过Z-score标准化方法处理后的数据会服从标准正态分布,处理后的值区间不为[0,1],因此不能叫做归一化,其转换函数
- Z-score标准化方法适用于属性的最大值和最小值未知的情况,此外Z-score方法可用于筛除outlier。在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,Z-score标准化表现更好。
- 缺陷:要求原始数据的分布近似为高斯分布,否则效果会很差。
(3) 函数转换
- 通过以10为底的log函数转换的方法同样可以实现归一下,具体方法如下:
sklearn 标准化与归一化的方法
我们可以使用sklearn中提供的相关类对数据集进行标准化处理,可以将特征转换成相同的数量级,进而消除数量级不同对算法造成的影响。常用的两种方式:
- StandardScaler
- MinMaxScaler。
StandardScaler 将特征转换为标准正态分布的形式。(均值为0,标准差为1。)
MinMaxScaler 将特征转换(缩放)为指定区间的分布。默认(也是通常情况下),我们将特征缩放到[0, 1],我们也把这种缩放方式成为归一化。
# 进行尝试
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.model_selection import train_test_split
X, y = load_boston(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
lr = LinearRegression()
lr.fit(X_train, y_train)
# 数据集未标准化对线性回归类影响不大。
print(lr.score(X_train, y_train))
print(lr.score(X_test, y_test))
# 数据集未标准化对梯度下降算法影响极大。
sgd = SGDRegressor(eta0=0.01, max_iter=100)
sgd.fit(X_train, y_train)
print(sgd.score(X_train, y_train))
print(sgd.score(X_test, y_test))