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

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

Я собираюсь изучить две модели машинного обучения, логистическую регрессию и K ближайших соседей, и применить их для прогнозирования диагноза наличия сердечно-сосудистых заболеваний у людей. Набор данных, который я буду использовать, получен от UCI, и его можно найти на kaggle (ссылка внизу этой статьи).

Я буду использовать Jupyter Notebook в качестве среды, Python3 в качестве языка программирования, Seaborn и matplotlib для визуализации данных и библиотеку SKLearn для моделей и показателей машинного обучения.

Давайте сначала импортируем библиотеки:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LogisticRegression

Давайте импортируем данные и визуализируем строку и столбцы, а также количество различных меток:

Столбец с названием «цель» будет включать наши метки (0 для отсутствия сердечно-сосудистых заболеваний и 1 для сердечно-сосудистых заболеваний), а остальные столбцы будут использоваться для нашего набора обучающих данных. Перед подачей столбцов в качестве обучающих признаков нам нужно убедиться, что они не сильно коррелированы, чтобы мы могли поддерживать точность.

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

#see if features are correlated
plt.figure(figsize = (20,20))
matrix = np.triu(df.corr())
sns.heatmap(df.corr(),annot=True,mask=matrix)

Теперь нам нужно разделить наш набор данных на наборы для тестирования и обучения, мы можем использовать sklearn для ускорения этой задачи. После разделения данных мы собираемся масштабировать их, чтобы значения, которые не находятся в одном масштабе, не вызывали просчетов:

from sklearn.model_selection import train_test_split
from sklearn import preprocessing
#split data into training and testing sets
target  = df['target']
x = df.drop(columns=['target'])
y = target
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=0)
#preprocess and scale
scaler = preprocessing.StandardScaler()
X_train = pd.DataFrame(scaler.fit_transform(X_train))
X_test=pd.DataFrame(scaler.transform(X_test))

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

#instantiate model and train
logreg = LogisticRegression()
# fit model
logreg.fit(X_train, y_train)
#use model to make predictions on test set
predictions = logreg.predict(X_test)

Теперь, когда мы сделали прогнозы, мы можем сравнить наши метки в y_test и прогнозы, чтобы оценить нашу модель. SKLearn имеет предварительно созданную матрицу путаницы, которая выводит значения для: True Positive (TP), False Positive (FP), True Negative ( TN) и ложноотрицательный результат (FN). Вот код для добавления матрицы путаницы:

from sklearn import metrics
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test,predictions))

Затем из матрицы мы можем рассчитать точность:

точность = (TP+TN)/(TP+TN+FP+FN)

Для этой модели точность составляет 82,9%.

Теперь давайте воспользуемся K ближайшим соседом, чтобы посмотреть, сможем ли мы повысить точность.

K Ближайший сосед (Knn) — это модель, которая может выполнять как классификацию, так и регрессию (прогнозирование на основе непрерывных значений). В этом случае мы используем Knn в качестве классификатора. Модель прогнозирует, просто оценивая ближайшие точки данных. Например, если мы используем 7 ближайших соседей, 3 из которых имеют метку «0», а остальные 4 — «1», новый прогноз будет «1». Значение «k» — это количество ближайших соседей, которые мы собираемся использовать для предсказания. Найти оптимальное значение «k» непросто, поэтому мы будем использовать разные значения и посмотрим, какое из них работает лучше всего:

from sklearn.neighbors import KNeighborsClassifier
# try ro find best k value
k_scores = []
#train with different values of k
for i in range(1,20):
    knn = KNeighborsClassifier(n_neighbors = i)
    knn.fit(X_train, y_train)
    k_scores.append(knn.score(X_test, y_test))
    
plt.plot(range(1,20), k_scores)
plt.show()

Как мы видим на визуализации, когда значение «k» близко к 7, точность достигает пика выше 86%, поэтому давайте используем 7 в качестве наших ближайших соседей «k».

#instantia knn model based on k value with highest k_score and train
knn = KNeighborsClassifier(n_neighbors = 7) 
knn.fit(X_train, y_train)
#make metrics report
from sklearn.metrics import classification_report
predictions = knn.predict(X_test)
report = classification_report(predictions,y_test)
print(report)

Метрика для knn:

Источники:

Блокнот Jupyter → https://github.com/noirvin/Machine-Learning/blob/master/Final%20Project.ipynb

Набор данных UCI → https://www.kaggle.com/ronitf/heart-disease-uci