Введение

Болезни сердца становятся очень распространенными среди пожилых и молодых людей, начиная с 20 лет. Около 18,2 миллиона взрослых страдают ишемической болезнью сердца, что составляет 2 из каждых 10 смертей среди взрослых моложе 65 лет. Только в Соединенных Штатах ежегодно от сердечно-сосудистых заболеваний умирает около 659 000 человек, что составляет 1 из каждых 4 случаев смерти. Подсчитано, что 16,3 миллиона американцев в возрасте 20 лет и старше страдают ишемической болезнью сердца. Мы анализируем, какие факторы можно использовать для прогнозирования наличия у пациента определенного уровня болезни сердца.

Последствия для бизнеса

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

Исследование данных

Приобретение

Мы работали с набором данных о сердечных заболеваниях из Kaggle. Переменная ответа указывает на наличие болезни сердца у пациента по шкале от 0 до 4 (где 0 указывает на отсутствие болезни сердца, а 1,2,3,4 указывает на наличие болезни сердца). Для этого конкретного набора данных переменная ответа называется «целевой» и имеет 2 номинальных значения: 0 — болезнь сердца отсутствует и 1 — болезнь сердца присутствует.

Вот краткий предварительный просмотр того, как выглядит набор данных:

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

Описание

Статистика всех атрибутов, как показано ниже:

Глядя на минимумы и максимумы, мы видим, что большинство атрибутов имеют номинальные значения, за исключением возраста, trestbps, chol, thalach и oldpeak.

Ниже приведено подробное описание каждого из атрибутов:

Визуализация

Распределение классов для нашей переменной ответа — цель, где 1 указывает на наличие болезни сердца, а 0 — на отсутствие болезни сердца:

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

Распределения по всем 14 атрибутам для лучшего понимания данных:

Из приведенных выше гистограмм видно, что возраст немного смещен влево, что означает, что в наборе данных больше пожилых людей. В наборе данных больше мужчин, чем женщин. Распределение «trestbps» (артериальное давление в покое), «chol» (холестерин в сыворотке) и «oldpeak» (депрессия ST, вызванная физической нагрузкой по сравнению с отдыхом) смещено вправо. Есть 9 категориальных переменных и 5 непрерывных числовых переменных.

Согласно корреляционной матрице, показанной выше, несмотря на отсутствие сильной корреляции между какими-либо независимыми переменными, мы все же рассмотрели наличие небольшой мультиколлинеарности. Самая сильная положительная корреляция, которую мы видим, наблюдается между «наклоном» и «талахом» со значением 0,4, а самая сильная отрицательная корреляция — между старым пиком и наклоном -0,58. Далее, для атрибутов с положительной корреляцией мы видим, что талах и эксанг имеют корреляцию 0,38. Для атрибутов с отрицательной корреляцией мы видим, что возраст и талах имеют корреляцию -0,39, cp и exang имеют корреляцию -0,4, thalach и oldpeak имеют корреляцию -0,35, а thalach и exang имеют корреляцию -0,38. Мы также видим, что «cp», «талах» и «наклон» имеют самую сильную положительную корреляцию с целевой переменной со значениями 0,43, 0,42 и 0,35 соответственно. И «exang», «oldpeak» и «ca» имеют самую сильную отрицательную корреляцию с целевой переменной со значениями -0,44, -0,44 и -0,38 соответственно.

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

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

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

Под наблюдением:

  1. K-ближайшие соседи
  2. Наивный Байес
  3. Логистическая регрессия
  4. Древо решений

Без присмотра:

Правила ассоциации

Для контролируемых моделей мы использовали библиотеку Python sklearn для запуска четырех классификаторов и выполнения предварительной обработки наших данных. Мы использовали матрицу путаницы и общую точность модели в качестве оценочной метрики, но в основном сосредоточились на отзыве моделей, поскольку мы не можем позволить себе ошибочно классифицировать пациента с сердечным заболеванием. Вот формула для отзыва: истинно положительный/истинно положительный + ложноотрицательный. Мы выполним разделение обучения/тестирования 70:30 на наших данных.

Сначала мы запустили все наши классификаторы на необработанных данных, чтобы создать эталон для результатов модели. Затем, чтобы улучшить производительность нашей модели, мы применили дискретизацию к непрерывным переменным вместе с поиском по сетке и перекрестной проверкой 10 раз, чтобы настроить гиперпараметры модели и оптимизировать производительность модели. Наконец, мы применили выбор объектов с поиском по сетке, чтобы сократить данные до наиболее важных атрибутов, и отметили производительность модели. Мы использовали инструмент выбора функций sklearn — SelectKBest, чтобы выбрать лучшие k функций для каждого алгоритма с помощью конвейера, а затем запустили алгоритмы на соответствующих выбранных функциях.

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

Эталон

Глядя на результаты для 4 классификаторов после разделения обучения/тестирования, мы видим, что без какой-либо предварительной обработки классификатор дерева решений работал лучше всего. KNN, с другой стороны, показал наихудшие результаты, особенно учитывая отзыв, что означает, что количество ошибочно классифицированных пациентов, у которых действительно есть сердечные заболевания, довольно велико. Мы можем видеть это из матрицы путаницы, согласно которой KNN ошибочно классифицировал 33% пациентов как не имеющих заболевания, хотя на самом деле у этих пациентов было заболевание. И Наивный Байес, и Логистическая регрессия дали аналогичные результаты модели. Для дальнейшего улучшения производительности модели мы применили несколько методов предварительной обработки.

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

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

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

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

Для K-ближайших соседей мы просто оптимизируем количество k соседей для классификатора посредством поиска по сетке. Наконец, для наивного байесовского классификатора мы оптимизировали параметр var_smoothing. Гиперпараметр var_smoothing сглаживает кривую распределения GaussianNB и учитывает наблюдения, которые могут быть выбросами на кривой GaussianNB, добавляя к дисперсии наибольшую долю дисперсии всех признаков.

Дискретизация

Мы применили дискретизацию «возраст», «trestbps», «chol» и «oldpeak», поскольку они содержат непрерывные значения. Классификаторы, такие как деревья решений, разделяются по атрибуту с наибольшим приростом информации. Однако, если уникальных значений слишком много, прирост информации будет смещен. Чтобы избежать этой ситуации, важно группировать или дискретизировать эти атрибуты. Это классифицирует значения таким образом, что, например, возраст 25 лет подпадает под категорию 20–25 лет, а не только одну категорию для 25 лет.

Мы использовали функцию дискретизации на основе квантилей Python (qcut) для дискретизации этих атрибутов. Этот инструмент по умолчанию дает равное количество экземпляров на корзину. Это означает, что интервалы бинов не согласованы. Например, первый бин содержит диапазон 20, а следующий содержит диапазон 10, но каждый интервал бина выбирается таким образом, чтобы получать примерно равные экземпляры на бин. Все эти непрерывные атрибуты были разделены на четыре интервала, кроме oldpeak, который был разделен на 2 интервала, так как имел небольшой диапазон непрерывных переменных. Затем ячейки были преобразованы в порядковые значения с помощью LabelEncoder sklearn. Например, первый возрастной бин интервала (28–48) заменяется на 0, следующий на 1 и так далее.

Вот результаты после применения четырех классификаторов к дискретизированному набору данных и поиска по сетке:

Основываясь на точности модели, мы видим, что применение дискретизации к набору данных имеет разные уровни влияния на модели. Во-первых, глядя на общую точность моделей, мы видим, что KNN значительно улучшилась по сравнению с эталонной точностью 70,24%. Точность, отзыв и оценка f1 также значительно выросли. Для логистической регрессии, наивного байесовского классификатора и классификатора дерева решений, по-видимому, нет значительного улучшения точности модели по сравнению с соответствующими контрольными показателями. Несмотря на то, что точность классификатора дерева решений повысилась до 1, к сожалению, полнота отзыва ухудшилась по сравнению с эталоном. Следовательно, мы можем сделать вывод, что KNN больше всего пострадал от этого этапа предварительной обработки.

Выбор функций

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

Чтобы выбрать лучшие k функций в каждой из моделей, нам нужно знать значение k. Для этого мы создали отдельный конвейер с помощью инструмента SelectKBest для каждого из классификаторов, а затем использовали поиск по сетке для просмотра заданных значений k (где-то между 1 и 6). Этот диапазон был выбран для достижения цели иметь как можно меньше функций, чтобы упростить процесс диагностики сердечных заболеваний. Увеличение значения диапазона k не привело к существенному различию результатов по классификаторам, следовательно, 6 было максимальным количеством признаков, заданных для поиска по сетке.

Используя конвейер и поиск по сетке, все четыре классификатора дали одинаковое количество признаков. Вот функции, которые были выбраны инструментом SelectKBest в соответствии с 6 лучшими показателями chi2 для 4 классификаторов:

Применяя этап предварительной обработки выбора признаков, значительно улучшилась общая точность KNN, а также отзыв и оценка f1. Произошло небольшое улучшение точности модели для Наивного Байеса, а также точности и F-показателя. Для логистической регрессии точность и полнота немного улучшились. Для классификатора «Дерево решений» снизилась общая точность, точность и показатель f1. Отзыв не изменился. Следовательно, мы можем сделать вывод, что наиболее эффективной моделью является KNN.

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

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

Ниже приведены правила ассоциации, найденные в WEKA, с настройкой достоверности в качестве типа метрики, 0,9 в качестве minMetric и 10 в качестве numRules:

Основываясь на правиле, согласно которому правая сторона имеет заболевание сердца, мы узнали, что некоторые атрибуты появлялись в различных комбинациях несколько раз, например, «талах» (максимальная частота сердечных сокращений), «са» (число сердечных сокращений). крупные сосуды, окрашенные при рентгеноскопии), «thal» (талассемия), «exang» (обозначение стенокардии, вызванной физической нагрузкой) и «возраст». Мы заметили, что «ca=0» и «thal=2» показаны во всех 9 правилах, касающихся сердечно-сосудистых заболеваний. Это, вероятно, из-за дисбаланса классов. Экземпляров, отвечающих этим двум условиям, значительно больше, чем других.

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

  1. Артериальное давление в покое выше 161,5 мм/рт.ст.
  2. Крупные сосуды не окрашиваются при рентгеноскопии.
  3. Талассемия – фиксированный дефект
  4. Уровень сахара в крови натощак составляет ‹= 120 мг/дл.
  5. Боль в груди после тренировки
  6. Возраст от 29 до 52 лет

Выводы

Ниже приводится сводка оценок точности для 4 классификаторов:

Глядя на общую сводку результатов точности, выбор признаков был лучшим этапом предварительной обработки для всех классификаторов, кроме дерева решений. Дерево решений показало хорошие результаты в тесте и после дискретизации показало такие же результаты. Однако выбор функций отрицательно сказался на производительности модели. Деревья решений могут быть чувствительны к небольшим изменениям в данных, что может ускорить или замедлить их работу. Сравнивая два этапа предварительной обработки с эталоном, мы можем сделать вывод, что на производительность KNN существенно влияет предварительная обработка, особенно дискретизация. Для Наивного Байеса и Логистической регрессии производительность была несколько постоянной на протяжении двух этапов предварительной обработки. Таким образом, мы можем сделать вывод, что классификатор K-ближайших соседей является наиболее эффективной моделью.

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

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

Заключение

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

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

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

Github: https://github.com/aasaleem20/Heart-Disease-Prediction/blob/main/Heart_Disease.ipynb