当前位置: 首页 > 科技观察

基于TensorFlow和QuestDB的时间序列预测_0

时间:2023-03-18 00:36:03 科技观察

译者|朱显忠点评|孙淑娟机器学习时间序列预测概述目前,机器学习正在席卷全球,机器人可以在很多领域以类人的精度完成任务。比如在医疗领域,智能助手可以随时查看人们的健康状况;在金融领域,也有一些工具可以合理准确地预测投资回报率;在网络营销方面,也开发了一些产品推荐工具。历史推荐特定的产品和品牌。在上述这些应用领域中,可以使用不同类型的数据来训练机器学习模型。其中,时间序列数据用于训练机器学习算法。在这种情况下,计时是一个关键组成部分。时间序列数据非常复杂,涉及回归、分类和聚类等传统机器学习算法范围之外的与时间相关的特征。幸运的是,今天我们可以直接使用现成的机器学习模型进行时间序列预测。由于时间的可变性,从时间序列预测中得出的预测可能并不十分精确,但它们确实提供了适用于各种领域的合理近似值。让我们考虑以下用例:预测性维护:如今,物联网、人工智能(AI)和集成系统正在电子、机械和其他类型的设备中嵌入并变得智能化。这些物联网设备中安装了传感器,以随时间跟踪相关值;人工智能是时间序列预测的关键组成部分,用于分析这些数据并预测设备可能需要维护的大概时间。异常检测:检测系统功能中罕见事件和观察结果的过程。识别这些事件可能非常具有挑战性,但时间序列预测通过提供可以持续监控事物的智能元素来帮助完成此类任务。金融科技领域的网络安全、健康监控和欺诈检测是利用时间序列分析进行异常检测的系统的几个例子。物联网数据:物联网正在成为当今社会经济的重要支柱。物联网设备能够及时存储数据并跨其他设备进行通信以进行分析和预测。一个例子是温度预测:在这个应用中,人们使用不同的物联网设备定期存储温度数据,因此这种预测经常用于与天气相关的预测和决策。自动调整决策:通过时间序列预测,企业可以更好地监控对其产品或解决方案的需求,并及时预测未来需求,从而相应地调整他们的服务。交易:每天股市开盘和收盘时,波动数据会在几秒钟内输入。使用各种数据库和文件存储系统来存储所有这些信息,然后可以使用不同的时间序列预测算法对未来一天、一周甚至一个月的价格进行预测。在本文的其余部分,我们将构建和训练一个使用时间序列数据的简单机器学习模型,并使用谷歌的TensorFlow框架和时间序列数据库QuestDB来实现趋势和事件预测。TensorFlow和QuestDB简介时间序列预测可以通过不同的方式完成,包括使用各种机器学习算法,例如ARIMA、ETS、简单指数平滑和递归神经网络(RNN)等。其中RNN是一种深度学习方法,当然它也有很多变种,比如LSTM和GRU。这些神经网络在神经网络层之间具有反馈回路。这使它们成为时间序列预测任务的理想选择,因为网络可以“记住”以前的数据。使用Google的TensorFlow库可以更轻松地实施这些深度学习算法;目前,该库支持多种流行的神经网络和深度学习算法。任何算法的核心都是数据,这与时间序列预测没有什么不同。与传统数据库相比,时序数据库(TSDB)提供了更多存储和分析时序数据的功能。对于本教程,我选择的TSDB是QuestDB,这是一个开源时间序列数据库,专注于快速性能和易用性。预测数据分析在行动现在,我相信您对时间序列数据和时间序列分析有了更深入的了解。接下来,让我们通过构建一个使用这些数据来预测趋势的具体应用程序来进一步了解这是如何实现的。本教程将使用美元对印度卢比数据集的历史汇率,您可以在链接(https://excelrates.com/historical-exchange-rates/USD-INR)下载Excel格式的数据集。请确保选择1999-2022年之间的时间跨度。该数据集包含三列:日期:表示汇率日期的时间部分。USD:以美元表示的美元价格(常量1.0)。INR:特定日期以INR表示的美元价格。如您所知,时间序列预测算法有许多不同的方案(例如ARIMA、ETS、简单指数平滑、RNN、LSTM、GRU等)。本文将重点介绍深度学习解决方案——使用神经网络完成时间序列预测。值得注意的是,在少量数据上使用RNN会导致称为消失梯度的问题。为此,人们引入了门机制LSTM和GRU。由于该项目的架构简单;因此,GRU是本教程的最佳选择,数据示例较少。开始吧!安装TensorFlowTensorFlow可以通过Python包管理器(PIP)轻松安装。请确保您使用的是Python3.6和TensorFlow1.15(及更高版本),以便与本文的示例项目实现最佳兼容性。当然,如果你的系统中已经安装了Anaconda,你也可以使用Anaconda的提示方式。对于普通的Python安装,可以使用默认的命令提示符并编写以下命令来安装TensorFlow:pipinstalltensorflow注意:如果您使用的是macOS系统并出现pip错误,请尝试运行以下pipinstall命令:pipinstalltensorflow-macos现在,我们需要安装一些依赖项,除非您已经在本地安装了它们:dockerrun-p9000:9000-p8812:8812questdb/questdb安装QuestDB要在任何操作系统平台上安装QuestDB,您需要:首先安装Docker。然后,为QuestDB拉取Docker镜像并创建一个Docker容器。为此,打开命令提示符并编写以下命令:dockerrun-p9000:9000-p8812:8812questdb/questdb此处,9000是运行QuestDB的端口,8812是Postgres协议所要求的。然后,通过打开另一个终端并运行以下命令来检查QuestDB是否正在运行:dockerps或者,您可以浏览localhost:9000,QuestDB应该支持通过此本地URL访问。导入依赖项现在依赖项已安装,是时候开始使用TensorFlow和QuestDB实现时间序列预测了。如果你想克隆这个项目并在你自己的Jupyternotebook中继续调试,GitHub项目仓库的链接地址是https://github.com/gouravsinghbais/Time-Series-Forecasting-with-Tensorflow-and-QuestDB。我们通过运行以下命令启动本地jupyter环境:jupyternotebook首先,我们导入以下依赖项:##importdependenciesimportnumpyasnpiimportpandasaspd##deeplearningdependencies'''ifyouareusingapythonversion>3.6你应该直接使用tensorflow而不是keras导入模型依赖例如:fromtensorflow.keras.optimizersimport*'''fromsklearn.preprocessingimportMinMaxScalerfromkeras.modelsimportSequentialfromkeras.layersimport*fromkeras.optimizersimport*##QuestDBDependenciesimportioimportrequestsimporturllib.parseaspar##Timestampdependenciesfromdatetimeimportdatetime##Visualizationdependenciesimportmatplotlib.pyplotasplt%matplotlibinlinereaddataset导入所有计算、深度学习和可视化依赖后,可以继续读取我们之前下载的数据集:#使用pandas库读取数据集df=pd.read_excel('Excelrates.xlsx')##检查th数据集df.head()的前几行是由于read中的数据集是Excel文件,所以必须使用Pandas库提供的read_excel()函数。读取数据集后,您可以在head()函数的帮助下检查它的前几行。您的数据集应该如下所示:创建一个QuestDB表现在,您已经看到了数据集,但是Excel存储大量数据的能力是有限的。所以需要使用QuestDB来存储时序数据。为此,首先确保QuestDBDocker容器正在运行且可访问:##createtablequeryq='''createtableexcel_rates(Datetimestamp,USDint,INRdouble)'''##connecttotheQuestDBURLand执行查询r=requests.get("http://localhost:9000/exec?query="+q)##执行建表查询后打印状态码print(r.status_code)然后,建表在QuestDB与在任何其他数据库(如SQL、Oracle、NoSQL等)中创建表的过程相同。只需提供表名、列名及其各自的数据类型。然后,连接到运行QuestDB的端口(本例中为9000端口),并使用Python的请求模块执行查询。如果查询执行成功,将返回状态码200;如果没有,您将收到状态代码400。将数据插入QuestDB创建表后,您需要将数据存储在其中。使用以下代码来执行此操作:##用于跟踪查询成功执行的变量success=0fail=0##遍历每一行并将其存储在QuestDB表中,对于i,df.iterrows()中的行:date=row['Date']##将日期转换为日期时间格式存储在数据库中date="'"+date.strftime('%Y-%m-%dT%H:%M:%S.%fZ')+"'"usd=row['USD']inr=row['INR']query=f'insertintoexcel_ratesvalues({date},{usd},{inr})'r=requests.get("http://localhost:9000/exec?query="+query)ifr.status_code==200:success+=1else:fail+=1##检查是否执行成功iffail>0:print("RowsFailed:"+str(fail))ifsuccess>0:print("Rowsinserted:"+str(success))要将数据存储到QuestDB表中,需要使用插入查询。如上所示,迭代数据框DataFrame中的每一行,并将Date、USD和INR列插入到数据库中。如果所有行都已成功插入,您将收到代码200;如果其中任何一个失败,您将获得代码400。注意:由于数据类型不匹配,可能会返回错误代码400。对于DateTime,请确保您的日期数据用单引号引起来。从QuestDB中选择数据从数据库中读取数据而不是直接从文件中读取数据的优点之一是我们可以通过运行过滤器或聚合操作轻松地运行查询。在本教程中,我们不会读取整个数据集(超过17000行),而是只选择三年的数据,大约2200行。请注意,您可以自由修改代码的过滤器部分中的代码,以比较我们的模型在使用更大的数据集训练时是否预测得更好。##从QuestDB中选择数据r=requests.get("http://localhost:9000/exp?query=select*fromexcel_rateswhereDatein('2022')orDatein('2021')orDatein('2020')")rawData=r.text##将字节转为CSV格式,使用pandas库读取df=pd.read_csv(io.StringIO(rawData),parse_dates=['Date'])df.columnsHere,in为了从QuestDB中检索数据,您需要使用选择查询。选择查询的输出是表示数据的字节数组。检索到数据后,可以使用pandas库的read_csv()函数读取数据。预处理数据到目前为止,您已经创建了表、向其中插入数据并成功地从中读取数据。现在,是时候进行一些时间序列预测预处理了。首先,您可以继续删除USD列,因为它包含所有值“1”;因此,它不会以任何方式影响预测结果。为此,请使用以下代码:##从数据框中删除USD列df=df.drop('USD',axis=1)##将日期列转换为日期时间格式df['Date']=pd.to_datetime(df["Date"])##Setthedatetotheindexindexed_df=df.set_index(["Date"],drop=True)indexed_df.head()现在,你应该看到一个DataFrame的形式:查看INR值如何随时间变化,可以使用以下代码绘制时间和INR之间的曲线:##Drawingadataframeindexed_df.plot()绘图的结果应该是这样的:时间序列预测是一种监督方法,这意味着它使用输入特征和标签来进行预测。到目前为止,只有日期Date作为索引,INR列作为特征。要创建标签,每个INR值都需要移位1,以便INR成为输入特征,移位后的值成为输出特征/标签。此外,您需要从列中删除NaN值,以使其适合训练。所有这些都可以通过以下代码完成:##将INR垂直(索引)向下移动11)##用0替换所有NaNdata.fillna(0,inplace=True)data.head()完成后,你的数据集应该是这样的:接下来,你需要将数据分成两个不同的类别——训练集andtestset:##Convertdatatonumpyarraydata=np.array(data)##最后500个数据点可以作为测试集train,test=data[0:-500],data[-500:]由于数据的多样性(值在很大范围内变化),需要对数据进行一些缩放或归一化。为此,可以使用MinMaxScaler对象来实现:##缩放scaler=MinMaxScaler()train_scaled=scaler.fit_transform(train)test_scaled=scaler.transform(test)##训练数据集y_train=train_scaled[:,-1]X_train=train_scaled[:,0:-1]X_train=X_train.reshape(len(X_train),1,1)##测试数据集y_test=test_scaled[:,-1]X_test=test_scaled[:,0:-1]创建模型现在预处理已经完成,是时候为时间序列预测训练深度学习(GRU)模型了。使用以下代码执行此操作:##GRU模型model=Sequential()##GRU层model.add(GRU(75,input_shape=(1,1)))##输出层model.add(Dense(1))优化器=Adam(lr=1e-3)model.compile(loss='mean_squared_error',optimizer=optimizer,metrics=['accuracy'])model.fit(X_train,y_train,epochs=100,batch_size=20,shuffle=False)在上面的代码中,模型被定义为序列模型(Sequential)。这意味着您稍后添加的任何层都将连续添加到前一层。然后,定义一个有75个神经元的GRU层,并添加一个密集集(全连接)层作为输出层。因为我们是在创建一个深度学习模型,所以我们还需要添加一个优化器和一个损失函数。在这种情况下,选择Adam算法来优化GRU神经网络。另一方面,由于我们处理的是数值数据,损失函数mean_squared_error处理细节。最后,对输入数据进行模型拟合。执行完上面的代码之后,就会开始模型训练。训练过程是这样的:一旦模型准备好,接下来需要在测试集上进行测试以检查其准确性:##在测试集上进行预测X_test=X_test.reshape(500,1,1)y_pred=model.predict(X_test)##可视化结果plt.plot(y_pred,label='predictions')plt.plot(y_test,label='actual')plt.legend()图形绘制结果显示实际标签和预测labels应该如下所示:可以看到,预测值是实际值的近似值,这表明模型表现得足够好。由于测试数据由很多点表示,所以看起来图中有很多簇。为了更仔细地查看这些值,也可以只可视化100个值来绘制图形:##Visualizetheresultsplt.plot(y_pred[:100],label='predictions')plt.plot(y_test[:100],label='actual')plt.legend()仅显示100个实际值和预测值的简化图如下所示:现在,您的时间序列预测模型已准备就绪,您可以使用它来制作对即将到来的日期的预测。完整的项目源代码可以在链接中找到(https://github.com/gouravsinghbais/Time-Series-Forecasting-with-Tensorflow-and-QuestDB)。结论在本教程中,我们介绍了如何使用深度学习框架TensorFlow和时间序列数据库QuestDB进行时间序列预测。随着越来越多的电子和机械设备变得智能化,手动操作正逐渐成为历史。为了以自动化方式有效地维护这些机器,您需要合适的工具来存储和处理机器生成的数据。综上所述,传统数据库在面对时间序列预测问题时并不是一个很好的解决方案,因为它们更侧重于在事务中处理和写入数据。相比之下,时间序列数据库专门用于存储不同时间间隔的观测值,因此更适合该领域。正如您在本教程中看到的,时间序列数据库还提供其他功能和相关工具来帮助处理时间序列。译者介绍朱宪忠,社区编辑,专家博主,讲师,潍坊某高校计算机教师,自由编程资深人士。早期专注于各种微软技术(编译成三本与ASP.NETAJX和Cocos2d-X相关的技术书籍)。/ESP32/RaspberryPi等物联网开发技术和Scala+Hadoop+Spark+Flink等大数据开发技术。原标题:Time-seriesForecastingWithTensorFlowandQuestDB,作者:GouravBais