我正在尝试使用简单的时间序列预测。给定数量的输入(1 分钟滴答) Net 应该尝试预测下一个。我用不同的设置训练了 3 个网络来说明我的问题:
在右侧,您可以看到 3 个训练器 MLP - 随机命名和颜色编码,以及一些训练数据。在左侧 - 由这些网络做出的预测图和白色的实际验证数据。该图是通过遍历验证数据的每个刻度(白色),将 30|4|60 (Nancy|Kathy|Wayne) 之前的刻度输入网络并绘制它将在当前刻度位置预测的内容绘制的。
多层感知器的设置(Nancy|Kathy|Wayne 设置):
几何:2x30|4|60 个输入节点 -> 30|4|60 个隐藏层节点 -> 2 个输出
时代数:10|5|10
学习率:0.01
动量:0.5|0.9|0.5
非线性:纠正
损失:平方误差
似乎随着更多的训练应用 - 预测会收敛到某种平均线,这根本不是我所期望的。我期待预测与验证数据有点接近,但有一定的误差。
我是否选择了错误的模型、误解了机器学习的一些核心概念或在烤宽面条/theano 中做错了什么?
最相关(在我看来)代码部分的快速链接:
这里或多或少是完整的来源:
最佳答案
首先,我要赞扬您使用非线性整流。根据玻尔兹曼机的发明者 Geoffrey Hinton 所相信的,非线性整流器是人类大脑事件的最佳支撑。
但是对于您选择的其他部分,我建议您更改 NN 架构。对于股票市场的预测,您应该使用一些循环神经网络:最简单的候选者可能是 Elman 或 Jordan 网络。或者你可以尝试更复杂的,比如 LSTM 网络。
另一部分建议,我建议修改您在 NN 中提供的内容。一般来说,我建议您应用缩放和标准化。例如,不要输入 NN 原始价格。以下列方式之一修改它(这些建议不是一成不变的):
1. 输入价格变化的 NN 百分比。
2. 如果您输入 NN 30 个值,并且想要预测两个值,则从 30 + 2 个值中减去所有 32 个值的最小值,并尝试预测 2 个值,但基于 30。然后只需添加到结果的最小值32 个值。
不要在 NN 中只提供日期。它对 NN 没有任何关于进行预测的说明。而是输入 NN 日期和时间作为分类值。分类意味着您在多个条目中转换日期时间。例如,您可以考虑以下一些内容,而不是给 NN 2016/09/10。
根据您在有关如何使用最小值的评论中提出的问题,我将为您提供简化示例。
假设您想在欧元/美元收盘价后用于训练神经网络:
1.1122、1.1132、1.1152、1.1156、1.1166、1.1173、1.1153、1.1150、1.1152、1.1159。
我将使用窗口大小 3(只是为了简单起见)和预测窗口大小 2 来演示学习,而不是用于学习 30 的窗口大小。
用于预测的总数据等于 3。输出将为 2。对于学习,我们将使用前 5 个值,或者:
1.1122、1.1132、1.1152、1.1156、1.1166
然后是另外 5 个值或:
1.1132、1.1152、1.1156、1.1166、1.1173
在第一个窗口中的最小值是:1.1122。
然后从每个值中减去 1.1122:
0、0.002、0.003、0.0033、0.0034。作为输入,您输入 NN 0、0.002、0.003。作为 NN 的输出,您期望 0.0033、0.0034。如果您想让它学习得更快,请输入 NN 标准化和缩放值。然后每次您都需要对输入进行去规范化和去缩放。
另一种方式,输入价格变化的 NN 百分比。如果您需要 sample ,请告诉我。
还有一条更重要的建议。不要只使用 NN 进行交易。绝不!!!更好的方法是发明一些具有一定成功率的系统。例如 30%。然后使用 NN 将成功率提高到 60%。
我还想为您提供一些指标的温度计编码示例。考虑 ADX 指标和以下示例:
a.>10 >20 >30 >40
1 0 0 0
湾>10 >20 >30 >40
1 1 0 0
示例 a 在 ADX 大于 10 的 NN 中提供输入。
示例 b 提供了 ADX 大于 20 的 NN 中的输入。
您可以修改温度计编码以提供随机输入。通常,随机在 0 - 20 和 80 - 100 的范围内具有意义,在极少数情况下在 20 - 80 的范围内具有意义。但与往常一样,您可以尝试看看。
关于python - 简单的 MLP 时间序列训练产生意想不到的平均线结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39896985/