【问题标题】:Recurrent nerural network predicting the same answer预测相同答案的递归神经网络
【发布时间】:2020-07-20 13:14:31
【问题描述】:

我试图预测第二天股价会上涨还是下跌。我正在使用具有 43 列的 pandas DataFrame,其中一列是 y 值,y 值是 0 到 1 之间的浮点数,我的 DataFrame 也有 5016 行以数字为索引。我用一些 LSTM 单元制作了一个模型,其中一些 Dense 单元的损失函数为 biary_crossentropy,但是当我运行模型并尝试打印预测时,所有预测都是相同的:

[[0.56393844]

[0.56393844]

[0.56393844]

...

[0.56393844]

[0.56393844]

[0.56393844]]

y 值并不完全相同。 Y 值:

0

1

0

1

1

损失和准确率也开始相同:

7/10 纪元

4012/4012 [==============================] - 20 秒 5 毫秒/样本 - 损失:0.7052 - 加速度: 0.5015 - val_loss:

0.6884 - val_acc: 0.5488

8/10 纪元

4012/4012 [==============================] - 19 秒 5 毫秒/样本 - 损失:0.7054 - 加速度: 0.4980 - val_loss:

0.6907 - val_acc:0.5488

9/10 纪元

4012/4012 [==============================] - 18 秒 5 毫秒/样本 - 损失:0.7078 - 加速度: 0.4890 - val_loss:

0.6894 - val_acc: 0.5488

我的代码如下所示:

df = pd.read_csv("^AEX.csv")
df.index = pd.to_numeric(df.index, errors = 'coerce')
df = df.drop(['date'], axis = 1)
print(df.shape)
x = df.loc[:, df.columns != 'result']
y = df.loc[:, df.columns == 'result']

y = y.astype(int)

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, shuffle = False)
x_train = x_train.values.reshape(x_train.shape[0], 1, x_train.shape[1])
x_test = x_test.values.reshape(x_test.shape[0], 1, x_test.shape[1])

model = Sequential()

model.add(LSTM(42, input_shape = (1, 42), activation = 'relu', return_sequences = True))
model.add(Dropout(0.2))

model.add(LSTM(42, activation = 'relu'))
model.add(Dropout(0.2))

model.add(Dense(32, activation = 'relu'))
model.add(Dropout(0.2))

model.add(Dense(1, activation = 'sigmoid'))

opt = tf.keras.optimizers.Adam(lr = 0.1, decay=1e-7)

model.compile(loss = 'binary_crossentropy', optimizer = opt, metrics = ['accuracy'])

model.fit(x_train, y_train, epochs = 10, batch_size = 1, validation_data = (x_test, y_test))

prediction = model.predict(x_test)
print(prediction)
print(x_test)
print(y_test)

我对神经网络了解不多,所以不知道哪些层最有效,也不知道应该做多少层。如果有人知道我该如何解决这个问题,以便我的神经网络真正学习,请告诉我。我知道如何使我的网络更高效或更好,也请告诉我。提前致谢。

【问题讨论】:

    标签: python pandas tensorflow keras lstm


    【解决方案1】:

    由于您使用“binary_crossentropy”,这意味着您的答案将被四舍五入为 0 或 1。很可能,您的 LSTM 发现如果它一直预测 1,它将获得 50% 以上的总分,这更好超过 50/50 的猜测。这是 ML 中二进制问题中非常常见的问题。您得到 0.56 的原因是因为您使用“准确度”作为正确/所有猜测的指标,如果您每次都预测全部为 1,您将获得相同的准确度。

    问题在于您的模型,它可能太简单、太复杂或调整值错误。尝试删除一个 LSTM 层,试验它们的节点大小等,直到你得到一个不一致的答案。

    【讨论】:

    • 当我删除我的 LSTM 层时,它仍然给我相同的答案,即使我做了一些非常奇怪的架构,无论我做什么它最终都会变得完全一样。你能给我一些我应该做什么的例子吗?比如添加层,改变超参数等等。
    • 学习率好像很高,尽量降低。尝试有/没有 dropout,非常高/低的节点数等。由于您正在预测股票,这是一项非常艰巨的任务,尤其是在数据如此之少的情况下,很难找到模式,因此如果总是预测将是有意义的最常见的 y 将是 ML:s 的最佳猜测。我可能会尝试增加节点大小以尝试找到更多抽象模式,但很可能会得到相同的结果。
    • 谢谢,但请告诉我您所说的节点大小是什么意思,如果您认为更改模型、指标、优化器、损失、时期、batch_size 也会有所帮助。
    • 您需要对 ML 中的工作原理有很好的直觉才能知道针对您的特定问题调整什么,我建议从更简单的问题开始,您可以在进入金融之前实际可靠地预测某些事情。由于股票已经由极其聪明的 ML 算法确定,因此您的简单 LSTM 将无法找到那些很难找到的模式,尤其是在没有适当的预处理和特征工程的情况下。我没有预测财务,我不知道你的训练数据集,因此我不能更具体地调整什么:)
    • 我的数据集结合了 42 个不同时期最常用的技术指标,我想使用 LSTM,因为 LSTM 应该知道要使用哪些信息,忘记哪些信息等。另外,如果您知道我可以让模型获取过去 N 天的数据,而只针对一天。
    猜你喜欢
    • 2015-07-05
    • 2021-01-07
    • 2017-09-01
    • 2013-12-08
    • 2015-04-15
    • 1970-01-01
    • 2016-12-20
    • 2017-12-02
    • 2016-11-28
    相关资源
    最近更新 更多