Машинное обучение в медицине: ищем опухоль при помощи логистической регрессии

Автор: Ксения Забудская
Редакция: Дарья Филатова
Оформление: Никита Родионов
Публикация: 29.10.2021

У всякого безумия есть своя логика
Уильям Шекспир

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

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

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

Собственно набор данных (датасет, dataset), над которым мы будем проводить машинлернинговские операции, размещен в открытом доступе на популярной платформе для соревнований по анализу данных Kaggle.

Это сведения о пациентах со злокачественными и доброкачественными опухолями молочной железы.

Задача: предсказать, какой диагноз имеет пациент. Это задача классификации — отнесения объекта к какой-либо категории.

Для начала разберем, как представить диагноз в виде переменной. Это точно не количественная величина, тогда что?

Как мы уже решили, диагноз — это в какой-то степени категория, к которой мы относим случай. При этом значение точно, без промежуточных вариантов. Можно сравнить с днями недели. Если есть точки на графике, обозначающие события определенного дня, то ни одна из точек не может быть между понедельником и вторником. Если что-то произошло в понедельник, то оно произошло в понедельник, — все просто. В нашем случае опухоль или доброкачественная, или злокачественная.

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

Немного о самой модели. Логистическая регрессия — один из статистических методов классификации с использованием линейного дискриминанта Фишера. Она входит в топ часто используемых алгоритмов при исследовании данных.

Значением функции является вероятность того, что данное исходное значение принадлежит к определенному классу. Представим, что у нас есть какое-то пространство, в котором в виде точек размещены наши исходные значения. Мы можем поделить это пространство с помощью линейной плоскости на подпространства, в которых будут близкие значения, наиболее вероятно принадлежащие одному классу (типу, категории). Уже упомянутый линейный дискриминант Фишера определяет направления, проекции на которые лучше всего разделят классы. В итоге получаются разделяющие линейные плоскости.
 

Для реализации наших целей будем использовать Google Colab или Jupyter Notebook (не будем погружаться в аспекты его установки, просто воспользуемся версией в браузере, далее выбираем Try Classic Notebook).

Я опишу работу в Google Colab. Блоки кода добавляются с помощью «+Код», запускается код с помощью кнопки со стрелкой слева.

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

Загружаем данные по пациентам (скачанные с Kaggle) для работы в ноутбуке. Для этого в поле слева выбираем «Файлы», затем «Загрузить в сессионное хранилище». Последнее означает, что, к сожалению, данные будут храниться лишь во время текущей сессии, то есть после закрытия коллабного ноутбука они исчезнут, как Золушка с бала, и их вновь придется загружать.

С помощью команды .head выведем несколько начальных строк нашей таблички (формат .csv, в котором представлены данные по пациентам, это такой табличный подвид)

Вывод программы («голова» таблички)

Посмотрим, что у нас за данные

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

Нам повезло: нулевых значений ноль. Значит, не нужно как-то заполнять либо наоборот, удалять такие случаи и уменьшать количество пациентов в выборке.

Нам не нужны столбцы «id» и «Unnamed: 32», поскольку они не играют никакой роли в прогнозировании. Удаляем их

Далее нам нужно закодировать значения столбца «диагноз» (который сейчас представлен в виде букв «М» [malignant, злокачественный] и «В» [benign, доброкачественный]) в их числовые представления.

Обозначим входные и выходные данные:

Нашу модель надо сначала обучить, а потом проверить, как она справилась с этой задачей (протестировать). Для этого разобьем данные на тестовые и тренировочные. В качестве инструмента будем использовать модуль train_test_split библиотеки scikit-learn.

Затем необходимо стандартизировать данные. Для «скармливания» модели необходимо, чтобы распределение имело среднее значение 0 и стандартное отклонение 1. Это сделает StandardScaler.

Наконец, призываем непосредственно нашу логистическую регрессию, все из той же библиотеки scikit-learn.

Проверим эффективность нашей логистической регрессии.

Начнем с confusion matrix (матрица ошибок). Матрица представлена в выводе программы в прямоугольных скобках: общие для всей матрицы и внутри отдельные для каждой строки.

Здесь ŷ — это ответ алгоритма на объекте (то, что предсказала модель), y — истинная метка класса на этом объекте (то, как это было указано в нашем изначальном датасете).
Accuracy — это доля правильных ответов алгоритма, получилось (с округлением) 0,977 или 97,7 %.

Формула для расчета accuracy:

где TP — True Positive; TN — True Negative; FP — False Positive; FN — False Negative.

Итак, модель справилась неплохо. Можно ли еще лучше, проверим на других моделях в новых статьях.

Ссылки на ноутбук:

Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter.