转载自:https://mp.weixin.qq.com/s/B1eh4IcHTnEdv2y0l4MCog
拥有一种可靠的方法来预测和预测未来事件一直是人类的愿望。在数字时代,我们拥有丰富的信息,尤其是时间序列数据。
时间序列是指基于时间刻度维度(天、月、年等)采样和组织的任何数据。预测它将提供有价值的见解,帮助我们做出明智的决策并制定业务战略。时序数据示例包括:
金融市场:股票价格、汇率和交易量。
气候和天气:温度、降雨量和风速。
销售和需求预测:一段时间内的产品销售数据。
网站流量和用户行为:页面浏览量、点击率和转化率。
能源消耗:用电量和能源需求。
传感器数据:来自制造业、医疗保健和运输业传感器的测量值。
社交媒体活动:点赞、评论、分享和关注者数量。
这些示例展示了时间序列数据在业务数据分析的战略领域(如金融、天气、销售、在线分析、能源管理、传感器监控和社交媒体分析)中的多样性。掌握这些领域中每个领域的时间序列机器学习 (ML) 可以在事件预测和有效管理影响趋势、模式和其他波动的因素方面产生显着的好处。
在本文中,我们将踏上使用机器学习技术掌握时间序列分析和预测的旅程。
时序数据中的自动分析和预测:特点和挑战
随着机器学习预测的出现,我们现在拥有强大的工具来分析和发现时间序列数据中的模式。这使我们能够做出准确的预测和预测。让我们了解一下时间序列数据的组成:
趋势。在时间序列数据理论中,趋势是指值随时间变化的行为。它可以是正的(表示上升趋势)或负的(表示下降趋势)。
季节性。季节性是时间序列数据的一个特征,它以固定的时间间隔显示重复出现的模式。这些模式以恒定的频率重复。
残差。从数据中提取趋势和季节性分量后,剩余部分称为剩余部分或残差。这表示数据中不符合趋势或季节性模式的部分。对这个余数的分析有助于检测时间序列中的异常或意外波动。
周期。当时间序列显示没有固定周期或季节性的重复模式或波动时,它被称为周期性行为。与季节性不同,这些周期不遵循特定且可预测的频率。它们可能是由于外部因素或潜在模式而发生的,而这些因素或潜在模式不容易被趋势或季节性成分捕捉到。
平稳性。当时间序列的统计属性随时间变化保持不变时,它被认为是静止的。这意味着数据的均值、标准差和协方差不会随时间而变化。稳态时间序列更容易分析和建模,因为它们的行为保持一致。
与静态数据分析相比,时间序列数据分析遵循不同的框架。如上一节所述,对时间序列数据的分析首先要解决一些基本问题,例如:
数据是否呈现趋势?
数据中是否存在可识别的模式或季节性?
数据的特征是静止的还是非静止的?
时间序列分析中的关键问题包括识别趋势、模式/季节性和确定平稳性。在静态数据分析中,描述性分析、预测性分析和规范性分析等过程很常见。这些过程适用于时间序列和静态机器学习应用程序。但是,某些指标(例如相关性)在描述性、预测性和规范性框架中的使用方式不同。顺便说一句,这两种类型的数据都可以在自动化ML的帮助下进行处理。
时间序列数据的结构是独一无二的,对分析和预测提出了特定的挑战:
与静态数据不同,时间序列数据本质上是动态的,并且具有基于时间维度的固有顺序。
时间方面增加了复杂性,因为序列中的值取决于过去的观测值,并表现出趋势、季节性和不规则性。
在时间序列数据的上下文中,缺失值表现为时间序列中的间隙。这些差距表示数据观测缺失或不完整的时期。
如图所示,数据中可能存在明显的差距,这些差距无法通过通常用于静态数据的标准插补策略进行逻辑填充。这些差距在数据集中以明显的空白形式存在,对处理缺失值的传统方法提出了挑战。
为了有效地分析时间序列数据,了解其组成部分(如趋势和季节性)至关重要。此外,时间序列数据可能会表现出不规则的波动和噪声,需要在分析过程中加以考虑。
时间序列算法:优点和缺点
机器学习时间序列算法提供了强大的工具来释放时间序列数据的潜力。这些机制使时间序列分析和预测成为可能,每种机制都有其优点和局限性。了解这些有助于为手头的任务选择正确的算法。让我们探讨一些流行的算法及其优缺点:
ARIMA(自回归综合移动平均线)
ARIMA是一种功能强大的算法,广泛用于时间序列分析。它结合了三个主要组件:
自回归 (AR)
移动平均线 (MA)
时间序列差异。
自回归捕获观测值与一定数量的滞后观测值之间的线性关系。移动平均分量考虑过去预测误差的加权平均值。差分量通过取连续观测值之间的差值来帮助将非平稳数据转换为平稳数据。通过组合这些组件,ARIMA 可以有效地捕获时间序列数据中的趋势、季节性和噪声。
让我们考虑一个银行和金融数据预测的例子。要使用 ARIMA 模型预测公司的股价,首先要获取过去十年的公开股价数据。获得此数据后,可以继续训练 ARIMA 模型。为了确定 ARIMA 模型的适当参数,您需要分析数据中的趋势。这涉及选择使数据平稳所需的时间序列差分 (d) 的顺序。通过检查自相关和偏自相关,您可以确定模型的回归顺序 (p) 和移动平均线顺序 (q)。
要选择最拟合的模型,您可以使用各种性能指标,例如 Akaike 信息准则 (AIC)、贝叶斯信息准则 (BIC)、最大似然率和标准误差。这些指标有助于评估模型的拟合优度,并确保它捕获股票价格数据中的重要特征和模式。通过系统地分析数据并选择最佳参数,ARIMA模型可以提供有关公司股价的宝贵见解和预测。这种方法允许您利用历史趋势和模式在金融领域做出明智的决策和预测。
结论:ARIMA具有简单性和可解释性,适用于短期预测,适用于稳态数据。但是,它可能会遇到复杂的模式和长期依赖关系。
LSTM(长短期记忆)
LSTM 是一种递归神经网络 (RNN),擅长对序列和时间依赖性进行建模。与传统的前馈神经网络不同,LSTM网络具有独特的记忆单元结构,使它们能够在更长的时间段内保留和利用信息。这使得 LSTM 在捕获时间序列数据中的长期依赖关系方面特别有效。LSTM 模型可以学习数据中的复杂模式和关系,使其适用于以下领域的深度学习时间序列:
语音识别
自然语言处理
股市预测。
该网络能够选择性地忘记或记住信息,使其能够处理非平稳时间序列数据并捕获不同时间尺度的时间依赖关系。
结论:LSTM 在处理非线性模式和长期依赖关系时大放异彩。它从历史数据中学习的能力使其成为一个强大的选择。然而,它需要更多的计算资源和更大的数据集进行训练。
Prophet
Prophet 由 Facebook 开发,是一款专为时间序列预测而设计的强大算法。它利用加法模型来捕获非线性趋势、年度、每周和每日季节性以及假日效应。当应用于具有突出季节性模式和大量历史记录的时间序列数据时,它的表现非常出色。Prophet铂慧的显著优势之一是能够处理缺失数据并适应趋势的变化,同时在处理异常值方面也表现出鲁棒性。
事实证明,Prophet对于具有以下特征的数据集特别有价值:
涵盖跨越数月或数年的重大时间跨度,以每小时、每天或每周的频率捕获细粒度和详细的历史观测结果。
显示同时发生的多个突出的季节性模式。
纳入事先已知的重大不规则事件。
包含缺失的数据点或值得注意的异常值。
展示接近饱和点的非线性增长趋势。
增长函数用作捕获数据潜在趋势的模型。这个概念与那些具有基本数学知识的人通常知道的熟悉的线性和逻辑函数相一致。然而,Facebook Prophet引入了一个新概念,它允许增长趋势灵活地适应数据中的特定点,称为“变化点”。变化点表示数据中发生明显方向偏移的时刻。
这些点标志着增长模式发生变化的转变,使Prophet铂慧能够有效地捕捉和适应趋势随时间的变化。Prophet作为加法回归模型运行,包含分段线性或逻辑增长曲线趋势。它包含使用傅里叶级数建模的年度季节性分量和使用虚拟变量建模的每周季节性分量。通过利用这些功能,Prophet铂慧可以有效地捕捉上述数据集特征中固有的复杂性。
结论:Prophet专注于业务预测,能够有效地处理季节性和假日效应。但是,它可能无法捕获复杂的交互,并且可能需要仔细的特征工程。
时间序列预测的实用技巧
要利用时间序列机器学习的强大功能进行预测,有以下实用技巧:
-
预处理数据
清理数据、处理缺失值并解决异常值。如果需要,应用归一化或差分等技术来实现平稳性。 -
时间序列特征工程
提取有意义的特征,以捕获数据中的基础模式。考虑滞后变量、滚动统计量或傅里叶变换来捕捉季节性。 -
选择合适的模型
深入了解各种算法的功能和约束,并仔细选择最适合您独特时间序列的算法。在可解释性和复杂性之间取得平衡,以找到最佳解决方案。 -
将训练和测试分开
将数据划分为不同的训练集和测试集,确保测试集代表看不见的未来数据。通过评估模型在测试集上的预测来评估模型的性能。 -
微调超参数
通过网格搜索或贝叶斯优化等技术优化所选算法的超参数。此迭代过程通过查找最佳设置组合来帮助优化模型的性能。 -
集成学习
通过结合多个模型的预测来提高准确性并减少偏差。Ensembling 利用各个模型的优势来创建更强大、更可靠的预测解决方案。
时间序列预测的应用
-
能耗预测
时间序列深度学习模型可以预测能源消耗模式,使能源供应商能够根据预期天气、季节、人口变化等众多因素优化其供需管理、降低成本并提高可持续性。 -
股票市场预测
交易者和投资者可以利用深度学习时间序列算法的强大功能来分析复杂的股票市场数据,准确预测趋势,发现盈利交易的潜在机会,并有效管理风险。通过利用循环神经网络和长短期记忆模型等先进技术,这些算法可以捕获市场中复杂的模式和依赖关系,为做出明智的投资决策提供有价值的见解。 -
零售业需求预测
机器学习技术可用于分析历史销售数据并预测零售行业对各种产品的未来需求。这有助于零售商优化库存管理,确保产品可用性,并最大限度地减少积压或缺货,从而提高客户满意度和盈利能力。
不同场景中,数据建模基本上大同小异,如下简单示例使用LSTM进行预测时间序列:
import numpy as np
from keras.models import Sequential
from keras.layers import LSTM, Dense
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
# 假设你有一个名为 timeseries_data 的一维numpy数组,代表你的时间序列数据
# timeseries_data = np.array(...)
# 预处理数据:标准化,并创建监督学习问题所需的输入和输出
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(timeseries_data.reshape(-1, 1))
# 创建一个监督学习问题,即使用过去的数据点来预测下一个数据点
def create_dataset(dataset, look_back=1):
X, Y = [], []
for i in range(len(dataset)-look_back-1):
a = dataset[i:(i+look_back), 0]
X.append(a)
Y.append(dataset[i + look_back, 0])
return np.array(X), np.array(Y)
look_back = 3 # 假设我们使用过去3个时间点来预测下一个点
X, y = create_dataset(scaled_data, look_back)
# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 重塑输入数据,以适应LSTM的输入要求:[samples, time steps, features]
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
# 构建LSTM模型
model = Sequential()
model.add(LSTM(4, input_shape=(look_back, 1)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
# 训练模型
model.fit(X_train, y_train, epochs=100, batch_size=1, verbose=2)
# 预测
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)
# 反标准化预测结果
train_predict = scaler.inverse_transform(train_predict)
y_train = scaler.inverse_transform([y_train])
test_predict = scaler.inverse_transform(test_predict)
y_test = scaler.inverse_transform([y_test])
# 评估模型
train_score = np.sqrt(np.mean(((train_predict - y_train) ** 2))
print('Train Score: %.2f RMSE' % (train_score))
test_score = np.sqrt(np.mean(((test_predict - y_test) ** 2))
print('Test Score: %.2f RMSE' % (test_score))
结论
机器学习解锁了时间序列数据中隐藏的宝石。了解独特的挑战并选择合适的算法可以实现准确的预测。通过仔细的数据预处理、特征工程、模型选择和性能评估,我们利用机器学习的力量来战胜时间序列问题。