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

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

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

Из всех 48 характеристик в данных больше всего выделялся конечный диастолический объем левого желудочка (далее EDV), который представляет собой объем левого желудочка, когда он закончил наполняться кровью. Левый желудочек (LV) - это камера сердца, ответственная за выталкивание насыщенной кислородом крови в системный кровоток.

Проблема

ЛЖ не может расширяться, как воздушный шар: для увеличения объема мышечная стенка должна истончиться. Как только мышечная стенка истончается, LV не может эффективно перекачивать кровь, что вызывает целый ряд проблем. Функция ЛЖ также является индикатором общей сердечной функции. Если модель может точно предсказать EDV, она может помочь кардиологам определить, кому больше всего нужна помощь, и повысить эффективность системы здравоохранения.

Предварительная обработка

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

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

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

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

Моделирование

import pandas                as pd
import numpy                 as np
import matplotlib.pyplot     as plt
import seaborn               as sns
import xgboost               as xgb
from math                    import sqrt
from sklearn.linear_model    import LinearRegression, LassoCV
from sklearn.linear_model    import RidgeCV, ElasticNetCV
from sklearn.metrics         import r2_score, mean_squared_error
from sklearn.metrics         import mean_absolute_error
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing   import StandardScaler
from sklearn.ensemble        import RandomForestRegressor
from sklearn.pipeline        import Pipeline

Мой импорт довольно стандартный, и я включил три типа моделей: линейные, древовидные и модели повышения.

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

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

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

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

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

По этой причине я решил перейти к двум другим типам моделей.

Случайный лес - это древовидная модель: она использует дерево решений для определения и прогнозирования значений. Однако это улучшение по сравнению со стандартным деревом решений, поскольку оно включает два уровня случайности: оно загружает (случайный выбор с заменой) строки, а затем выбирает случайный набор функций. Я предпочел эту модель другим типам деревьев из-за случайного выбора функций: в наборе данных 48 функций с исходными функциями. Единственным недостатком способа настройки случайного леса является то, что я запустил GridSearch для поиска множества комбинаций гиперпараметров (параметров, которые я установил), но это не позволяет извлечь важность функции и, таким образом, исключает интерпретацию.

Модель регрессии XGBoost или Extreme Gradient Boost - это модель повышения, которая соответствует исходной слабой линейной модели, а затем итеративно подгоняет слабые модели к остаткам. Однако XGBoost включает регуляризацию с алгоритмами L1 и L2, чтобы минимизировать переоснащение. Я решил не запускать GridSearch для модели XGBoost из-за того, как работают две модели.

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

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

  • lvesv_log - зарегистрированные значения конечного систолического объема (объем в конце сокращения);
  • lvef - фракция выброса или количество перекачиваемой крови;
  • sex - пол испытуемого;
  • aortic_reg - это показатель обратного кровотока через аортальный клапан.
  • апикальная_ишемия - это показатель кровотока в апикальной области.

Систолический объем имеет отношение примерно 1: 1 к диастолическому объему, поэтому величина этого коэффициента неудивительна. Кроме того, фракция выброса - это соотношение диастолического и систолического объема, поэтому неудивительно, что фракция выброса является второй по величине. Что удивительно, так это то, насколько незначительны следующие три наиболее важные функции: они даже не видны на графике. Это особенно удивительно для меня, потому что модель XGBoost со специально разработанными функциями имеет более сильные коэффициенты.

Выводы и перспективы

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

Еще один аспект, который я хочу улучшить, - это сами данные. Прогнозировать EDV на основе данных МРТ - это хорошо, но для реального повышения эффективности системы мне нужно прогнозировать на основе данных из карт пациентов. При этом HIPAA затруднит получение таких данных.

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

Репозиторий этого проекта можно найти здесь.

Со мной также можно связаться в LinkedIn.