Привет.

Создать такую нейронную сеть — просто.

Минута первая: введение


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

  • Установленный Python;
  • Как минимум начальный уровень программирования;
  • Пять минут свободного времени.

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

image

Для построения предсказаний будем использовать имплементацию нейронной сети из библиотеки scikit-learn. Сами же предсказания будут основаны на данных из датасета Калифорнийского университета в Ирвайн “Breast Cancer Wisconsin” (рак груди, Висконсин). На вход нейронной сети подаются свойства клеточных ядер новообразования (например, строение), а на выходе мы получаем предсказание: злокачественное или доброкачественное новообразование.

Минута вторая: начало работы


Если у вас не установлена библиотека scikit-learn, то запустите команду pip install scikit-learn в терминале, которая установит библиотеку и все её зависимости.

Откройте среду разработки и создайте новый файл под названием, например, neuralnet.py. Теперь мы загрузим имплементацию нейронной сети, обучающие данные и функцию для разделения наших данных на тренировочный и тестовый наборы для нейронной сети.

# Имплементация нейронной сети
from sklearn.neural_network import MLPClassifier
# Функция для загрузки датасета
from sklearn.datasets import load_breast_cancer
# Функция для разделения датасета
from sklearn.model_selection import train_test_split

Ссылки на документации используемых методов и датасетов scikit-learn:

  1. Документация датасета с данными о раке груди (load_breast_cancer)
  2. Документация для функции предобработки данных (train_test_split)
  3. Документация для имплементации нейронной сети (MLPClassifier)

Минута третья: предварительная обработка


Прежде чем приступить к обучению нейронной сети на датасете, необходимо обработать данные. Для начала загрузим данные и выделим в attributes свойства новообразований (двумерный список, содержащий численные значения), а в labels?—?целевые переменные, метки злокачественности или доброкачественности новообразования (список из нулей и единиц). Содержимое каждого из списков соответствует содержимому другого списка под тем же индексом, то есть, к примеру, labels[0] определяет значение целевой переменной для признаков, хранящихся в attributes[0].

data = load_breast_cancer() # Загружаем и сохраняем датасет
attributes = data.data # Свойства клеточных ядер 
labels = data.target # Метки злокачественности

Теперь мы разделяем данные на тренировочные (для обучения нейронной сети) и тестовые (для проверки корректности ее работы). Тренировочный набор данных состоит из attributes_train и labels_train, тестовый?—?из attributes_test и labels_test. Треть наших данных будет составлять тестовый сет, оставшиеся две трети? —? обучающий.

attributes_train, attributes_test, labels_train, labels_test = train_test_split(attributes, labels, test_size=0.33)


Минута четвёртая: нейронная сеть


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

neuralnet = MLPClassifier() # Инициализация нейронной сети
neuralnet.fit(attributes_train, labels_train) # Обучение сети
accuracy = neuralnet.score(attributes_test, labels_test) # Измерение точности работы сети
print(str(accuracy * 100) + "% accuracy") # Вывод значения точности в процентах

Попробуйте запустить нейронную сеть через терминал командой python neuralnet.py примерно десять раз (можете заменить neuralnet.py на название вашего скрипта) и сравните результаты.

Минута пятая: оптимизация результата


image
Результаты работы классификатора

Есть вероятность, что разница в измерениях точности нейронной сети будет большой. Когда мы разделяли данные на обучающий и тестовый сеты, данные были перемешаны случайно, что и объясняет изменения результатов. В нашем датасете всего лишь 569 объектов, и модель обучается на 379 его объектах-представителях, что приводит к переобучению, так как данных слишком мало.

К тому же мы создавали нейронную сеть при помощи конструктора neuralnet = MLPClassifier(), которому не передали ни одного аргумента. Это значит, что сеть была построена с использованием параметров по умолчанию, то есть, она не оптимизирована.

Мы можем исправить ситуацию либо обучая сеть на большем наборе данных, либо настраивая параметры датасета.

Я выбрал второй вариант и переключил solver с adam (по умолчанию) наlbfgs. В документации было сказано, что этот параметр позволяет оптимизировать сеть на маленьких наборах данных. Также я изменил активационную функцию с relu на logistic и экспериментальным путём установил, что значения alpha от 0.0001 до 10.0 предотвращают переобучение.

# Замените предыдущую строку инициализации нейронной сети на эту
neuralnet = MLPClassifier(solver='lbfgs', activation='logistic', alpha=10.0)

image
Результаты работы оптимизированного классификатора

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

Заключение


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

Если вы заинтересовались машинным обучением, то в интернете имеется множество курсов на эту тему, например, на Coursera, которые помогут разобраться в работе алгоритмов.

Успехов! Всем знаний!

Комментарии (0)