0 шт.
Выбрать страницу

Как решить задачу регрессии с помощью глубокого обучения?

Задачи регрессии

Регрессия - это когда вы прогнозируете непрерывные данные. Классификация прогнозирует дискретные данные(классы). Мы будем исходя из данных бухгалтерского учета прогнозировать капитализацию компании. То есть мы научимся вычисляться стоимость так, как это делают участники рынка в настоящий момент.

Этот ноутбук и датасеты доступны в моем Github репозитории:

git clone https://github.com/andreiliphd/reinforcement-content.git

Если нет Git, то его нужно установить.

Linux:

sudo apt-get update
sudo apt-get install git

Windows: скачайте Git с сайта git-scm.com.

Если вы нашли ошибку на сайте, ее можно исправить самостоятельно сделав Pull Request в Git.

Этапы решения задачи

  1. Загрузка и аугментация данных.
  2. Декларирование модели.
  3. Инстанциирование модели.
  4. Инстанциирование функции потерь(лосс).
  5. Инстанциирование оптимизатора.
  6. Создание тренировочной петли(лупа).

Загрузка и аугментация данных

Сначала импортируем необходимые библиотеки.

In [4]:
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
import torch

Загружаем данные в pandas. pandas - это Excel для Python.

In [ ]:
data = pd.read_csv('datasets/csv/equities.csv')

Нейронные сети не могут работать с отсутствующими или другими словами NA данными. Есть несколько механизмов по очистке данных от NA и один из них - это заполнить отсутствующие данные нулями, что мы и сделаем.

In [5]:
data = data.fillna(0)

Удалим столбцы, которые нам не нужны в входных данных. Нам не нужные index(индекс) и name (название компании).

In [6]:
data_np = np.array(data.drop(['index', 'name'], axis = 1))

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

In [ ]:
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data_np)

Выделим входные данные и метки. x - это входные данные, то есть столбцы с финансовыми показателями. y - это метки, то есть столбцы с капитализацией.

In [ ]:
y = data_scaled[:, 28]
x = data_scaled[:, :28]

Разобьем датасет на тренировочный и тестовый. Это делается с целью дальнейшей проверки результатов прогноза.

In [ ]:
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=42, shuffle=False)

Конвертируем данные в torch.tensor.

In [ ]:
X_train_torch = torch.from_numpy(X_train).float()
X_test_torch = torch.from_numpy(X_test).float()
y_train_torch = torch.from_numpy(y_train).float()
y_test_torch = torch.from_numpy(y_test).float()

Инстанциирование модели

torch.nn.Sequential - это стиль Keras создания модели. PyTorch поддерживает такую декларацию модели. Мы просто делаем линейные слои torch.nn.Linear(wx+b) и torch.nn.ReLu.

In [7]:
model = torch.nn.Sequential(
        torch.nn.Linear(28, 100),
        torch.nn.ReLU(),
        torch.nn.Linear(100, 200),
        torch.nn.ReLU(),
        torch.nn.Linear(200,100),
        torch.nn.ReLU(),
        torch.nn.Linear(100, 50),
        torch.nn.ReLU(),
        torch.nn.Linear(50, 1)
        )

Если есть видеокарта, то переносим данные на видеокарту для ускорения работы.

In [19]:
if torch.cuda.is_available():
    model = model.cuda()
    X_train_torch, y_train_torch = X_train_torch.cuda(), y_train_torch.cuda()

Инстанциирование функции потерь(лосс)

Обратите внимание мы используем torch.nn.MSELoss, который как раз пригоден для задач регрессии.

In [20]:
criterion = torch.nn.MSELoss(reduction='sum')

Инстанциирование оптимизатора

torch.optim.Adam - универсальный оптимизатор, который подходит как для задач регрессии, так и для задач классификации.

In [21]:
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)

Создание тренировочной петли(лупа)

In [22]:
for epoch in range(10):
    output = model(X_train_torch)
    loss = criterion(output, torch.reshape(y_train_torch, (15,1)))
    print('Epoch: ', epoch, 'Loss: ', loss.item())
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
Epoch:  0 Loss:  3.328333616256714
Epoch:  1 Loss:  3.3107597827911377
Epoch:  2 Loss:  3.293428421020508
Epoch:  3 Loss:  3.276254415512085
Epoch:  4 Loss:  3.259106159210205
Epoch:  5 Loss:  3.242385149002075
Epoch:  6 Loss:  3.225233554840088
Epoch:  7 Loss:  3.2082576751708984
Epoch:  8 Loss:  3.191269636154175
Epoch:  9 Loss:  3.174126148223877

Обучение

Решение регрессионной задачи - это достаточно простая проблема, но регрессии в глубоком обучении применяется во множестве отраслей достаточно широко. Везде, где есть непрерывные данные вы можете применять регрессию. Одна из задач, которую я помогал решать с помощью регрессии - это прогнозирование отказа двигателей на производстве. Мое предложение было попробовать использовать Google Bert, который применяется для NLP, но может быть полезен для установления сложных связей между данными. Я расскажу вам удалось ли воплотить это в жизнь в моем блоге.

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

In [ ]: