长短期记忆(LSTM)系列_LSTM的数据准备(4)——如何
归⼀化标准化LSTM⽹络的数据
导读:
在训练神经⽹络(例如长短期记忆复现神经⽹络)时,可能需要缩放序列预测问题的数据。
当输⼊数据序列分布并不标准,或者变化幅度(标准差)过⼤时,这会减慢⽹络的学习和收敛速度,也会阻碍⽹络的学习效率。
因此您需要了解如何归⼀化和标准化序列预测数据,以及如何确定将哪中形式⽤于输⼊和输出变量。
您可能需要考虑两种类型的系列缩放:归⼀化和标准化。
这些都可以使⽤scikit-learn库来实现。
1、什么时候⽤归⼀化?什么时候⽤标准化?
(1)如果对输出结果范围有要求,⽤归⼀化。
(2)如果数据较为稳定,不存在极端的最⼤最⼩值,⽤归⼀化。
(3)如果数据存在异常值和较多噪⾳,⽤标准化,可以间接通过中⼼化避免异常值和极端值的影响。
某知乎答主的回答提到了他个⼈经验:⼀般来说,我个⼈建议优先使⽤标准哈。对于输出有要求时再尝试别的⽅法,如归⼀化或者更加复杂的⽅法。很多⽅法都可以将输出范围调整到[0, 1],如果我们对于数据的分布有假设的话,更加有效的⽅法是使⽤相对应的概率密度函数来转换。让我们以⾼斯分布为例,我们可以⾸先计算⾼斯误差函数(Gaussian Error Function),此处定为er fc(·),那么可以⽤下式进⾏转化:
归⼀化系列数据
归⼀化是对原始范围内的数据进⾏重新缩放,以使所有值都在0和1的范围内。
标准化要求您知道或能够准确估计最⼩和最⼤可观察值。您可以从可⽤数据中估算这些值。如果您的时间序列趋势向上或向下,估计这些预期值可能会很困难,并且规范化可能不是⽤于解决问题的最佳⽅法。
值的归⼀化如下:
1y = (x - min) / (max - min)
其中最⼩值和最⼤值与值x被归⼀化有关。
例如,对于数据集,我们可以将min和max可观察值猜测为30和-10。然后我们可以将任何值标准化,如18.8,如下所⽰:
1 2 3 4y = (x - min) / (max - min)
y = (18.8 - (-10)) / (30 - (-10)) y = 28.8 / 40
y = 0.72
您可以看到,如果提供的x值超出最⼩值和最⼤值的范围,则结果值将不在0和1的范围内。您可以在进⾏预测之前检查这些观察值并删除它们来⾃数据集或将它们限制为预定义的最⼤值或最⼩值。
您可以使⽤scikit-learn对象规范化数据集。
使⽤MinMaxScaler和其他缩放技术的良好实践⽤法如下:
使⽤可⽤的训练数据安装定标器。对于归⼀化,这意味着训练数据将⽤于估计最⼩和最⼤可观察值。这是通过调⽤fit()函数完成的。
将⽐例应⽤于训练数据。这意味着您可以使⽤标准化数据来训练模型。这是通过调⽤transform()函数完成的。
将⽐例应⽤于未来的数据。这意味着您可以在将来准备要预测的新数据。
如果需要,可以反转变换。这对于将预测转换回其原始⽐例以进⾏报告或绘图⾮常有⽤。这可以通过调⽤inverse_transform()函数来完成。
下⾯是⼀个标准化10个量的⼈为序列的例⼦。
缩放器对象要求将数据作为⾏和列的矩阵提供。加载的时间序列数据作为Pandas系列加载。
from pandas import Series
from sklearn.preprocessing import MinMaxScaler
# ⼿动定义⼀串序列
data = [10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0]
series = Series(data)
print(series)
# 准备归⼀化数据格式
values = series.values
values = shape((len(values), 1))
# 配置数据归⼀化⽅法MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
scaler = scaler.fit(values)
print('Min: %f, Max: %f' % (scaler.data_min_, scaler.data_max_))
# 输出归⼀化数据
normalized = ansform(values)
print(normalized)
# 归⼀化逆转换
inversed = scaler.inverse_transform(normalized)
print(inversed)
我们还可以看到数据集的最⼩值和最⼤值分别为10.0和100.0。运⾏该⽰例打印序列,打印从序列估计的最⼩值和最⼤值,打印相同的标准化序列,然后使⽤逆变换将值返回到其原始⽐例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 290 10.0
1 20.0
2 30.0
3 40.0
4 50.0
5 60.0
6 70.0
7 80.0
8 90.0
9 100.0
Min: 10.000000, Max: 100.000000
[[ 0. ]
[ 0.11111111]
[ 0.22222222]
[ 0.33333333]
[ 0.44444444]
[ 0.55555556]
[ 0.66666667]
[ 0.77777778]
[ 0.88888889]
[ 1. ]]
[[ 10.]
[ 20.]
[ 30.]
[ 40.]
[ 50.]
30 31 32 33 34[ 60.] [ 70.] [ 80.] [ 90.] [ 100.]]
标准化系列数据
标准化数据集涉及重新调整值的分布,以便观察值的平均值为0,标准差为1。
这可以被认为是减去平均值或使数据居中。
与标准化⼀样,当您的数据具有不同⽐例的输⼊值时,标准化可能很有⽤,甚⾄在某些机器学习算法中也是必需的。
标准化假定您的观察结果符合⾼斯分布(钟形曲线),具有良好的平均值和标准偏差。如果不满⾜此期望,您仍然可以标准化时间序列数据,但可能⽆法获得可靠的结果。
标准化要求您知道或能够准确估计可观察值的均值和标准差。您可以从训练数据中估算这些值。
值标准化如下:
1y = (x - mean) / standard_deviation
平均值计算如下:
1mean = sum(x) / count(x)
⽽standard_deviation计算如下:
1standard_deviation = sqrt( sum( (x - mean)^2 ) / count(x))
我们可以猜测平均值为10,标准偏差约为5.使⽤这些值,我们可以将第⼀个值20.7标准化如下:
1 2 3 4y = (x - mean) / standard_deviation y = (20.7 - 10) / 5
y = (10.7) / 5
y = 2.14
数据集的均值和标准差估计对新数据的稳健性可能⽐最⼩值和最⼤值更强。您可以使⽤scikit-learn对象来标准化数据集。
from pandas import Series
from sklearn.preprocessing import StandardScaler
from math import sqrt
# ⼿动定义⼀个待标准化序列
data = [1.0, 5.5, 9.0, 2.6, 8.8, 3.0, 4.1, 7.9, 6.3]
series = Series(data)
print(series)
# 准备标准化数据格式
values = series.values
function怎么记忆values = shape((len(values), 1))
# 配置标准化⽅法StandardScaler
scaler = StandardScaler()
scaler = scaler.fit(values)
print('Mean: %f, StandardDeviation: %f' % (an_, sqrt(scaler.var_)))
# 输出标准化后的数据
standardized = ansform(values)
print(standardized)
# 标准化数据的逆转换
inversed = scaler.inverse_transform(standardized)
print(inversed)
我们可以看到估计的平均值和标准偏差分别约为5.3和2.7。运⾏该⽰例打印序列,打印从序列估计的均值和标准差,打印标准化值,然后以原始⽐例打印值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 310 1.0
1 5.5
2 9.0
3 2.6
4 8.8
5 3.0
6 4.1
7 7.9
8 6.3
Mean: 5.355556, StandardDeviation: 2.712568
[[-1.60569456]
[ 0.05325007]
[ 1.34354035]
[-1.01584758]
[ 1.26980948]
[-0.86838584]
[-0.46286604]
[ 0.93802055]
[ 0.34817357]]
[[ 1. ]
[ 5.5]
[ 9. ]
[ 2.6]
[ 8.8]
[ 3. ]
[ 4.1]
[ 7.9]
[ 6.3]]
输⼊变量是否需要缩放取决于问题和每个变量的具体情况。我们来看⼀些例⼦。
分类输⼊
您可能有⼀系列分类输⼊,例如字母或状态。
通常,分类输⼊⾸先是整数编码,然后是⼀个热编码。也就是说,为每个不同的可能输⼊分配唯⼀的整数值,然后使⽤1和0的⼆进制向量来表⽰每个整数值。
根据定义,⼀个热编码将确保每个输⼊是⼀个⼩的实际值,在这种情况下为0.0或1.0。
实值输⼊
您可能有⼀系列数量作为输⼊,例如价格或温度。
如果数量的分布是正常的,则应该标准化,否则系列应该标准化。如果数值范围很⼤(10s 100s等)或⼩(0.01,0.0001),则适⽤。
如果数量值很⼩(接近0-1)且分布有限(例如标准偏差接近1),那么也许你可以在没有系列缩放的情况下逃脱。
其他输⼊
问题可能很复杂,如何最好地扩展输⼊数据可能并不清楚。
如果有疑问,请将输⼊序列标准化。如果您拥有这些资源,请使⽤原始数据,标准化数据和标准化来探索建模,并查看是否存在有益的差异。
缩放输出变量
输出变量是⽹络预测的变量。
您必须确保输出变量的⽐例与⽹络输出层上的激活函数(传递函数)的⽐例相匹配。
⼆元分类问题
如果您的问题是⼆进制分类问题,那么输出将是类值0和1.这最好使⽤输出层上的sigmoid激活函数建模。输出值将是介于0和1之间的实数值,可以捕捉到清晰的值。
多类分类问题
如果您的问题是多类分类问题,那么输出将是⼀个介于0和1之间的⼆进制类值的向量,每个类值⼀个输出。这最好使⽤输出层上的softmax激活功能建模。同样,输出值将是介于0和1之间的实数值,可以捕捉到清晰的值。
回归问题
如果您的问题是回归问题,那么输出将是⼀个实际值。这最好使⽤线性激活功能建模。如果值的分布正常,则可以标准化输出变量。否则,可以对输出变量进⾏标准化。
其他问题
可以在输出层上使⽤许多其他激活函数,并且您的问题的细节可能会增加混淆。
经验法则是确保⽹络输出与数据规模相匹配。
扩展时的实际考虑因素
缩放序列数据时有⼀些实际考虑因素。
估算系数。您可以从训练数据中估算系数(标准化的最⼩值和最⼤值或标准化的平均值和标准偏差)。检查这些⾸先估算并使⽤领域知识或领域专家来帮助改进这些估算,以便将来对所有数据进⾏有⽤的更正。
保存系数。您将需要以与⽤于训练模型的数据完全相同的⽅式对未来的新数据进⾏标准化。保存⽤于存档的系数,并在需要在进⾏预测时扩展新数据时加载它们。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论