时间序列预测基础教程系列(13)_归一化和标准化的区别与方法(Python)
导读:
数据的预处理方法有两种,分别是归一化和标准化
什么时候用归一化?什么时候用标准化?
(1)如果对输出结果范围有要求,用归一化。
(2)如果数据较为稳定,不存在极端的最大最小值,用归一化。
(3)如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。
正文:
完成本教程后,您将了解:
- 使用标准化的数据规范化和期望的局限性。
- 需要什么参数以及如何手动计算标准化和标准化值。
- 如何使用Python中的scikit-learn来标准化和标准化您的时间序列数据
该数据集描述了澳大利亚墨尔本市10年(1981-1990)的最低日常温度。
单位为摄氏度,有3,650个观测值。数据来源被称为澳大利亚气象局。
下面是前5行数据的示例,包括标题行。
[code]"Date","Temperatures" "1981-01-01",20.7 "1981-01-02",17.9 "1981-01-03",18.8 "1981-01-04",14.6 "1981-01-05",15.8
下面是从数据市场获取的整个数据集的图表。
最低每日温度
本教程假定数据集位于当前工作目录中,文件名为 “ daily-minimum-temperature-in-me.csv”。
注意:下载的文件包含一些问号(“?”)字符,在使用数据集之前必须删除这些字符。在文本编辑器中打开文件并删除“?”字符。同时删除文件中的任何页脚信息。
归一化时间序列数据
归一化是对原始范围内的数据进行重新缩放,以使所有值都在0和1的范围内。
当您的时间序列数据具有不同比例的输入值时,归一化可能是有用的,甚至在某些机器学习算法中也是必需的。对于算法,例如k-最近邻,它使用距离计算和线性回归和人工神经网络可能需要归一化。重量输入值。
标准化要求您知道或能够准确估计最小和最大可观察值。您可以从可用数据中估算这些值。如果您的时间序列趋势向上或向下,估计这些预期值可能会很困难,并且规范化可能不是用于解决问题的最佳方法。
值的规范化如下:
y = (x - min) / (max - min)
其中最小值和最大值与值x被归一化有关。
例如,对于温度数据,我们可以将最小和最大可观察值猜测为30和-10,这些值大大超过和低估。然后我们可以将18.8之类的任何值标准化,如下所示:
y = (x - min) / (max - min)
y = (18.8 - -10) / (30 - -10)
y = 28.8 / 40
y = 0.72
您可以看到,如果提供的x值超出最小值和最大值的范围,则结果值将不在0和1的范围内。您可以在进行预测之前检查这些观察值并删除它们来自数据集或将它们限制为预定义的最大值或最小值。
您可以使用scikit-learn对象MinMaxScaler规范化数据集。
使用MinMaxScaler和其他重新缩放技术的良好实践用法如下:
- 使用可用的训练数据安装定标器。对于归一化,这意味着训练数据将用于估计最小和最大可观察值。这是通过调用fit()函数完成的,
- 将比例应用于训练数据。这意味着您可以使用标准化数据来训练模型。这是通过调用transform()函数完成的
- 将比例应用于未来的数据。这意味着您可以在将来准备要预测的新数据。
如果需要,可以反转变换。这对于将预测转换回其原始比例以进行报告或绘图非常有用。这可以通过调用inverse_transform()函数来完成。
以下是标准化每日最低温度数据集的示例。
缩放器要求将数据作为行和列的矩阵提供。加载的时间序列数据作为Pandas 系列加载。然后必须将其重新整形为具有3,650行的一列矩阵。
然后使用重新整形的数据集来拟合缩放器,对数据集进行归一化,然后反转归一化变换以再次显示原始值。
[code]# Normalize time series data from pandas import Series from sklearn.preprocessing import MinMaxScaler # load the dataset and print the first 5 rows series = Series.from_csv('daily-minimum-temperatures-in-me.csv', header=0) print(series.head()) # 准备归一化数据 values = series.values values = values.reshape((len(values), 1)) # 定义缩放范围(0,1) scaler = MinMaxScaler(feature_range=(0, 1)) scaler = scaler.fit(values) print('Min: %f, Max: %f' % (scaler.data_min_, scaler.data_max_)) # 归一化数据集并打印前5行 normalized = scaler.transform(values) for i in range(5): print(normalized[i]) # 逆变换并打印前5行 inversed = scaler.inverse_transform(normalized) for i in range(5): print(inversed[i])
运行该示例将从已加载的数据集中打印前5行,以其标准化形式显示相同的5个值,然后使用逆变换将值返回其原始比例。
我们还可以看到数据集的最小值和最大值分别为0和26.3。
[code]Date 1981-01-01 20.7 1981-01-02 17.9 1981-01-03 18.8 1981-01-04 14.6 1981-01-05 15.8 Name: Temp, dtype: float64 Min: 0.000000, Max: 26.300000 [ 0.78707224] [ 0.68060837] [ 0.7148289] [ 0.55513308] [ 0.60076046] [ 20000 20.7] [ 17.9] [ 18.8] [ 14.6] [ 15.8]
还有另一种类型的重新缩放对于超出预期值范围的新值更加稳健; 这称为标准化。我们接下来会看一下。
标准化时间序列数据
标准化数据集涉及重新调整值的分布,以便观察值的平均值为0,标准差为1。
这可以被认为是减去平均值或使数据居中。
与标准化一样,当您的时间序列数据具有不同比例的输入值时,标准化可能是有用的,甚至在某些机器学习算法中也是必需的。
标准化假定您的观察结果符合高斯分布(钟形曲线),具有良好的平均值和标准偏差。如果不满足此期望,您仍然可以标准化时间序列数据,但可能无法获得可靠的结果。
这包括支持向量机,线性和逻辑回归等算法,以及其他假设或使用高斯数据提高性能的算法。
标准化要求您知道或能够准确估计可观察值的均值和标准差。您可以从训练数据中估算这些值。
值标准化如下:
y = (x - mean) / standard_deviation
凡平均值的计算公式为:
mean = sum(x) / count(x)
而standard_deviation计算如下:
standard_deviation = sqrt( sum( (x - mean)^2 ) / count(x))
例如,我们可以绘制最低每日温度数据集的直方图,如下所示:
[code]from pandas import Series from matplotlib import pyplot series = Series.from_csv('daily-minimum-temperatures-in-me.csv', header=0) series.hist() pyplot.show()
运行代码会给出以下图表,该图表显示数据集的高斯分布,如标准化所假设的那样。
最低每日温度直方图
我们可以猜测平均温度为10,标准偏差约为5.使用这些值,我们可以将数据集中的第一个值标准化为20.7,如下所示:
y = (x - mean) / standard_deviation
y = (20.7 - 10) / 5
y = (10.7) / 5
y = 2.14
数据集的均值和标准差估计对新数据的稳健性可能比最小值和最大值更强。
您可以使用scikit-learn对象StandardScaler来标准化数据集。
以下是标准化每日最低温度数据集的示例。
[code]# Standardize time series data from pandas import Series from sklearn.preprocessing import StandardScaler from math import sqrt # load the dataset and print the first 5 rows series = Series.from_csv('daily-minimum-temperatures-in-me.csv', header=0) print(series.head()) # 准备数据 values = series.values values = values.reshape((len(values), 1)) # 定义标准化模型 scaler = StandardScaler() scaler = scaler.fit(values) print('Mean: %f, StandardDeviation: %f' % (scaler.mean_, sqrt(scaler.var_))) # 开始标准化,打印前五行 normalized = scaler.transform(values) for i in range(5): print(normalized[i]) # 逆标准化数据 inversed = scaler.inverse_transform(normalized) for i in range(5): print(inversed[i])
运行该示例将打印数据集的前5行,打印标准化的相同值,然后以原始比例打印值。
我们可以看到估计的平均值和标准偏差分别为11.1和4.0。
[code]Date 1981-01-01 20.7 1981-01-02 17.9 1981-01-03 18.8 1981-01-04 14.6 1981-01-05 15.8 Name: Temp, dtype: float64 Mean: 11.177753, StandardDeviation: 4.071279 [ 2.33888328] [ 1.65113873] [ 1.87219948] [ 0.84058266] [ 1.13533032] [ 20.7] [ 17.9] [ 18.8] [ 14.6] [ 15.8]
- 时间序列预测基础教程系列(15)_如何网格搜索ARIMA模型超参数(Python)
- Python时间序列LSTM预测系列教程(7)-多变量
- Python时间序列LSTM预测系列教程(2)-单变量
- Python时间序列LSTM预测系列教程(10)-多步预测
- Python时间序列LSTM预测系列教程(1)-单变量
- Python时间序列LSTM预测系列教程(4)-单变量
- Python时间序列LSTM预测系列教程(8)-多变量
- Python时间序列LSTM预测系列教程(6)-单变量
- Python时间序列LSTM预测系列教程(9)-多变量
- Python时间序列LSTM预测系列教程(5)-单变量
- Python 循序渐进教程系列 之基础01
- Python系列视频教程: Django【13讲】第五讲 URL配置
- python 基础2 编码转换 pycharm 配置 运算符 基本数据类型int str list tupple dict for循环 enumerate序列方法 range和xrange
- Python系列视频教程: Django【13讲】第三讲 模板变量的使用
- 【Python基础教程】第2章 列表和元组-2.2通用序列操作
- 2.python中对于序列比较基础的迭代方法。
- python基础教程之lambda表达式使用方法
- python基础教程之简单入门说明(变量和控制语言使用方法)
- 在Python中操作时间之mktime()方法的使用教程
- Python Twisted系列教程1:Twisted理论基础