Считайте до 40 секунд. За эти 40 секунд у кого-то случился сердечный приступ.

Сердечно-сосудистые заболевания - основная причина смерти во всем мире. Это настолько распространено, что если вы испытываете небольшую боль в груди, скорее всего, вы обнаружите, что в следующую секунду погуглите, является ли это симптомом сердечного приступа. Я не виню вас в том, что вы пришли к такому выводу, учитывая, что 17,9 миллиона человек умирают от сердечно-сосудистых заболеваний в год. Однако что, если мы сможем исправить это число? Чтобы ответить на этот вопрос, давайте посмотрим, как в настоящее время диагностируют сердечно-сосудистые заболевания.

В настоящее время сердечно-сосудистые заболевания выявляются с помощью многих методов, таких как анализ крови, рентген, электрокардиограмма и эхокардиограмма. Однако оборудование, необходимое для этих методов, стоит больнице больших денег - в частности, США тратят примерно 39,2 миллиарда долларов на закупку оборудования, необходимого для диагностики сердечных заболеваний.

Основная проблема нынешнего способа диагностики CSV заключается в том, что большая часть денег, которые больница тратит на оборудование, уходит насмарку. Более 50% этих тестов используются на пациентах, которые фактически не страдают никакими ССЗ.

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

Вернемся к нашему первоначальному вопросу: как уменьшить число 17,9 миллиона? Быстрый, эффективный и надежный способ исправить это: машинное обучение.

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

Шаг 1. Сбор данных

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

Атрибуты включают:

  1. Возраст
  2. Секс
  3. Тип боли в груди
  4. Trestbps (артериальное давление в состоянии покоя)
  5. Уровень холестерина
  6. Уровень сахара в крови натощак
  7. Результаты электрокардиографии в покое
  8. Максимальная частота сердечных сокращений (по результатам теста на уровень стресса во время диагностики)
  9. Упражнение (1 = да, 0 = нет)
  10. Уровень депрессии
  11. Наклон клетки крови
  12. Количество судов
  13. Цель (1 = есть сердечно-сосудистые заболевания, 0 = нет сердечно-сосудистых заболеваний)

Шаг 2: исследование данных

На этом этапе мы исследуем, из чего именно состоят наши данные, и очищаем их. Для начала я открыл IDE - в данном случае я использовал облачную среду Jupyter Notebook от Google Colab, которая позволяет мне обучать модель машинного обучения.

Я начал с импорта необходимых библиотек и пакетов, необходимых для построения модели.

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

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

from google.colab import files
uploaded = files.upload()
df = pd.read_csv('heart.csv)
df.tail(7)

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

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

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

df.shape
df.isna().sum()

Шаг 3: Визуализация данных

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

Целевой столбец состоит из единиц и нулей.

  • 1 означает, что у пациента диагностировано сердечно-сосудистое заболевание.
  • 0 означает, что у пациента не диагностировано сердечно-сосудистое заболевание.
df['target'].value_counts()
sns.countplot(df['target'])

Выход:

Дальнейшая визуализация данных:

Я также хотел посмотреть, как целевое значение меняется в зависимости от возраста:

fig_dims = (15, 10)
fig, ax = plt.subplots(figsize=fig_dims)
sns.countplot(x='age', hue='target',data=df,palette= 'Accent',ax=ax)

Шаг 4. Разделение данных

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

Случайное состояние также указывается при разделении данных, которое, по сути, отвечает за обеспечение того, чтобы одна и та же последовательность данных генерировалась каждый раз, когда вы компилируете свой код. Как видно из названия, случайным состоянием может быть любое число, 1,0,2435 - до тех пор, пока оно остается согласованным.

В этом случае мы собираемся разделить обучающие данные на 80%, а тестовые данные - на 20%.

from sklearn.model_selection import train_test_split
X = df.iloc[:,:-1].values 
Y = df.iloc[:,-1].values
X_train, X_test, Y_train, Y_test = train_test_split(X,Y, test_size = 0.20, random_state=1)

Шаг 5: масштабирование функций

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

Я использовал способ нормализации масштабирования функций, показанный через:

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

Шаг 6: Выберите модель

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

from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier(n_estimators = 10, criterion = 'entropy', random_state=1)
forest.fit(X_train, Y_train)
model = forest
model.score(X_train, Y_train)

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

Матрица неточностей

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

  • Истинные положительные результаты (TP): случаи, в которых прогнозная ценность верна - у них действительно есть сердечно-сосудистые заболевания (обозначено цифрой 1), и фактическое значение также истинно - у них действительно есть сердечно-сосудистые заболевания.
  • Истинно-отрицательные (TN): случаи, когда прогнозируемое значение неверно - у них нет сердечно-сосудистых заболеваний, и фактическое значение также ложно - у них нет сердечно-сосудистых заболеваний.
  • Ложные срабатывания (FP): случаи, когда прогнозируемое значение истинно - у них есть сердечно-сосудистые заболевания, но фактическое значение неверно - сердечно-сосудистые заболевания отсутствуют.
  • Ложноотрицательные (FN): случаи, когда прогнозируемое значение ложно - у них нет сердечно-сосудистых заболеваний, но фактическое значение соответствует действительности - у них есть сердечно-сосудистые заболевания.

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(Y_test,model.predict(X_test))
TN = cm[0][0]
TP = cm[1][1]
FN = cm[1][0]
FP = cm[0][1]
#Print the confusion matrix
print(cm)
print ('Model Test Accuracy = {}'.format((TP+TN)/(TP+TN+FN+FP)))

Как видно выше, с помощью классификатора случайного леса мы можем обнаруживать сердечно-сосудистые заболевания с точностью 90,3%! Это приличная точность, однако, поскольку эта модель касается жизни пациентов, ее необходимо улучшить, чтобы достичь точности 100%!

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

На этом мы закончили беглый просмотр кода, который я использовал для обнаружения сердечно-сосудистых заболеваний у пациентов. Давайте еще раз вернемся к нашему первоначальному вопросу. В настоящее время 17,9 миллиона человек умирают от сердечно-сосудистых заболеваний в год. Как уменьшить это число? Что ж, используя эту модель для раннего выявления ССЗ, мы можем спасти примерно 161 637 000 жизней. Сочетание здравоохранения и машинного обучения действительно имеет большой потенциал, и я не могу дождаться, чтобы поэкспериментировать с другими моделями, чтобы улучшить наши текущие проблемы со здоровьем!

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

🗓 Подпишитесь на мою ежемесячную рассылку новостей

💻 Ссылка на код

🔗 Linkedin

✉️. Почта: [email protected]