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

Сегодня основная библиотека, которую мы будем использовать, называется MLPClassifer. Эта библиотека НЕ ​​имеет обратного распространения, поэтому ее следует использовать для небольших или средних наборов данных с двоичными выходами или несколькими выходными узлами. Мы также будем реализовывать больше библиотек в качестве вспомогательных инструментов.

Вместо того, чтобы реализовывать все библиотеки в заголовке, в этом посте я буду импортировать их по мере их появления.

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

import seaborn as sns
#import data
data = sns.load_dataset('exercise')
data.head()

Глядя на данные, мы, очевидно, видим, что столбцы «вид» и «диета» не являются целыми значениями, что делает обучение модели практически невозможным.

Вот тут-то и пригодится LabelEncoder ()!

from sklearn.preprocessing import LabelEncoder
#one hot encoded the string columns
for label in ['diet', 'kind']:
  data[label] = LabelEncoder().fit_transform(data[label])

Здесь мы преобразуем эти строковые значения из двух столбцов в целое число, чтобы наша модель могла лучше понять.

Следующий шаг - определить, что мы прогнозируем, иначе говоря, результат! Мы разделим данные и «цель», которую вы могли бы сказать, на X и Y соответственно.

#set target and dataset or X and Y
y = data['kind']
X = data.drop(['kind'], axis = 1)

В следующей части начинается самое интересное

import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.neural_network import MLPClassifier
params = [{'solver': 'sgd', 'learning_rate': 'constant', 'momentum': 0,
           'learning_rate_init': 0.2},
          {'solver': 'sgd', 'learning_rate': 'constant', 'momentum': .9,
           'nesterovs_momentum': False, 'learning_rate_init': 0.2},
          {'solver': 'sgd', 'learning_rate': 'constant', 'momentum': .9,
           'nesterovs_momentum': True, 'learning_rate_init': 0.2},
          {'solver': 'sgd', 'learning_rate': 'invscaling', 'momentum': 0,
           'learning_rate_init': 0.2},
          {'solver': 'sgd', 'learning_rate': 'invscaling', 'momentum': .9,
           'nesterovs_momentum': True, 'learning_rate_init': 0.2},
          {'solver': 'sgd', 'learning_rate': 'invscaling', 'momentum': .9,
           'nesterovs_momentum': False, 'learning_rate_init': 0.2},
          {'solver': 'adam', 'learning_rate_init': 0.01}]

Здесь мы импортируем важные модули. Первый модуль - это Matplotlib, и это то, что мы будем использовать для визуализации нашей нейронной сети. Следующий - MinMaxScaler, и это важно, потому что он позволяет нам масштабировать наши данные в формат, с которым машина может лучше справиться. Самый важный из них - MLPClassifer, и это здорово, потому что он позволяет нам устанавливать различные параметры и стили обучения, чтобы увидеть, какой из них лучше всего подходит.

Важно то, что вы видите параметры выше. Среди этих параметров - количество слоев, количество нейронов на слой, количество итераций обучения и т. Д. Все это можно настроить, а также можно добавить другие параметры для повышения нашей производительности. Обратите внимание, хотя тезисы отличаются от гиперпараметров!

def plot_on_dataset(X, y, ax, name):
    # for each dataset, plot learning for each learning strategy
    print("\nlearning on dataset %s" % name)
    ax.set_title(name)
    X = MinMaxScaler().fit_transform(X)
    mlps = []
    if name == "digits":
        # digits is larger but converges fairly quickly
        max_iter = 15
    else:
        max_iter = 400
for label, param in zip(labels, params):
        print("training: %s" % label)
        mlp = MLPClassifier(verbose=0, random_state=0,
                            max_iter=max_iter, **param)
        mlp.fit(X, y)
        mlps.append(mlp)
        print("Training set score: %f" % mlp.score(X, y))
        print("Training set loss: %f" % mlp.loss_)
    for mlp, label, args in zip(mlps, labels, plot_args):
            ax.plot(mlp.loss_curve_, label=label, **args)

Далее мы рассмотрим функцию, которая не только отображает наши данные, но и масштабирует X, а также использует MLPClassifer и наши параметры, которые мы установили выше, для запуска нашей нейронной сети.

fig, axes = plt.subplots(2, 2, figsize=(15, 10))

data_sets = [(X,y)]
for ax, data, name in zip(axes.ravel(), data_sets, ['exercise']):
    plot_on_dataset(*data, ax=ax, name=name)
# can scale up to 4 I only have 1 dataset
fig.legend(ax.get_lines(), labels, ncol=2, loc="upper center")
plt.show()

Наконец, мы устанавливаем фигуру и ось, а также проверяем, что мы установили наш data_set равным X и y. После этого мы берем нашу ось и данные, затем устанавливаем имя нашего графика (неважно, что вы здесь говорите) и, наконец, показываем все с помощью plt.show ()

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