Моя нейронная сеть возвращает только 0, 1 или другое постоянное значение - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь создать сеть, которая поможет прогнозировать цены на акции на следующий день. Мои входные данные: открытые, максимальные, минимальные и закрытые фондовые значения, объем, значения индексов, несколько технических индикаторов и обменный курс; выходной цена закрытия со следующего дня. Я использую данные, загруженные из файла Excel. Я написал программу, которую я вставлю ниже, но, похоже, она работает неправильно. Сеть всегда возвращает 1, 0 или другое постоянное значение (от 0 до 1). Пока я предпринял следующие шаги:

  • попытался нормализовать данные следующим образом: X_norm = X/(10 ** d), где d - наименьшее число, для которого выполняется это условие: abs(X_norm) < 1. Я сделал это для всего набора в Excel, прежде чем разделить его на обучение и тестирование.

  • перетасовал данные перед тем, как разделить их на обучение / тестирование, чтобы примеры обучения не приходились на последовательные дни

  • запуск сети на меньшем наборе данных и на примере набора данных (я сгенерировал случайные числа и выполнил простую математику, используя их для вывода, и попытался запустить сеть с этим)

  • изменение количества скрытых нейронов

  • изменение количества итераций (до 1000, что было много для моего компьютера, учитывая набор данных, поэтому я больше не пытался, потому что это заняло бы слишком много времени)

  • изменение скорости обучения.

Независимо от того, какие шаги я предпринял, результат всегда был одинаков Я думаю, что моя проблема может заключаться в том, что у меня нет предвзятости, но, возможно, у меня также есть другие ошибки в моем коде, которые способствуют этой ошибке.

Моя программа:

import numpy as np
import pandas as pd

df = pd.read_excel(r"path", sheet_name="DATA", index_col=0, header=0)

df = df.to_numpy()
np.random.shuffle(df)

X_data = df[:, 0:15]
X_data = X_data.reshape(1000, 1, 15)
print(f"X_data: {X_data}")

Y_data = df[:, 15]
Y_data = Y_data.reshape(1000, 1, 1)
print(f"Y_data: {Y_data}")

X = X_data[0:801]
x_test = X_data[801:]

y = Y_data[0:801]
y_test = Y_data[801:]

print(f"X_train: {X}")
print(f"x_test: {x_test}")
print(f"Y_train: {y}")
print(f"y_test: {y_test}")

rate = 0.2


class NeuralNetwork:
    def __init__(self):
        self.input_neurons = 15
        self.hidden1_neurons = 10
        self.hidden2_neurons = 5
        self.output_neuron = 1
        self.input_to_hidden1_w = (np.random.random((self.input_neurons, self.hidden1_neurons)))        # 14x30
        self.hidden1_to_hidden2_w = (np.random.random((self.hidden1_neurons, self.hidden2_neurons)))    # 30x20
        self.hidden2_to_output_w = (np.random.random((self.hidden2_neurons, self.output_neuron)))       # 20x1

    def activation(self, x):
        sigmoid = 1/(1+np.exp(-x))
        return sigmoid

    def activation_d(self, x):
        derivative = x * (1 - x)
        return derivative

    def feed_forward(self, X):
        self.z1 = np.dot(X, self.input_to_hidden1_w)
        self.z1_a = self.activation(self.z1)

        self.z2 = np.dot(self.z1_a, self.hidden1_to_hidden2_w)
        self.z2_a = self.activation(self.z2)

        self.z3 = np.dot(self.z2_a, self.hidden2_to_output_w)
        output = self.activation(self.z3)
        return output

    def backward(self, X, y, rate, output):
        error = y - output
        z3_error_delta = error * self.activation_d(output)

        z2_error = np.dot(z3_error_delta, np.transpose(self.hidden2_to_output_w))
        z2_error_delta = z2_error * self.activation_d(self.z2)

        z1_error = np.dot(z2_error_delta, np.transpose(self.hidden1_to_hidden2_w))
        z1_error_delta = z1_error * self.activation_d(self.z1)

        self.input_to_hidden1_w += rate * np.dot(np.transpose(X), z1_error_delta)
        self.hidden1_to_hidden2_w += rate * np.dot(np.transpose(self.z1), z2_error_delta)
        self.hidden2_to_output_w += rate * np.dot(np.transpose(self.z2), z3_error_delta)

    def train(self, X, y):
        output = self.feed_forward(X)
        self.backward(X, y, rate, output)

    def save_weights(self):
        np.savetxt("w1.txt", self.input_to_hidden1_w, fmt="%s")
        np.savetxt("w2.txt", self.hidden1_to_hidden2_w, fmt="%s")
        np.savetxt("w3.txt", self.hidden2_to_output_w, fmt="%s")

    def check(self, x_test, y_test):
        self.feed_forward(x_test)
        np.mean(np.square((y_test - self.feed_forward(x_test))))


Net = NeuralNetwork()

for l in range(100):
    for i, pattern in enumerate(X):
        for j, outcome in enumerate(y):
            print(f"#: {l}")
            print(f'''
            # {str(l)}
            # {str(X[i])}
            # {str(y[j])}''')
            print(f"Predicted output: {Net.feed_forward(X[i])}")
            Net.train(X[i], y[j])
print(f"Error training: {(np.mean(np.square(y - Net.feed_forward(X))))}")

Net.save_weights()

for i, pattern in enumerate(x_test):
    for j, outcome in enumerate(y_test):
        Net.check(x_test[i], y_test[j])
print(f"Error test: {(np.mean(np.square(y_test - Net.feed_forward(x_test))))}")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...