"Машинное обучение"
Прогнозирование сердечных заболеваний с помощью машинного обучения
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% случаев алгоритм мог правильно предсказать, что у человека НЕ было болезни, хотя на самом деле ее не было.
Спасибо за прочтение.
Ссылки на некоторые другие работы: