Характеристика потерь и точности Keras для нейронной сети фондового рынка

Недавно я попытался завершить нейронную сеть для прогнозирования колебаний цен отдельных акций на фондовом рынке, используя Keras в качестве основы для сети и Quandl для получения исторических скорректированных цен акций; при запуске этой программы я в основном использовал парадигму программы и информацию, отображаемую в отдельном руководстве, ссылка на которое отображается ниже:

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>

Учитывая мой относительно небольшой опыт проверки таких парадигм, я бы предпочел знать, удовлетворительна ли эта точность или нет; указывают ли параметры потерь и точности на то, что модель работает идеально? В чем разница между ними и как их можно прочитать? Наконец, как их характеризует Керас? Документация по модулю не содержала достаточного количества информации; однако, возможно, виноват мой осмотр их. Спасибо за помощь.


person Suren Grig    schedule 04.01.2020    source источник
comment
Я голосую за то, чтобы закрыть это, поскольку это явно вопрос статистики/машинного обучения, а не программирования, и код работает без каких-либо ошибок или проблем.   -  person AMC    schedule 05.01.2020


Ответы (1)


Вы можете получить более подробные ответы о нейронных сетях/ML на CrossValidated, но я могу попытаться помочь вам здесь.

В общем, очень и очень трудно сказать, работает ли нейронная сеть «правильно» — поэтому, по моему опыту, разработка машинного обучения — это очень итеративный процесс с пробами и ошибками, основанный на обоснованных статистических/математических предположениях.

Давайте сначала сделаем общий обзор метрик:

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.

Удовлетворительная «точность» субъективна и сильно зависит от приложения/модели/ваших данных. Однако, поскольку вы пытаетесь предсказать цену акций; т. е. непрерывная переменная, вы выполняете регрессию, для меня не имеет особого смысла использовать такой показатель, как точность. Я могу сказать, что вы выполняете регрессию как по формулировке проблемы, так и по линейной активации.

Чтобы понять, почему точность не имеет смысла, если я предсказываю цену дома на основе определенных факторов, меня, вероятно, не волнует, сколько предсказаний я получил точно, а то, насколько близки были мои прогнозы в целом. Если моя регрессионная модель со скидкой 1 доллар на каждую цену дома, у меня по-прежнему будет точность 0, но потенциально у меня все еще может быть хорошая модель.

Вместо этого минимизация функции потерь, вероятно, является лучшим способом думать о вещах. Подумайте об этом так: в целом вы хотите подобрать некоторую функцию ваших входных переменных, которая «близка» к истинному выходу. Для линейной регрессии функцией потерь является LMS (наименьшие средние квадраты), которая по существу средний квадрат расстояния остатков. Здесь вы используете среднюю абсолютную ошибку, которая представляет собой просто среднее абсолютное значение разницы. Обе функции потерь имеют свои плюсы и минусы, и я рекомендую вам изучить это для вашего приложения.

Тот факт, что ваша ошибка уменьшается, это хорошо: это означает, что функция, которую аппроксимирует ваша модель, все ближе и ближе к обучающим данным (остатки уменьшаются). Ваши потери при проверке также не превышают данные обучения, что демонстрирует, что вы также не переоснащаете свои данные. Я бы посоветовал вам просто продолжать экспериментировать.

person tchainzzz    schedule 04.01.2020