Аннотация
Статья выполнена в рамках курсового проекта по дисциплине «Методы интеллектуального анализа данных» [6]. В статье рассматривается применение нейронной сети для детекции сахарного диабета у пациенток в возрасте от 21 года. Для разработки и реализации вышеописанной модели использовался язык программирования Python с несколькими его библиотеками, а также обучающий набор данных для тренировки нейронной сети, взятый с сайта www.kaggle.com.
Введение
В настоящее время существуют различные технологии, предоставляющие инструментарий для реализации математических моделей. Однако наибольший интерес представляют технологии искусственных нейронных сетей, поскольку имеют высокую популярность и широкое распространение в повседневной жизни. В последние несколько лет можно наблюдать повышенный интерес к нейронным сетям, которые применяются в различных сферах – медицине, науке, технике, бизнесе и т.д. Чаще всего сети используются там, где необходимо решать задачи классификации, прогнозирования или принятия решений [1, c. 15].
Методика исследования
Сахарный диабет – это эндокринное заболевание, получившее самое широкое распространение среди заболеваний подобного типа. Это заболевание занимает четвертое место в мире среди причин преждевременной смертности людей. Несмотря на усилия организаций здравоохранения во многих странах мира число людей с заболеванием диабета растет постоянно. Если раньше болезнь была больше распространена среди лиц старше 40 лет, то сегодня ею болеют даже дети и подростки. Сахарный диабет имеет множество факторов развития, именно развития, т.к. в большинстве своих случаев передается наследственно. Но наследственность никогда не является 100% фактором развития данной болезни [5].
Можно сказать, что факторов, влияющих на риск развития диабета может быть несколько, соответственно, обычные регрессионные модели плохо подходят для предсказания наличия диабета у того или иного пациента. Поэтому авторы предлагают использовать нейронные сети, так как они представляют собой достаточно сложные, но легко масштабируемые вычислительные системы.
Перед выбором архитектуры сети и её реализации в коде следует выбрать и проанализировать набор данных для обучения и тестирования сети. Был выбран файл «diabetes.csv», загруженный с сайта www.kaggle.com, который содержит матрицу размером 768*11 ячеек со следующими признаками:
Число беременностей (все пациенты из источника – женщины не моложе 21 года) (ст. 1)
Концентрация глюкозы в плазме через 2 часа после введения в пероральном глюкозотолерантном тесте (ст. 2)
Диастолическое артериальное давление (мм рт. ст.) (ст. 3)
Толщина кожной складки в районе трицепса (мм) (ст. 4)
Концентрация инсулинав сыворотке крови (мкЕд / мл) (ст. 5)
Индекс массы тела (вес в кг/ (рост в м)²) (ст. 6)
Возраст (годы) (ст. 7)
Функция, описывающая генетическую предрасположенность пациента к диабету (ст. 8)
Ниже в таблице 1 представлена вышеописанная структура данных в табличном виде, где последние три столбца – это принадлежность к тому или иному классу (1 кл. – отсутствие с.д., 2 кл. – риск развития с.д., 3 кл. – наличие с.д.)
Таблица 1
Табличный вид структуры данных
№ ст. |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
1 |
1.0 |
71.0 |
78.0 |
50.0 |
45.0 |
33.2 |
21.0 |
0.422 |
1.0 |
0.0 |
0.0 |
2 |
2.0 |
122.0 |
52.0 |
43.0 |
158.0 |
36.2 |
28.0 |
0.816 |
1.0 |
0.0 |
0.0 |
… … … … … … … … … … … … … … … … … |
|||||||||||
768 |
4.0 |
142.0 |
86.0 |
0.0 |
0.0 |
44.0 |
22.0 |
0.645 |
0.0 |
0.0 |
1.0 |
Из таблицы следует, что структура данных достаточно объёмная, поэтому теперь необходимо определиться с архитектурой сети. Существует несколько видов архитектур нейронных сетей, две наиболее популярные из них – это сеть прямого распространения и свёрточная нейронная сеть. Сети прямого распространения подразделяются на однослойные персептроны и многослойные персептроны. Чаще всего строят многослойные сети, так как они позволяют описывать достаточно сложные процессы и на основании этого выдавать более точные результаты, однако это не всегда верно на практике: исследователь может столкнуться с тем, что, например, нейронная сеть с 3-мя слоями выдаёт результат точнее, чем сеть с 4-мя слоями. Поэтому авторы выбрали и реализовали 2 различные архитектуры, которые имеют 3 и 4 скрытых слоя.
Реализация нейронной сети
Особенностью данной работы является «ручная» реализация нейронной сети без использования библиотеки «sklearn» и готовых сетей. Перейдём непосредственно к разработке нейронной сети. Имея набор данных, размерностью 768 наблюдений, приступим к написанию программы, реализующей нейронную сеть. В первую очередь необходимо считать данные с файла формата «diabetes.csv», что достаточно легко реализовывается с помощью библиотеки «pandas» [9].
Теперь перейдём к реализации сети. Построим трёхслойный персептрон с 16, 12 и 6 нейронами в 1, 2 и 3 слоях соответственно. На рисунке 1 продемонстрирован листинг кода, который инициализирует базовую нейронную сеть.
Рисунок 1. Листинг кода по инициализации сети
Здесь в коде создаётся класс «Neural_Network», который будет реализовывать всю нейронную сеть в одной переменной. В ней по умолчанию будут созданы пять внутренних переменных: количество нейронов во входном слое, в выходном слое и в скрытых (1й, 2й и 3й). Получаем трёхслойный персептрон, который в общей сумме имеет 45 нейронов.
Далее создаём 4 массива, которые изначально будут задаваться случайными числами от -1 до 1. Эти массивы скорее являются матрицами весов, отвечающие за переход от j-го к j+1-му слою. [4, c. 321] Можно было бы проставить вместо случайных чисел какие-нибудь конкретные значения, но это не принципиально.
Также необходимо создать функцию, вычисляющую сигмоиду от входящего параметра. То есть в данном случае мы будем использовать обычную сигмоиду, где в знаменателе в степени экспоненты будет находится отрицательная линейная комбинация весов и входящих параметров. Получается, что функция должна принимать массив и возвращать его, преобразовав входящие данные с помощью сигмоиды. Нельзя забывать о создании функции, отвечающей за производную от сигмоиды, то есть a*(1-a), где a – это значение Z, которое необходимо вычислить до вызова функции. [4, c.34]
Далее реализуем методы прямого и обратного распространения ошибки. На рисунке 2 продемонстрирован код, который реализует данные методы
Рис.2. Листинг кода по реализации алгоритмов обучения сети
. Здесь в первых 11 строках кода происходит переход от i-го слоя к i+1-му слою, в последней строке происходит возвращение трёхмерного вектора, который интерпретируется, как принадлежность пациента к тому или иному классу. С 13 по 31 строку кода реализуется алгоритм обратного распространения, суть которого заключается в корректировке весов. С 15 по 26 строку происходят переходы от последнего слоя к первому, а строки 27-31 реализуют корректировку весов сети.
Заметим, что, если бы было выбрано не 3, а 4 слоя, то пришлось бы дописывать в первый метод ещё 2 строки кода, а во второй 3. Стоит также отметить, что значения 0.125 – это коэффициент обучения, необходимый нам для движения в функции стоимости (по мере обучения нейронной сети) к глобальному минимуму. Во всех вычислениях используются библиотеки «numpy» и «pandas» [9].
После того, как мы создали класс, отвечающий за всю работу нейронной сети, перейдём непосредственно к обучению. Создав объект класса, необходимо в цикле от 1 до m обучать персептрон и выводить на каждом шаге MSE (отклонение прогнозного значения от ожидаемого). Если MSE уменьшается, то это может значить только то, что обучение идёт не зря, и с каждым шагом сеть становиться «всё умнее и умнее». Число m – это количество эпох, которое задаётся по желанию разработчика. Также на каждом шаге исходный тренировочный набор данных смешивается случайным образом, чтобы не было повторений при обучении. На рисунке 3 представлены выходные данные после обучения трёхслойной сети. В последней строке выводится время обучения в секундах.
Рисунок 3. Выходные данные после обучения нейронной сети
После обучения сети необходимо пропустить через неё тестовую часть выборки, которая состоит из 227 наблюдений, так как остальные 450 наблюдений использовались для обучения сети. Для этого в цикле берётся часть данных по параметрам, часть данных по ожидаемому прогнозу и реализовывается прямое распространение ошибки, реализованное в полученной нейросети [7, c. 294]. После необходимо сравнить ответы. Ниже в таблице 1 приведены трёхслойный и четырёхслойный персептроны, результаты (уже после реализации «forward propagation» на тестовой выборке) которых значительно отличаются.
Таблица 2
Сравнение 3- и 4-слойного персептронов
Слои |
Эпохи |
Ошибка_1кл. |
Ошибка_2кл. |
Ошибка_3кл. |
Совпадения |
3 |
8000 |
0,14 |
0,056 |
0,15 |
84,64 % |
4 |
13000 |
0,158 |
0,059 |
0,16 |
79,82 % |
Отсюда видим, что наилучшая нейронная сеть имеет 3 слоя, которые соответственно имеют по 10, 12, 6 нейронов. Здесь также стоит отметить, что точность попаданий прогнозных значений в фактические (т.н. «accuracy»), отличается более чем на 4%. На рисунке 4 представлены выходные данные, которые разработанная программа показывает после тестирования сети. Здесь в последней строке можно увидеть нужный нам «accurancy».
Рисунок 4. Выходные данные после тестирования нейронной сети
Заключение
В работе реализовано две модели нейронных сетей. Трехслойная нейронная сеть показала достаточно качественный результат. Минус нейронных сетей заключается в их достаточно долгом обучении, тогда как другие алгоритмы (в т.ч. «дерево решений», «лес решений» и др.) реализуются за считанные секунды. Однако жертвуя временем, можно получить лучшую точность.
Также хотелось бы отметить, что, имея большую, по объему, чем исследованная, выборку можно реализовать обучение сети на перекрёстной выборке (т.н. «cross-validation») [6]. Это заняло бы примерно столько же времени, сколько и обучение полученной нейронной сети, однако, благодаря этому, можно было бы подкорректировать веса, получив сеть, показывающую результаты по точности лучше на тестовой выборке.
Список источников и литературы
А.В.Гасников, П.Е.Двуреченский, Ю.Е.Нестеров. Стохастические градиентные методы с неточным оракулом. Труды МФТИ, 2016, т.8, № 1, с.41-91.
Арнис. Нейронные сети для начинающих. — 2016. https://habrahabr.ru/ post/312450/.
А.Ю. Дорогов. Теория и проектирвоание быстрых перестраиваемых преобразований и слабосаязанных нейронных сетей. — Санкт-Петербург: Политехника, 2014. — 328 с.
Васильев, А. Н. Принципы и техника нейросетевого моделирования / А.Н. Васильев, Д.А. Тархов. - Москва: Высшая школа, 2014. - 218 c.
Левит Ш., Филлипов Ю.И., Горелышев А.С. Сахарный диабет 2 типа: время изменить концепцию. — 2014.
Л.И. Воронова, В.И. Воронов. Machine Learning. Регрессионные методы интеллектуального анализа данных: учебное пособие – МТУСИ, 2018 – 81 с.
I.Sutskever, J.Martens, G.Dahl, G.Hinton. On the importance of initialization and momentum in deep learning. J. of Machine Learning Research, 2013, V. 28, No. 3, pp. 1139-1147.
William M. Bolstad. Introduction to Bayesian Statistics, 2nd Edition // Wiley-Interscience; 2nd edition
Документация и загрузка ПО «Anaconda». 2018. URL: https://www.anaconda.com/ (дата обращение 3.12.2018).