Искусственный интеллект (ИИ) постепенно захватывает многие отрасли и автоматизирует задачи с высокой эффективностью и точностью. Машинное обучение — это приложение ИИ, в котором системы учатся на данных и совершенствуются без явного программирования. Одним из приложений машинного обучения в области медицины является прогнозирование диагноза различных заболеваний и состояний.
Важно иметь модель с высокой точностью, поскольку прогнозы связаны со здоровьем людей, поэтому необходимо протестировать разные модели и посмотреть, какая из них дает лучший результат.
Я собираюсь изучить две модели машинного обучения, логистическую регрессию и 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