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

Синдром поликистоза яичников.

Слово из трех букв, которое повлияло на жизнь и будущее миллионов женщин и девочек во всем мире.

Синдром поликистозных яичников или СПКЯ - это заболевание, которое влияет не только на яичники женщины, но и на исход ее жизни.

СПКЯ поражает не только избранную группу людей. От 6 до 12% женщин страдают СПКЯ, а это означает, что только в Соединенных Штатах от него страдают не менее 5 миллионов женщин.

СПКЯ - наиболее распространенное эндокринное заболевание среди женщин детородного возраста и ведущая причина бесплодия во всем мире.

Но чтобы понять, что такое СПКЯ, нам нужно сделать шаг назад и взглянуть на женскую репродуктивную систему.

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

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

В зависимости от количества вырабатываемых гормонов, в частности f олликулостимулирующего гормона (ФСГ), вырабатываемого фолликулами, эстроген и прогестерон, производимый яичники и лютеинизирующий гормон (ЛГ), вырабатываемый гипофизом, человек будет находиться на другой стадии менструального цикла.

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

Фолликулярная фаза: 7–10 дней между началом менструального цикла (с началом менструации) и овуляцией. Производство фолликулостимулирующего гормона немного увеличивается, что стимулирует рост от 3 до 30 фолликулов. Поскольку на более поздних этапах фазы ФСГ снижается, только один фолликул (доминантный фолликул) продолжает расти и вскоре начинает вырабатывать эстроген, который начинает подготовку матки и инициирует выброс ЛГ.

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

Лютеиновая фаза: 10–14 дней между овуляцией и началом менструации при условии, что яйцеклетка не оплодотворена. Разорванный фолликул закрывается после выхода яйцеклетки и образует структуру, называемую желтым телом, которая производит все большее количество прогестерона. Прогестерон вызывает утолщение слизистой оболочки матки. На этой стадии также повышается уровень эстрогена, который способствует утолщению слизистой оболочки матки.

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

Однако СПКЯ нарушает этот неизбежный биологический процесс.

Яичники не просто производят ФСГ, эстроген и прогестерон; они также производят небольшое количество андрогенов или мужских половых гормонов. К ним относятся тестостерон, дегидроэпиандростерон сульфат (DHEAS), дегидроэпиандростерон (DHEA), андростендион и андростендиол, хотя женщины часто превращают большинство этих гормонов, особенно тестостерон и андростендиол, в эстроген.

СПКЯ возникает, когда яичники производят ненормальное количество этих андрогенов, вызывая развитие многочисленных небольших кист или мешочков, заполненных жидкостью, внутри яичников. Хотя у некоторых женщин с этим заболеванием кисты не развиваются, у многих развиваются.

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

Тем не менее, СПКЯ не ограничивается яичниками или даже вопросом фертильности.

Женщины с СПКЯ подвержены более высокому риску инсулинорезистентности, высокого уровня сахара в крови, ожирения, высокого уровня холестерина, высокого кровяного давления, диабета 2 типа и других сердечно-сосудистых заболеваний.

Одна из самых больших проблем с СПКЯ заключается в том, что ни одна женщина с СПКЯ не выглядит или даже не испытывает того же, что и другая.

Распространено мнение, что СПКЯ поражает только женщин с избыточным весом или страдающих от родственного заболевания или одного из симптомов этого состояния.

Но здесь нет ничего общего с тем, как выглядит или переживает женщина с СПКЯ.

СПКЯ поражает женщин всех национальностей, происхождения и размеров. Он поражает моделей и спортсменов, угнетенное население, 16-летних девушек и 45-летних женщин. Женщины с кистами, которые бесплодны и испытывают физические побочные эффекты, такие как увеличение веса или прыщи, по сравнению с женщинами без кист и не испытывают никаких физических симптомов, кроме нерегулярных менструальных циклов.

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

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

Женщины за женщинами делятся своими историями о том, как их неправильно понимают, ставят неверный диагноз и отвергают, когда они обращаются за помощью. Более 50% женщин с СПКЯ остаются официально не диагностированными и не могут получить необходимую им помощь.

Здесь на помощь приходит машинное обучение.

Используя машинное обучение, подмножество искусственного интеллекта, мы можем создать модель, которая может принимать информацию о пациентах и ​​определять, есть ли у них СПКЯ.

Звучит слишком хорошо, чтобы быть правдой, правда?

Что ж, может быть, это не так уж и далеко в нашем будущем.

За последние несколько дней я построил модель машинного обучения, которая может учитывать различные показатели пациента, от индекса массы тела (ИМТ) до артериального давления и концентрации определенных гормонов. Используя эту информацию, модель может обнаружить СПКЯ у пациента с простым ответом «да» или «нет» в виде «1» или «0».

Вот как я это сделал ...

1. Импорт библиотек и наборов данных

Первым шагом к созданию нашей модели является импорт наших библиотек и наборов данных в нашу записную книжку Google Colab.

pandas: самая популярная библиотека Python, которая используется для обработки и анализа данных. В этом проекте это в первую очередь полезно для работы с фреймами данных.

NumPy: библиотека Python, которая обеспечивает поддержку больших, многомерных массивов и матриц и имеет математические функции высокого уровня, помогающие работать с этими массивами и управлять ими.

matplotlib.pyplot и seaborn: используются для визуализации данных.

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

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

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns._version_

После того, как мы импортировали наши библиотеки, мы можем импортировать наш набор данных.

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

Набор данных, который я использовал для этого проекта, содержит данные о 541 пациенте из 10 больниц в Керале, Индия. Данные содержат более 40 физических и клинических параметров для каждого пациента, которые будут использоваться в качестве входных данных.

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

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

Мы также можем избавиться от некоторых из этих столбцов, что упростит использование данных после того, как мы импортировали их в нашу записную книжку. Как мы видим, столбец «Sl. Нет »и« Номер файла пациента ». не будет служить какой-либо цели, поскольку их не нужно включать во входные данные, поэтому мы можем удалить оба этих столбца.

Первый столбец в наборе данных должен быть «PCOS (Y / N)», который будет выходом нашей модели. Остальные столбцы будут входными данными.

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

Как только мы это сделаем, мы можем сохранить этот новый файл как файл CSV, импортировать эти данные в нашу записную книжку и запустить код.

from google.colab import files
uploaded = files.upload()
pcos = pd.read_csv('PCOS_no_infertility.csv')
pcos.head(15)

Последняя строка этого блока напечатает первые 15 строк данных, от строки 0 до строки 14, что позволит нам увидеть особенности данных в кадре данных, сокращенных до df.

2. Исследовательский анализ данных

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

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

Мы также хотим использовать метки в строке 0 в качестве заголовков столбцов вместо заголовков «Безымянный: #», которые есть сейчас.

new_header = df.iloc[0]
df = df[1:]
df.columns = new_header

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

Здесь мы также можем увидеть количество имеющихся у нас строк и столбцов. Это показывает нам, что у нас есть 541 строка для каждого пациента и 42 столбца, 41 из которых являются нашими входными функциями.

Затем мы хотим продолжить и начать поиск нулевых значений в наших данных. Чтобы проверить нулевые значения, нам нужно запустить df.isnull () .sum () и увидеть список, который выглядит следующим образом.

Здесь мы видим, что у нас есть пара нулевых значений, разбросанных по набору данных, и мы можем удалить их, запустив df = df.dropna () в следующем блоке кода, который отбросит нулевые значения, как мы видим справа.

После того, как мы отбросили нулевые значения, мы хотим увидеть типы данных столбцов в нашем наборе данных, что мы можем сделать, запустив df.info (), который показывает нам, что все наши данные являются Тип данных объект. Однако нам нужно преобразовать наши данные в числовые значения, чтобы наша модель смогла их обработать.

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

for column in df:
    columnSeriesObj = df[column]
    df[column] = pd.to_numeric(df[column], errors='coerce')

Затем, когда мы запускаем df.info (), мы видим, что все наши данные превратились в числовые значения.

Теперь, когда мы очистили наши данные, мы можем визуализировать их с помощью серии визуальных эффектов.

Здесь мы можем увидеть взаимосвязь между различными функциями. Например, матрица в левом нижнем углу показывает нам взаимосвязь между возрастом пациента и его ИМТ.

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

Мы также можем визуализировать распределение данных внутри определенных функций с помощью гистограммы.

3. Визуализация данных

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

Во-первых, мы можем найти корреляции между столбцами или функциями наших данных, запустив df.corr ().

В этой сетке мы можем увидеть корреляцию между функциями. Число, близкое к 1 или равное 1, означает, что существует почти идеальная корреляция, а числа, равные или близкие к 0, означают, что корреляции почти нет. Любые отрицательные значения указывают на обратную корреляцию.

Например, мы можем видеть, что ИМТ и вес человека довольно сильно коррелируют со значением 0,901719. Однако рост человека и продолжительность его менструального цикла почти не коррелируют со значением 0,007512.

Мы также можем визуализировать эти корреляции, создав тепловую карту.

corr_matrix= df.corr()
plt.subplots(figsize=(30,10))
sns.heatmap(corr_matrix, annot = True, fmt = ".2f");
plt.title("Correlation Between Features")
plt.show()

figsize устанавливает размер тепловой карты, annot = True, показывает нам числовые значения внутри тепловой карты и fmt = '.2f' Показывает нам числовое соотношение с округлением до сотых долей.

4. Подготовка данных перед обучением модели

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

Во-первых, нам нужно разделить данные на независимые наборы данных X и Y. Первый столбец - это выходные данные модели, диагноз пациента, а остальные 41 столбец - это характеристики или входные данные модели.

X = df.iloc[:,1:41].values
Y = df.iloc[:,0].values

После того, как мы установили наборы данных X и Y, мы можем разделить 70% данных на данные обучения и 30% на данные тестирования.

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

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

from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.3 , random_state = 0)

Теперь нам нужно масштабировать наши данные, прежде чем передавать их алгоритму. Масштабирование данных или масштабирование функций просто означает, что все наши функции соответствуют определенному диапазону, будь то от 0 до 1 или от 0 до 100.

Чтобы масштабировать наши данные, мы можем импортировать StandardScaler из sklearn и передавать наши данные обучения и тестирования.

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.fit_transform(X_test)

5. Обучение и оценка модели.

В рамках этого проекта я сравнил точность двух различных алгоритмов классификации - модели логистической регрессии и классификатора случайного леса - и сравнил их показатели точности при обнаружении СПКЯ у человека.

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

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

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

Кроме того, в обоих алгоритмах должно быть установлено random_state = 0. Установка фиксированного значения random_state гарантирует, что при каждом запуске кода будет генерироваться одна и та же последовательность случайных чисел. Это помогает проверить вывод модели.

Затем мы можем запустить model = models (X_train, Y_train), чтобы увидеть точность всех трех моделей на данных обучения.

Как мы видим, классификатор случайного леса работал со 100% точностью, а модель логистической регрессии - с точностью около 92%. Хотя эти проценты сейчас довольно высоки, они будут падать при выполнении с данными тестирования, поскольку модели еще не видели данные тестирования и, следовательно, не могут выполнять итерации по ним.

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

Модель логистической регрессии достигла точности около 89,4% по данным тестирования, а классификатор случайного леса - около 87,6%.

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

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

Посмотрите мой код для проекта здесь и видео, которое я сделал с подробным объяснением кода.

Большое спасибо за то, что прочитали это! Если вы узнали что-то из этой статьи, поделитесь, пожалуйста! Не забудьте связаться со мной, загляните на мой личный сайт и оставьте эту статью аплодисментами 👏, если она вам понравилась!

Источники