«Некоторые вещи настолько неожиданны, что никто не готов к ним. «— Лео Ростен в Рим не сгорел за один день
По данным Всемирной организации здравоохранения, сердечно-сосудистые заболевания (ССЗ) являются основной причиной смерти во всем мире, унося примерно 17,9 миллиона жизней ежегодно. ССЗ представляют собой группу заболеваний сердца и сосудов и включают ишемическую болезнь сердца, цереброваскулярные заболевания, ревматические заболевания сердца и другие состояния. Более четырех из пяти смертей от ССЗ связаны с сердечными приступами и инсультами, и одна треть этих смертей возникают преждевременно у лиц моложе 70 лет.
Вышеупомянутая глобальная чрезвычайная ситуация является мотивом этой статьи для прогнозирования сердечных заболеваний с использованием логистической регрессии в пошаговом подходе.
- Набор данных
Набор данных, который будет использоваться в этой статье, будет взят с 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 и проверить, что предсказывает модель.
Подпишитесь на меня, чтобы узнать больше о таких статьях о машинном обучении и глубоком обучении.