65.9K
CodeProject 正在变化。 阅读更多。
Home

比特币时间序列数据上的 AI 预测

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (4投票s)

2021年3月1日

CPOL

4分钟阅读

viewsIcon

9276

downloadIcon

198

在下一篇文章中,我们将讨论比特币时间序列的预测。

引言

本系列文章将指导您完成开发一个功能齐全的 AI 时间序列预测器和异常检测器应用程序所需的步骤。我们的预测器/检测器将处理加密货币数据,特别是比特币。但是,在跟随本系列学习之后,您将能够将您学到的概念和方法应用于任何类似性质的数据类型。

要充分利用本系列,您应该具备一些 Python、机器学习和 Keras 技能。整个项目都可以在我的 "GitHub 仓库中找到。您还可以查看完全交互式的 Notebook 这里这里

前一篇文章中,我们讨论了时间序列数据的异常检测 - 现在我们能够检测过去观测中的异常。但是,如果我们想在预测中检测它们呢?如果我们想确定明天的比特币价格是否会出现异常呢?

明天的比特币价格——以及任何其他时间序列性质的未来数据——可以使用预测来预测。这种方法涉及在历史数据上拟合机器学习 (ML) 模型,并使用它们来预测尚未提供的未来值。

在这个项目中,我们将使用以 24 小时序列(24 个按时间顺序排列的价格)重组的历史比特币价格来预测下一小时的价格。为了获得这样的数据集形状,我们已经定义了 shift_samples 函数 - 请参阅上一篇文章

在本文中,我们将使用 LSTM NN 作为回归器,而无需自动编码器架构。我们还将比较我们的 LSTM 与 卷积神经网络, 详见项目 Notebook(完全交互式的那个,可在 此处 获得)。尽管 ConvNets 超出了本系列的范围,但如果 LSTM 在您的场景中效果不佳,它们将来可能会对您有所帮助。

创建 LSTM NN 回归器

让我们通过发布来创建 LSTM NN 回归器

regressor = Sequential()regressor.add(layers.LSTM(256, activation='relu', return_sequences=True, input_shape=(tsteps, nfeatures),dropout=0.2))regressor.add(layers.LSTM(256, activation='relu',dropout=0.2))regressor.add(layers.Dense(1))
regressor.compile(loss='mse', optimizer='adam')

一方面,我们使用 MSE 作为损失函数,因为我们试图构建一个回归器而不是分类器。另一方面,我们模型的最后一层没有任何激活函数。我只设置了一个神经元,因为我们的数据集中只有一个特征,但我们也试图获得给定序列中的下一个值。如果您想获得更多值,我建议您查看这个 Notebook,我在其中将相同的方法应用于天气数据和其他一些变体。使用下表查看要使用哪些激活和损失函数,具体取决于您尝试完成的任务

训练模型

要训练模型,请执行以下命令

from tensorflow.keras.callbacks import ModelCheckpoint
checkpoint = ModelCheckpoint("/kaggle/working/regressor.hdf5", monitor='val_loss', verbose=1,save_best_only=True, mode='auto', period=1)
history2 = regressor.fit(X_train,y_train,epochs=30,batch_size=128,verbose=1,validation_data=(X_test, y_test),callbacks=[checkpoint],shuffle=False)

在该过程结束时,您应该获得类似于以下的结果

Epoch 30/30
175/175 [==============================] - ETA: 0s - loss: 3.6093e-04
Epoch 00030: val_loss did not improve from 0.00024
175/175 [==============================] - 15s 87ms/step - loss: 3.6093e-04 - val_loss: 0.0023

测试模型

我们一直在使用 keras 中的 ModelCheckpoint 方法来保存训练期间获得的最佳模型。让我们从现在开始使用它,并在测试集上评估它

regressor = load_model("regressor.hdf5")
regressor.evaluate(X_test, y_test)
174/174 [==============================] - 1s 6ms/step - loss: 2.3974e-04
0.0002397427597315982

不错!在评估回归器时,输出越小,误差越小。误差越小,我们的模型越好。在这种情况下,我们获得了非常接近于零的数字,因此我们相当简单的模型架构足以获得良好的结果。但是,您可能会面临需要设计更复杂的模型或花费数小时进行超参数调整的情况,这完全没问题。这一步与其说是“冲刺”过程,不如说更像是一个反复试验的过程。

让我们看看实际的预测是什么样的。为此,让我们取 X_test 数据集的前 24 小时,并调用我们的回归器来预测下一小时的值

test = regressor.predict(X_test[0].reshape(1,24,1))

前一篇文章中,我们将所有数据缩放到小值,以确保我们的模型可以收敛。现在我们将使用相同的缩放器,但这次是为了获得模型输出的反向变换并获得实际值。让我们看看这个值是什么,并了解输出形状是什么

scaler.inverse_transform(test)
array([[6507.955]], dtype=float32)

好的!现在我们知道我们的模型正在输出正确的数据形状,并且它已启动并运行,准备好预测最近的数据以获得未来的数据点。

下一步

下一篇文章中,我们将结合预测和检测对比特币价格数据的直播流。敬请期待!

© . All rights reserved.