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

По данным Американской кардиологической ассоциации, болезни сердца действительно имеют большое значение в США, примерно каждая третья смерть в США связана с сердечными заболеваниями. И около 2300 жителей Америки умирают каждый день из-за болезней сердца. Это означает, что 1 человек умирает от сердечного приступа всего за 38 секунд. Данные показывают, что первые три американских убийцы - это болезни сердца, рак и хронические заболевания нижних дыхательных путей, а также болезни сердца, унесшие больше смертей, чем два других вместе взятых! Так что болезни сердца - действительно важная проблема для здоровья американцев.

Что касается расходов, отчет фонда CDC показывает, что примерно 1 из каждых 6 долларов здравоохранения тратится на сердечные заболевания. Это вызывает в США около 1 миллиарда долларов в день с точки зрения затрат на здравоохранение и потери производительности.

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

Дизайн проекта

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

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

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

Инструменты

Я буду использовать numpy, pandas, matplotlib, seaborn, sklearn и Flask для этого проекта.

Трубопровод

Данные

Данные, с которыми я работал, взяты из UCI repo. Набор данных содержит 303 записи и 14 функций. (Набор данных немного устарел, он датируется 1988 годом.)

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

Очистка и EDA

Целевая переменная - это последний столбец исходного набора данных с именем num. Это категориальный признак, обозначенный как 0, 1, 2, 3, 4. 0 означает, что у пациента нет сердечного заболевания, а 1, 2, 3, 4 означают, что у пациента какое-то сердечное заболевание. Поскольку моя задача состоит в том, чтобы предсказать, есть ли у человека сердечное заболевание или нет, я сгруппировал 1, 2, 3, 4 все вместе в одну группу, чтобы обозначить, что у человека сердечное заболевание.

После группировки я определил, что в моем наборе данных есть 6 значений NaN, что составляет чуть менее 2% от моего набора данных, поэтому я решил отбросить эти NaN. Наконец, мой класс 0, который является нормальным пациентом, составляет около 54% ​​всего моего набора данных, а класс 1 составляет около 46% моего набора данных. Я думаю, что мой набор данных - это набор данных баланса.

После нескольких EDA, очистки данных и использования StandScaler для масштабирования моих данных (поскольку моя целевая переменная находится между 0 и 1, поэтому мне нужно масштабировать столбцы, отличные от 0 и 1, между 0 и 1), я построил базовую модель, которая включает все 14 переменных, с использованием KNN, логистической регрессии, дерева решений, случайного леса, SVM, наивного байеса и XGboost. Лучшим классификатором для моей базовой модели является логистическая регрессия с оценкой отзыва при перекрестной проверке 0,81. Затем я использовал поиск по сетке, чтобы попытаться найти лучший гиперпараметр каждой модели, и все же логистическая регрессия имеет лучший показатель отзыва резюме.

Моделирование и проектирование элементов

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

Я использовал эти выбранные переменные, чтобы построить больше моделей, используя алгоритмы, которые я использовал для базовой модели. Логистическая регрессия по-прежнему имеет лучший показатель отзыва резюме. После повторного выполнения поиска по сетке с новыми выбранными переменными мой показатель отзыва CV логистической регрессии улучшился до 0,8571 и стал лучшим среди всех моделей.

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

Затем я посмотрел на свою матрицу путаницы, график зависимости точности от отзыва и график ROC моей модели. Наилучший порог, который может максимизировать как точность, так и отзывчивость, составляет около 0,5, это порог, который я использую для своей модели. Также у меня есть оценка AUC 0,9087, что тоже неплохо. Я решил, что это будет моя последняя модель.

Веб-приложение

После того, как моя окончательная модель была готова, мне нужно подготовить несколько вещей, прежде чем прототип моего веб-приложения действительно сможет функционировать. Мне нужно создать конвейер и использовать pickle для экспорта моей окончательной модели и данных для последующего использования во Flask. После определения функции для прогнозирования я использовал HTML, CSS и Flask для создания простого демонстрационного веб-приложения - Heart Disease Predictor. Пользователи могут ввести свою информацию, и предсказатель скажет вам, есть ли у вас сердечное заболевание или нет, по шкале уверенности.

Будущее улучшение

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

  • Больше данных: я хотел бы работать с более крупным набором данных и более свежим.
  • Знания в предметной области. Поскольку я подхожу к проблеме только со знанием науки о данных, я хотел бы получить больше знаний о сердечных заболеваниях от врачей. Потому что я думаю, что это может помочь мне обнаружить некоторые скрытые элементы моей модели. Например, соотношение стоимости медицинских тестов и того, как каждый тест влияет на мою модель (чувствительность). Это может быть полезно для некоторых пациентов, которые не хотят выполнять дорогостоящие анализы или медицинские тесты, сопряженные с повышенным риском.
  • Улучшение моего приложения Flask: я хотел бы улучшить свое веб-приложение Flask до уровня, более готового к работе, и развернуть его на сервере веб-хостинга, чтобы люди могли испытать его.

Код и детали доступны на моем Github. Спасибо за чтение! И любые комментарии приветствуются.