【调参18】如何对数据进行标准化(standardization)和归一化(normalization)



深度学习神经网络学习如何将训练数据集中的样本从输入映射到输出。其模型的权重被初始化为较小的随机值,并根据训练数据集上的误差估计值通过优化算法进行更新。

考虑到在模型中使用小的权重以及在预测值和期望值之间使用误差,用于训练模型的输入和输出是一个重要因素。未缩放的输入变量可能导致学习过程缓慢或不稳定,回归问题上未缩放的变量可能导致梯度爆炸,从而导致学习过程失败。

数据准备涉及在训练神经网络模型之前,使用标准化(standardization)和归一化(normalization)来重新缩放输入和输出变量。


1. 基本知识

1.1 标准化(Standardization)和归一化(Normalization)

  • 标准化(Standardization)是指对具有高斯分布的变量进行缩放,以使其均值为零,标准差为1
  • 归一化(Normalization)是指缩放具有任何分布的变量,以使所有值都在零和一之间

在标准化变量后可以进行归一化。


1.2 原始输入数据的问题

深度学习神经网络模型学习从输入变量到输出变量的映射。对于每个变量,从输入空间中提取的数据的规模和分布可能会有所不同。输入变量可能具有不同的单位(例如,英尺,公里和小时),这意味着变量具有不同的比例。

输入变量之间的比例差异可能会增加建模问题的难度。较大的输入值可以导致学习较大权重值的模型。具有较大权重值的模型通常是不稳定的,这意味着它可能会在学习过程中表现不佳,并且对输入值的敏感性会导致较高的泛化误差

具有较大值分布的目标变量可能会导致较大的误差梯度值,从而导致权重值急剧变化,从而使学习过程不稳定。缩放输入和输出变量是使用神经网络模型的关键步骤。


1.3 输入变量的缩放方法

输入变量是网络在输入或可见层上进行预测的变量。一个好的经验法则是,输入变量应该是较小的值,可能在0-1的范围内,或者以均值为0、标准差为1进行标准化。输入变量是否需要缩放取决于问题和每个变量的具体情况。

如果数量分布是正态的(高斯分布),则应将其标准化,否则应将数据归一化。如果数量值的范围较大(10s,100s等)或较小(0.01、0.0001),则适用。如果数量值很小(接近0-1)并且分布有限(例如,标准偏差接近1),则可能无需进行数据缩放。

如果输入变量是线性组合的(例如在MLP中),那么至少从理论上讲,几乎没有必要对输入进行标准化。[…]但是,出于各种实际原因,标准化输入可以使训练更快并减少陷入局部最优的可能


1.4 输出变量是否应该缩放

输出变量是网络预测的变量。如果输出激活函数的范围为[0,1],那么显然必须确保目标值在该范围内。但是,通常最好选择适合目标分布的输出激活函数,而不是强制数据遵循输出激活函数。

如果是回归问题,那么输出将是实际值,最好用线性激活函数进行建模。如果值的分布是正态的,则可以标准化输出变量。否则,可以将输出变量归一化。


2. 数据缩放方法

2.1 数据归一化(Normalization)

数据归一化是对原始范围内的数据进行重新缩放,以使所有值都在0到1的范围内。标准化要求能够准确估计观察值的最小值和最大值。归一化公式如下:

y = (x - min) / (max - min)

比如最大观察值和最小观察值分别为30和-10的数据集,可以将任何值归一化,对于数据18.8,经过归一化后变为0.72。

y = (x - min) / (max - min)
y = (18.8 - (-10)) / (30 - (-10))
y = 28.8 / 40
y = 0.72

可以使用scikit-learn的 MinMaxScaler 标准化数据集。【API

MinMaxScaler和其它类似方法的用法和优势主要有以下三点:

  • 通过训练数据来学习缩放规则:对于归一化来说,这意味着训练数据将被用来估计观察值的最大值和最小值,在该API中,通过 fit() 方法实现。
  • 将缩放规则应用于训练数据:在该API中,使用transform()方法实现将缩放规则应用于训练数据,从而使用缩放后的数据训练模型。
  • 将缩放规则应用于预测数据:可以将模型预测输出通过反变换,变为未经缩放之前所对应的数据。

该API基本用法如下:

from sklearn.preprocessing import MinMaxScaler
# load data
data = ...
# create scaler
scaler = MinMaxScaler()

# fit scaler on data
scaler.fit(data)
# apply transform
normalized = scaler.transform(data)

#--------------------------------------
# fit and transform in one step
normalized = scaler.fit_transform(data)
#--------------------------------------

# inverse transform
inverse = scaler.inverse_transform(normalized)

2.2 数据标准化(Standardization)

标准化数据集涉及重新缩放值的分布,以使观测值的平均值为0,标准偏差为1。有时将其称为白化(whitening)。

与归一化类似,当数据具有不同比例的输入值时,标准化可能会有用,甚至在某些机器学习算法中也是必需的。标准化假设观测值符合高斯分布,且均值和标准差表现良好。如果不满足此期望,仍然可以标准化数据,但可能无法获得可靠的结果。标准化要求能够准确估计可观察值的平均值和标准差,可以从训练数据中估计这些值。

标准化公式如下:

mean = sum(x) / count(x)
standard_deviation = sqrt( sum( (x - mean)^2 ) / count(x))
y = (x - mean) / standard_deviation

例如平均值为10、标准差为5的数据集,对于数据20.7,归一化后的值为2.14。

y = (x - mean) / standard_deviation
y = (20.7 - 10) / 5
y = (10.7) / 5
y = 2.14

数据集的均值和标准差估计值对新数据的可靠性可能比最小和最大值更高。

可以使用scikit-learn的 StandardScaler 来标准化数据集。【API

该API基本用法如下:

from sklearn.preprocessing import StandardScaler
# load data
data = ...

# create scaler
scaler = StandardScaler()

# fit scaler on data
scaler.fit(data)
# apply transform
standardized = scaler.transform(data)

# ---------------------------------------
# fit and transform in one step
standardized = scaler.fit_transform(data)
# ---------------------------------------

# inverse transform
inverse = scaler.inverse_transform(standardized)

参考:
https://machinelearningmastery.com/how-to-improve-neural-network-stability-and-modeling-performance-with-data-scaling/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章