- PVSM.RU - https://www.pvsm.ru -

Создаём нейронную сеть, предсказывающую рак груди за пять минут

Привет.

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

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

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

  • Установленный 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. Документация датасета с данными о раке груди [1] (load_breast_cancer)
  2. Документация для функции предобработки данных [2] (train_test_split)
  3. Документация для имплементации нейронной сети [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. Я выбрал нейронную сеть для предсказания рака груди, потому что эти две темы сейчас являются одними из самых обсуждаемых в сфере точных наук.

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

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

Автор: Rushan

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/322425

Ссылки в тексте:

[1] Документация датасета с данными о раке груди: https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_breast_cancer.html

[2] Документация для функции предобработки данных: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

[3] Документация для имплементации нейронной сети: https://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html#sklearn.neural_network.MLPClassifier

[4] имеется: https://medium.com/fintechexplained/neural-networks-activation-function-to-back-propagation-understanding-neural-networks-bdd036c3f29f

[5] Coursera: https://www.coursera.org/learn/machine-learning

[6] Источник: https://habr.com/ru/post/458232/?utm_source=habrahabr&utm_medium=rss&utm_campaign=458232