"Машинное обучение"

Прогнозирование сердечных заболеваний с помощью машинного обучения

I. Загрузите набор данных

II. Python — обработка

III. Python — применение алгоритма машинного обучения

IV. Анализ

I. Загрузка набора данных

Перейдите сюда, чтобы загрузить данные: Заболевания сердца UCI | Kaggle

II. Python — обработка

После того, как вы загрузили .csv, включите редактор Python. Импортируйте pandas и добавьте CSV-файл в качестве фрейма данных, используя этот фрагмент кода:

import pandas as pd
dfstack=pd.read_csv(r'C:\Users\...\HeartDiseaseTrain-Test.csv')

Давайте посмотрим на столбцы:

print(dfstack.columns)

Это даст вам следующее, когда вы запустите эту строку:

Index(['возраст', 'пол', 'тип_боли в груди', 'кровяное_давление в покое',
'холестеральный', 'сахар_крови натощак', 'экг_покоя', 'Макс_частота сердечных сокращений',
'стенокардия_индуцированная_упражнением', 'oldpeak' , 'slope',
'vessels_colored_by_flourosopy', 'thalassemia', 'target'],
dtype='object')

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

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

df_stack = pd.get_dummies(dfstack, prefix_sep=’_’)

Функция get_dummies идентифицирует категориальные столбцы и преобразует их в числовые данные. Чтобы проиллюстрировать это, вот имена столбцов во фрейме данных, который мы только что создали df_stack после использования get_dummies:

Index(['возраст', 'кровяное_давление в покое', 'холестеральный', 'Максимальная_частота сердечных сокращений',
'oldpeak', 'цель', 'пол_женщина', 'пол_мужчина',
'тип_боли в груди_бессимптомный', 'тип_боли в груди_атипичная стенокардия ',
'тип_боли_в груди_неангинозная боль', 'тип_боли_в груди_типичная стенокардия',
'сахар_крови_натощак_больше 120 мг/мл',
'сахар_крови_натощак_ниже 120 мг/мл',
'остальное_экг_лево гипертрофия желудочков», «ЭКГ_отдыха_в норме»,
«аномалия зубца ST-T в покое», «стенокардия_индуцированная_нагрузкой_Нет»,
«стенокардия_индуцированная_нагрузкой_да», «наклонная_нисходящая», «наклонная_плоская»,
«наклонная_наклонная», 'сосуды_окрашенная_по_ флюоросопия_Четыре ',
'vessels_colored_by_flourosopy_One',
'vessels_colored_by_flourosopy_Three',
'vessels_colored_by_flourosopy_Two',
'vessels_colored_by_flourosopy_Zero', 'thalassemia_Fixed Defect',
'thalassemia _Нет', 'талассемия_Норма' ,
'талассемия_Обратимый дефект'],
dtype='object')

Вы заметите, что категориальные столбцы разбиваются на количество уникальных вариантов выбора в них. Например, столбец пола теперь называется sex_Male, а другой столбец называется sex_Female. Вместо слов «мужской» или «женский», как в исходной колонке, новость будет выглядеть так:

Как вы можете видеть, когда пол — «Мужской», в этой строке столбца «sex_Male» стоит 1, а в столбце «sex_Female» — 0. Это переключается, когда пол женский.

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

Мы можем сделать это с помощью приведенного ниже кода:

X = df_stack.drop('target', axis=1)
y = df_stack['target']

Как мы видим, мы удаляем «целевой» столбец и назначаем остальную часть фрейма данных X. Затем мы назначаем только «целевой» столбец y.

Затем давайте импортируем необходимый пакет для создания разделения тестового поезда:

from sklearn.model_selection import train_test_split

Вот стандартный код для создания разделения:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30)

Далее мы выполним масштабирование функций с помощью стандартного масштабера из sklearn. Вот стандартный код для этого:

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

III. Python — применение алгоритма машинного обучения

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

from sklearn.svm import SVC
svclassifier = SVC()
svclassifier.fit(X_train, y_train)

Как видите, мы подгоняем наш алгоритм классификатора svc к тренировочному набору.

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

y_pred = svclassifier.predict(X_test)

Это предсказывает метки X_test.

IV. Анализ

Чтобы понять, как работает наш алгоритм, нам нужно распечатать матрицу путаницы и другие метрики:

from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test,y_pred))
print(classification_report(y_test,y_pred))

Когда вы запустите всю программу, вы получите вывод:

В sklearn прогнозируемые метки находятся вверху, а фактические — слева:

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

Сначала посчитаем точность:

Accuracy → Correctly predicted / overall 
Correctly predicted is this --> 141 + 152 = 293
Overall is this --> 141+152+9+6 = 308
Therefore, the overall accuracy will be: 
293/308 = 95.13%

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

Первая такая метрика – чувствительность, а вторая – специфичность.

Вот формула чувствительности:

Чувствительность = количество истинных положительных результатов / (количество истинных положительных результатов + количество ложноотрицательных результатов)

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

Знаменатель формулы представляет собой сумму истинно положительных и ложноотрицательных результатов. Давайте рассмотрим каждый из этих терминов.

Истинный положительный результат означает, что у человека было диагностировано заболевание (т. е. положительный диагноз), когда у него было заболевание, т. е. был поставлен правильный положительный диагноз.

Ложноотрицательныйозначает, что у человека было диагностировано НЕ заболевание (т. е. отрицательный диагноз), НО у него было заболевание.

Поэтому, если вы добавите ИСТИННО ПОЛОЖИТЕЛЬНОЕ И ЛОЖНООТРИЦАТЕЛЬНОЕ, вы получите общее количество больных людей в матрице путаницы.

Sensitivity = number of true positives / (number of true positives + number of false negatives)
Sensitivity = 152/(6+152) --> 96.2%

Таким образом, теперь мы знаем, что в 96,2% случаев алгоритм мог правильно предсказать, что у человека было заболевание, когда оно действительно было у него.

Теперь давайте посмотрим на специфику:

Специфика = количество истинно отрицательных результатов / (количество истинно отрицательных результатов + количество ложноположительных результатов)

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

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

Specificity =  number of true negatives / (number of true negatives + number of false positives)
Specificity = 141/(141+9) --> 94%

Таким образом, теперь мы знаем, что в 94% случаев алгоритм мог правильно предсказать, что у человека НЕ ​​было болезни, хотя на самом деле ее не было.

Спасибо за прочтение.

Ссылки на некоторые другие работы: