Нейронная сеть на Python в 15 строк кода для диагностики диабета

9
23193
Добавить в избранное

В этой статье опишем как минимальным средствами может быть создана и обучена нейронная сеть при помощи Python и библиотеки Keras.

Нейронная сеть на Python в 15 строк кода

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

Библиотека Keras представляет собой высокоуровневый интерфейс для создания нейронных сетей. Keras написан на Python и работает поверх таких более низкоуровневых решений, как TensorFlowCNTK и Theano. За счет этого программный код получается не только мощным, но и крайне компактным.

Экспериментальные данные

Экспериментальные данные, взятые из медицинского архива, представляют собой файл со значениями, разделенными запятыми, в котором каждая строка соответствует одной анкете. Подробную информацию о данных из датасета вы можете прочитать здесь.  В наборе экспериментальных данных, состоящих из анонимных записей имеется девять параметров. Последний из них, целевой, показывает, наблюдался ли у пациента сахарный диабет или нет (соответственно, 1 или 0). Восемь остальных параметров также имеют численные значения:

  1. Число беременностей (все пациенты из источника – женщины не моложе 21 года индийской народности пима).
  2. Концентрация глюкозы в плазме через 2 часа после введения в пероральном глюкозотолерантном тесте.
  3. Диастолическое артериальное давление (мм рт. ст.).
  4. Толщина кожной складки в районе трицепса (мм).
  5. Концентрация инсулина в сыворотке крови (мкЕд/мл).
  6. Индекс массы тела (вес в кг/(рост в м)^2).
  7. Функция, описывающая генетическую предрасположенность к диабету (diabetes pedegree).
  8. Возраст (годы).

Программный код и датасет также доступны на Github.

Загрузка необходимых модулей и данных

Библиотека Keras позволяет запускать нейронные сети с минимальным количеством операций. В качестве модели нейронной сети используется последовательная Sequental из модуля keras.models с заданием слоев keras.layers типа Dense.

Для последующей воспроизводимости результатов зафиксируем генератор случайных чисел при помощи функции random.seed() из библиотеки numpy. Считаем данные из датасета:

Разделим данные на матрицу признаков X и вектор целевой переменной Y (последний столбец датасета):

Нейронная сеть: создание модели

Создаем модель нейронной сети:

Опишем структуру модели нейронной сети. Определим входной, выходной и скрытые слои. Наша нейронная сеть будет иметь плотную (Dense) структуру – каждый нейрон связан со всеми нейронами следующего слоя. Выходной слой будет состоять из единственного нейрона, определяющего вероятность заболевания диабетом.

Слой добавляется к модели методом add(). Для входного слоя необходимо указать число признаков input_dim, равное в нашем случае 8:

Если наборы признаков образуют многомерную таблицу, то вместо параметра input_dim можно использовать параметр input_shape, принимающий кортеж с количеством элементов в каждом из измерений.

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

Функции активации

Создадим три скрытых слоя и один выходной слой нашей нейронной сети:

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

Перед тем, как начать тренировать модель, ее нужно скомпилировать при помощи метода compile():

Методу передается три параметра:

  • loss – функция потерь – объект, который модель стремиться минимизировать;
  • optimizer – оптимизатор, мы используем встроенный метод стохастической оптимизации adam, описанный в публикации Дедерика Кингма и Джимми Ба;
  • metrics – список метрик оптимизации, для задач классификации используется метрику ‘accuracy’.

Нейронная сеть: обучение и оценка результата

Для обучения нейронной сети применяем метод fit():

Параметр epochs – «эпохи» – количество проходов нейронной сети по всем записям датасета (выбирается исходя из того, насколько быстро модель с каждым новым проходом приближается к желаемой предсказательной точности), batch_size – количество объектов выборки, берущихся за один шаг. В процессе обучения API будет выводить соответствующие строчки с величинам функции потерь и метрики для каждой из эпох.

Оценим результат обучения нейронной сети. Метод evaluate() возвращает значения функции потерь и метрики для обученной модели:

Последняя строчка в форматированном виде выводит точность прогноза по нашей модели для заданной метрики accuracy:

Заключение

Наконец, полный код нейронной сети с комментариями приведен в листинге ниже:

Источник

Другие материалы по теме:

Интересуетесь Data Science?

Подпишитесь на нашу рассылку, чтобы получать больше интересных материалов:

И не беспокойтесь, мы тоже не любим спам. Отписаться можно в любое время.




9 Комментарии

  1. Я не понимаю как это использовать, какие данные и куда нужно вбивать чтобы определить есть ли у меня диабет

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

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

      model.predict(x)

      Здесь в качестве x выступает список параметров, соответствующих одному пациенту. То есть при необходимости можно добавить строчку:

      print(model.predict(x))

      При этом нужно предварительно определить все восемь значений параметров, входящих в список х в соответствии с моделью. Для этого нужно подробнее прочитать описание датасета и соответствующую статью исследователей https://archive.ics.uci.edu/ml/datasets/pima+indians+diabetes

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

      Подробнее о функциях модели в Keras можно почитать здесь https://keras.io/models/model/

  2. Проблема с кодом в том, что он лишь деалет вид, что работает. Т.к. данные не разделены на тренировочные и валидационные, то сеть не учится делать обобщению, а просто «запоминает» правильные ответы. Если разбить данные, то точность оказывается около 73%. При этом, если бы алгоритм давал всегда False, то его точность была бы около 70.

    • Спасибо за комментарий! Согласен, понял, что в работе не было кросс-валидации, оценка точности завышена.

  3. […] Keras служит оболочкой фреймворка, позволяющей сделать процесс создания и обучения моделей еще проще. Ознакомьтесь с официальной документацией Keras – ее стиль вполне соответствует задачам, решаемым самой библиотекой. О Keras мы также писали ранее на нашем сайте. […]

Оставьте комментарий