我最近尝试完成一个神经网络,用于预测股票市场中个股价格的波动,利用Keras作为网络的框架,并使用Quandl获取历史调整后的股票价格;在运行这个程序时,我主要使用了一个单一教程中显示的程序范式和信息,相关的链接如下所示:
https://www.youtube.com/watch?v=EYnC4ACIt2g&t=2079s
然而,该教程使用了“sklearn”的线性回归模块;我修改了程序以使用Keras,因为它具有更高的定制能力。程序如下所示:
import tensorflow as tfimport kerasimport numpy as npimport quandlfrom sklearn.model_selection import train_test_splitimport matplotlib.pyplot as pltdf = quandl.get("WIKI/FB")df = df[['Adj. Close']]forecast_out = 1df['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()命令运行模型并提供测试信息后,我收到了每个epoch的损失和准确性的显示如下:
Train on 940 samples, validate on 236 samplesEpoch 1/5940/940 [==============================] - 1s 831us/step - loss: 85.4464 - acc: 0.0000e+00 - val_loss: 76.7483 - val_acc: 0.0000e+00Epoch 2/5940/940 [==============================] - 0s 51us/step - loss: 65.6871 - acc: 0.0000e+00 - val_loss: 55.4325 - val_acc: 0.0000e+00Epoch 3/5940/940 [==============================] - 0s 52us/step - loss: 43.3484 - acc: 0.0000e+00 - val_loss: 30.5538 - val_acc: 0.0000e+00Epoch 4/5940/940 [==============================] - 0s 47us/step - loss: 16.5076 - acc: 0.0011 - val_loss: 1.3096 - val_acc: 0.0042Epoch 5/5940/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上获得更好的答案,但我也可以在这里尝试帮助你。
一般来说,判断一个神经网络是否运行“正确”非常困难——因此,在我的经验中,机器学习的开发是一个非常迭代的过程,通过试错和基于统计/数学知识的猜测来进行改进。
让我们先对这些指标进行一个高层次的概述:
损失 = 模型预测与您的实际数据之间的“偏差”大小。
准确性 = 模型“正确”预测的百分比;即如果您的模型是一个函数,model(x) = y对于特定的数据点。
满意的“准确性”是主观的,并且在很大程度上取决于应用/模型/您的数据。然而,由于您尝试预测的是股票价格,即一个连续变量,您在做回归,使用像准确性这样的指标对我来说没有多大意义。我可以通过您的问题表述以及线性激活函数的强烈暗示来判断您在做回归。
为了解释为什么准确性不合适,如果我根据某些因素预测房价,我可能不关心我有多少预测是完全正确的,而是更关心我的整体预测有多接近。如果我的回归模型在每个房价上都偏差1美元,我仍然有0的准确性,但我可能仍然有一个好的模型。
相反,考虑最小化损失函数可能是更好的方法。这样想:总的来说,您希望拟合一个输入变量的函数,这个函数“接近”真实的输出。对于线性回归,损失函数是LMS(最小均方),它本质上是残差的平均平方距离。这里您使用的是平均绝对误差,它只是差异的平均绝对值。这两种损失函数各有优缺点,我鼓励您根据您的应用进行研究。
您的错误在减少是好的:这意味着您的模型近似的函数越来越接近训练数据(残差在减少)。您的验证损失也不大于训练数据,这表明您没有在数据上过拟合。我鼓励您继续实验。