表征股票市场神经网络的 Keras 损失和准确性

Characterising Keras Loss And Accuracy For Stock Market Neural Network

我最近尝试完成一个神经网络来预测股票市场上个股价格的波动,利用 Keras 作为网络框架和 Quandl 来检索历史调整后的股票价格;在 运行 这个程序中,我主要使用了单个教程中显示的程序范例和信息,link 如下所示:

https://www.youtube.com/watch?v=EYnC4ACIt2g&t=2079s

但是,教程使用了 "sklearn" 线性回归模块;我修改了程序以使用 Keras,它具有更强的定制能力。程序显示如下:

import tensorflow as tf
import keras
import numpy as np
import quandl
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

df = quandl.get("WIKI/FB")
df = df[['Adj. Close']]
forecast_out = 1
df['Prediction'] = df[['Adj. Close']].shift(-(forecast_out))

X = np.array(df.drop(['Prediction'], 1))
X = X[:-forecast_out]

y = np.array(df['Prediction'])
y = y[:-forecast_out]
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = 0.2) 

model = keras.models.Sequential()
model.add(keras.layers.Dense(units = 64, activation = 'relu'))
model.add(keras.layers.Dense(units = 1, activation = 'linear'))

model.compile(loss='mean_absolute_error',
              optimizer='adam',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5, batch_size=32, validation_split = 0.2)

x_forecast = np.array(df.drop(['Prediction'], 1))[-forecast_out:]
print(x_forecast)

prediction = model.predict(x_train)

然而,在 运行 通过 model.fit() 命令提供测试信息的模型上,我收到了每个时期的损失和准确性的显示:

Train on 940 samples, validate on 236 samples
Epoch 1/5
940/940 [==============================] - 1s 831us/step - loss: 85.4464 - acc: 0.0000e+00 - val_loss: 76.7483 - val_acc: 0.0000e+00
Epoch 2/5
940/940 [==============================] - 0s 51us/step - loss: 65.6871 - acc: 0.0000e+00 - val_loss: 55.4325 - val_acc: 0.0000e+00
Epoch 3/5
940/940 [==============================] - 0s 52us/step - loss: 43.3484 - acc: 0.0000e+00 - val_loss: 30.5538 - val_acc: 0.0000e+00
Epoch 4/5
940/940 [==============================] - 0s 47us/step - loss: 16.5076 - acc: 0.0011 - val_loss: 1.3096 - val_acc: 0.0042
Epoch 5/5
940/940 [==============================] - 0s 47us/step - loss: 2.0529 - acc: 0.0043 - val_loss: 1.1567 - val_acc: 0.0000e+00
<keras.callbacks.History at 0x7ff1dfa19470>

鉴于我在测试此类范例方面的经验相对较少,我更想知道这种准确性是否令人满意;损失和精度参数是否表明模型 运行 完美?它们之间的区别是什么?如何阅读它们?最后,Keras 如何描述它们?该模块的文档似乎没有提供足够数量的信息;但是,这可能是我对它们的检查造成的。感谢您的协助。

您可能会在 CrossValidated 上获得有关神经 networks/ML 的更好答案,但我可以在这里尽力帮助您。

一般来说,很难判断一个神经网络是否 运行 "properly" — 因此根据我的经验,ML 开发是一个非常反复的过程,由受过教育的人提供试错信息statistical/mathematical 猜测。

让我们先对这些指标做一个高级概述:

Loss = how far "off" the model's prediction is from your data.

Accuracy = % of predictions that your model got "right"; i.e. if your model is a function, model(x) = y for a particular data point.

令人满意 "accuracy" 是主观的,广泛取决于 application/model/your 数据。但是,由于您正在尝试预测股票价格;即一个连续变量,你正在做回归, 使用像准确性这样的指标对我来说没有多大意义。我可以通过您的问题公式告诉您正在做回归——线性激活也是一个强烈的暗示。

要了解为什么准确性没有意义,如果我根据某些因素预测房价,我可能不在乎有多少预测是完全正确的,但更关心我的预测总体上有多接近.如果我的回归模型在每个房价上减 1 美元,我的准确度仍然为 0,但我可能仍然有一个好的模型。

相反,最小化损失函数可能是更好的思考方式。这样想:总的来说,您希望将 "close" 的输入变量的某些函数拟合到真实输出。对于linear regression,损失函数是LMS(Least Mean Squares),本质上是残差的平均平方距离。这里你使用平均绝对误差,它只是差异的平均绝对值。两种损失函数都有利有弊,我鼓励您针对您的应用研究这一点。

您的错误正在减少这一事实是好的:这意味着您的模型逼近的函数越来越接近训练数据(残差正在减少)。您的验证损失也不大于训练数据,这表明您也没有过度拟合您的数据。我鼓励您继续尝试。