«Некоторые вещи настолько неожиданны, что никто не готов к ним. «— Лео Ростен в Рим не сгорел за один день

По данным Всемирной организации здравоохранения, сердечно-сосудистые заболевания (ССЗ) являются основной причиной смерти во всем мире, унося примерно 17,9 миллиона жизней ежегодно. ССЗ представляют собой группу заболеваний сердца и сосудов и включают ишемическую болезнь сердца, цереброваскулярные заболевания, ревматические заболевания сердца и другие состояния. Более четырех из пяти смертей от ССЗ связаны с сердечными приступами и инсультами, и одна треть этих смертей возникают преждевременно у лиц моложе 70 лет.

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

  1. Набор данных

Набор данных, который будет использоваться в этой статье, будет взят с kaggle. Ссылка на набор данных — https://www.kaggle.com/datasets/johnsmith88/heart-disease-dataset

Нажмите на ссылку и загрузите набор данных о сердечных заболеваниях.

2. Google Colab

Перейдите на новую вкладку в браузере, введите «Google colab» и создайте «Новый блокнот».

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

3. Импорт библиотек

Следующие библиотеки импортированы для использования в нашем проекте: numpy, pandas и из sklearn мы будем импортировать логистическую регрессию, разделение тестов обучения и оценку точности. Код приведен ниже

import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

4. Чтение набора данных

Загруженный набор данных читается с помощью панд со следующими кодами

#reading the csv file in the pandas dataframe
hdata=pd.read_csv('/content/heart_disease_data.csv')

5. Печать набора данных

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

#Printing the first 5 rows of the dataset
hdata.head()

Столбцы «target» — это метка, где значение 0 указывает на нормальное сердце, а 1 — на больное сердце.

В наборе данных есть 13 признаков, таких как возраст, пол, cp, trestbps, chol, fbs, restecg, thalach, exang, oldpeak, наклон, ca и thal.

Информация об атрибутах представлена ​​ниже

Точно так же давайте рассмотрим последние пять строк набора данных. Код для просмотра последних пяти строк приведен ниже.

#Printing the last 5 rows of the dataset
hdata.tail()

Поиск формы набора данных

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

#Finding the shape of the dataset
hdata.shape

На выходе получается 303 строки или выборки и 14 столбцов или переменных.

6. Информация о наборе данных

Давайте углубимся, чтобы найти информацию о наборах данных. Это достигается следующим кодом

#Getting Information of the dataset
hdata.info()

Приведенный выше вывод можно интерпретировать как:

  • Есть 303 строки, которые проиндексированы от 0 до 302.
  • Всего 14 столбцов данных.
  • Все функции не равны нулю, что означает, что в наборе данных нет «отсутствующих значений».
  • Предоставляются типы данных функций. Здесь 13 столбцов относятся к типам данных int64, а 1 столбец — к типам данных float64.
  • Также предоставляется информация об использовании памяти.

Существует альтернативный способ проверки пропущенного значения. Код предоставлен ниже

#Checking the missing values
hdata.isnull().sum()

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

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

#statistical information about the dataset
hdata.describe()

На выходе отображается статистическая информация, такая как количество, среднее значение, стандартное отклонение, минимальное значение, квартиль-1,2,3 и максимальные значения всех функций набора данных. Эта информация дает хорошее представление о наборе данных.

Пример. Приведенный выше вывод показывает, что минимальный возраст составляет 29 лет, а максимальное значение — 77 лет. Мы также можем сделать вывод, что 50% данных имеют возраст менее 55 лет. Средний возраст составляет 54,36 года, а также разброс данных можно увидеть из приведенного выше вывода.

7. Проверка распределения классов

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

#checking the distribution of the Target variable
hdata['target'].value_counts()

Выходные данные показывают, что имеется 165 образцов с больным сердцем и 138 образцов с нормальным сердцем.

8. Разделение набора данных на объекты и метки

Набор данных разделен на X и Y, где X содержит все данные объектов, а Y содержит данные метки класса.

X=hdata.drop(columns='target',axis=1)
Y=hdata['target']

В приведенном выше коде:

  • X содержит все функции, кроме столбца «цель», поскольку он удаляется с помощью drop(), а ось = 1 указывает на столбец.
  • y назначается столбец «цель».

Давайте посмотрим значения X и y

X

y

9. Разделение X и Y в наборе данных для обучения и тестирования

Данные X и y разбиваются на X_train, X_test, Y_train и Y_test с помощью функции train_test_split(). Здесь мы считаем, что 80% набора данных будет предназначено для обучения, а 20% набора данных будет для тестирования, которое установлено как test_size = 0,2.

X_train,X_test,Y_train,Y_test=train_test_split(X,Y, test_size=0.2,stratify=Y,random_state=2)

Форма данных обучения и тестирования отображается следующим образом.

print(X_train.shape,X_test.shape)

Итак, для обучения используется 242 образца, а для тестирования — 61 образец.

10. Обучение модели с использованием логистической регрессии

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

model=LogisticRegression()
model.fit(X_train,Y_train)

11. Прогноз модели

Сейчас время тестирования модели. Это означает, что он должен показать свой калибр в прогнозировании, для которого он разработан. Здесь функция model.predict() используется для выполнения прогноза. Код приведен ниже

y_predict=model.predict(X_test)

12. Оценка модели — точность

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

accuracy=accuracy_score(Y_test,y_predict)
accuracy

Результат показывает точность 81,96%, что довольно хорошо. Все, что выше 75%, считается хорошей моделью.

Примечание. Один из дружеских советов — попрактиковаться в коде, представленном в этой статье.

Создание системы прогнозирования

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

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

inputData=(75,0,2,145,233,1,0,150,0,2.3,0,0,1)
input_array_data=np.asarray(inputData)
input_data_reshaped=input_array_data.reshape(1,-1)

prediction=model.predict(input_data_reshaped)

if (prediction[0]==1):
  print('The Person has a Heart Disease')
else:
  print('The Person does not have Heart Disease')
The Person has a Heart Disease

Берутся данные inputData=(75,0,2,145,233,1,0,150,0,2.3,0,0,1), что является значением 13 признаков, и модель предсказывает, что «У человека есть Заболевание сердца».

Вы можете предоставить свои собственные данные в inputData и проверить, что предсказывает модель.

Подпишитесь на меня, чтобы узнать больше о таких статьях о машинном обучении и глубоком обучении.