在数据挖掘或机器学习中,输入的数据来自于不同的数据源,其取值范围、量纲不同,这时候我们需要对这些数据进行归一化或称作标准化。标准化后,将有利于提高机器学习初始化速度、提高算法的收敛速度和精度,也可以消除特征的量纲不同对模型的影响。
一、为什么需要归一化
归一化指的是将数据按比例缩放,使之落入一个小的特定区间。主要有以下几个原因:
1. 模型初始化速度
一旦确定好神经网络的架构后,其权重参数需要初始化,如果权重参数初始化太小,则整个神经网络的输出太小,使得网络学习过程非常缓慢,需要更长时间的学习才能收敛。如果权重参数初始化太大,则整个神经网络的输出太大,使得网络也无法学到更多的知识。那么我们可以通过归一化输入数据,用一组更合适的初始权重,默认初始化而不是0初始化,从而加快初始化速度。
2. 提高算法的收敛速度和精度
在神经网络中,一般使用梯度下降算法进行反向传播学习,而梯度下降算法需要计算梯度值来取得最佳av_min(最小值),如果收敛慢,不仅会耗费更多的计算时间,而且很容易陷入局部最小值中。归一化可以缩小特征间的差异,使得收敛速度更快,且不易陷入局部最小值。
3. 消除特征的量纲不同对模型的影响
在数据挖掘或机器学习中,输入的数据往往来自不同的数据源,其取值范围和量纲也不一致。例如身高和体重不在一个量纲。这会对模型产生影响,体现在模型的预测效果不佳,不能充分表达数据的意义。归一化则可以减少特征间的影响,增加模型的鲁棒性。
二、常用的归一化方法
1. Min-max归一化
Min-max归一化是对原始数据进行线性变换,将数据映射到[0, 1]区间内,其函数可表示为:
x = (x - min) / (max - min)
其中,x为每个数据的归一化后的结果,min和max分别为特征属性中的最小值和最大值。
其中,一份简单的python代码实现样例:
def min_max_scale(data):
"""Min-max scaling"""
return (data - np.min(data)) / (np.max(data) - np.min(data))
2. Z-score标准化
Z-score标准化是将原始数据转化为均值为0,标准差为1的分布。其函数可表示为:
x = (x - mean) / std
其中,x为每个数据的标准化结果,mean为特征属性中的均值,std为标准差。
其中,一份简单的python代码实现样例:
def z_score_scale(data):
"""Z-score scaling"""
return (data - np.mean(data)) / np.std(data)
三、反归一化的实现
在训练神经网络时,我们需要将归一化后的结果映射到原来的取值范围内,这个过程称为反归一化。反归一化可以用于提取真实结果,判断神经网络的预测效果。反归一化的函数与归一化是相反的。
1. 反Min-max归一化
如果已知待反归一化值$x'$、原本归一化的最大值$max$和最小值$min$,则可以通过下式反推出$x$值:
x = x'* (max - min) + min
其中,一份简单的python代码实现样例:
def inverse_min_max_scale(data, inverse_data):
"""Inverse Min-max scaling"""
min, max = np.min(data), np.max(data)
inv_data = inverse_data * (max - min) + min
return inv_data
2. 反Z-score标准化
如果已知待反归一化值$x'$、原本归一化的均值$mean$和标准差$std$,则可以通过下式反推出$x$值:
x = x' * std + mean
其中,一份简单的python代码实现样例:
def inverse_z_score_scale(data, inverse_data):
"""Inverse Z-score scaling"""
mean, std = np.mean(data), np.std(data)
inv_data = inverse_data * std + mean
return inv_data
总结
归一化与反归一化在数据挖掘和机器学习中起着重要的作用。在归一化方面,最常用的方法是Min-max归一化和Z-score标准化;在反归一化方面,只需要根据原本的归一化计算方法,并将映射到[0, 1]或者均值为0,标准差为1的分布的结果再次还原回去即可。